将内容部署到多个服务器(EC2)


Deploy Content to Multiple Servers (EC2)

我一直在开发一个基于云的(AWS EC2) PHP Web应用程序,当涉及到使用多台服务器(都在AWS弹性负载均衡器下)时,我遇到了一个问题。在一台服务器上,当我上传最新的文件时,它们立即在整个应用程序中投入生产。但在使用多台服务器时就不是这样了——每次提交更改时,都必须向每台服务器上传文件。如果你不经常更新任何东西,或者如果你只有一两个服务器,这可以正常工作。但是,如果您在一周内跨10台服务器多次更新系统呢?

我正在寻找的是一种从我们的开发或测试服务器"提交"更改的方法,并立即将其"推出"到我们所有的生产服务器。理想情况下,更新一次只应用于一台服务器(即使每台服务器只需要一两秒钟),这样ELB就不会在文件更改时向其发送流量,以免中断可能流向ELB的任何生产流量。最好的方法是什么?我的一个想法是在开发服务器上使用SVN,但这并没有真正"推送"到服务器。我正在寻找一个进程,只需几秒钟提交更新,随后开始将其应用到服务器。另外,对于熟悉AWS的人来说,使用最新更新更新AMI的最佳方法是什么,以便自动扩展器总是使用最新版本的软件启动新实例?

必须有好的方法来做这件事....我无法想象像Facebook, Google, Apple, Amazon, Twitter等网站在进行更改时要手动更新数百或数千台服务器。

提前感谢你的帮助。我希望我们能找到解决这个问题的办法....在过去的一天里,我和我的商业伙伴在谷歌上搜索了至少100次,但在解决这个问题的大部分方面都没有成功。

亚历克斯

我们使用scalr.net来管理我们的web服务器和负载平衡器实例。直到现在,它都运行得很好。我们的每个环境都有一个服务器场(2个生产场、登台场、沙盒场)。我们为web服务器预先配置了角色,因此在需要时打开新实例和扩展非常容易。web服务器在启动时从github中提取代码。

我们还没有完成我们想要做的所有部署更改,但基本上我们是如何将新版本部署到生产环境中的:

    我们使用phing来更新每个web服务上的源代码和部署。我们创建了一个执行git pull并运行数据库更改的任务(dbdeploy phing task)。http://www.phing.info/trac/
  1. 我们编写了一个shell脚本来执行phing,并将其作为脚本添加到scalr中。Scalr有一个很好的界面来管理脚本。

    #!/bin/sh
    cd /var/www
    phing -f /var/www/build.xml -Denvironment=production deploy
    
  2. scalr有一个选项,在一个特定的农场的所有实例上执行脚本,所以每个版本我们只推到github的主分支并执行scalr脚本。

我们想创建一个github钩子,当我们推送到主分支时,它会自动部署。Scalr有可以执行脚本的api,所以这是可能的。

好好看看KwateeSDCM吧。它使您能够在任意数量的服务器上部署文件和软件,如果需要,还可以在此过程中定制特定于服务器的参数。有一篇关于在多个tomcat实例上部署web应用程序的文章,但它与语言无关,只要在AWS服务器上启用ssh,就可以在PHP上工作。