我一直在开发一个基于云的 (AWS EC2) PHP Web 应用程序,并且在使用多个服务器(都在 AWS 弹性负载均衡器下)时遇到一个问题。在一台服务器上,当我上传最新文件时,它们会立即在整个应用程序中投入生产。但这在使用多个服务器时并非如此——每次提交更改时,您都必须将文件上传到每个服务器。如果您不经常更新任何东西,或者如果您只有一两个服务器,这可能会正常工作。但是,如果您在一周内跨十台服务器多次更新系统怎么办?
我正在寻找的是一种从我们的开发或测试服务器“提交”更改并立即将其“推送”到我们所有生产服务器的方法。理想情况下,一次只将更新应用于一台服务器(即使每台服务器只需要一两秒),这样 ELB 就不会在文件更改时向它发送流量,以免中断可能正在运行的任何生产流量流向 ELB 。 这样做的最佳方法是什么?我的想法之一是在开发服务器上使用 SVN,但这并不能真正“推送”到服务器。我正在寻找一个只需几秒钟即可提交更新并随后开始将其应用到服务器的过程。此外,对于那些熟悉 AWS 的人来说,使用最新更新更新 AMI 的最佳方法是什么,以便自动缩放器始终使用最新版本的软件启动新实例?
必须有好的方法来做到这一点......无法真正想象像 Facebook、谷歌、苹果、亚马逊、推特等网站手动更新成百上千台服务器,当他们制作一个变化。
在此先感谢您的帮助。我希望我们能找到解决这个问题的办法……我和我的商业伙伴在过去一天至少进行了 100 次谷歌搜索,结果证明大部分都没有成功解决这个问题。
亚历克斯
最佳答案
我们使用 scalr.net 来管理我们的网络服务器和负载均衡器实例。到现在为止效果很好。我们的每个环境都有一个服务器场(2 个生产场、暂存场、沙箱)。我们为 Web 服务器预先配置了角色,因此在需要时打开新实例和扩展非常容易。 Web 服务器在启动时从 github 中提取代码。
我们还没有完成我们想要做的所有部署更改,但基本上这是我们将新版本部署到生产环境中的方式:
- 我们使用 phing 来更新每个网络服务的源代码和部署。我们创建了一个执行 git pull 和运行数据库更改的任务(dbdeploy phing 任务)。 http://www.phing.info/trac/
我们编写了一个执行 phing 的 shell 脚本,并将其作为脚本添加到 scalr。 Scalr 有一个很好的界面来管理脚本。
#!/bin/sh cd /var/www phing -f /var/www/build.xml -Denvironment=production deploy
scalr 可以选择在特定场中的所有实例上执行脚本,因此每次发布我们只需推送到 github 中的 master 分支并执行 scalr 脚本。
我们想创建一个 github 钩子(Hook),当我们推送到 master 分支时自动部署。 Scalr 有可以执行脚本的 api,所以这是可能的。
关于php - 将内容部署到多个服务器 (EC2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7701193/