将PHP Web应用程序部署到Elastic Load Balancer后面的多个EC2实例

时间:2011-02-15 12:21:26

标签: php deployment amazon-ec2 load-balancing phing

我的问题基本上是两个问题,但由于它们密切相关,我认为让它们成为一个问题是有道理的。

案例:
我正在运行一个webapplication,它分布在AWS Elastic Load Balancer后面的多个AWS EC2实例上

预期目标:
a)在部署新的应用程序代码(php)时,它应自动分发到所有EC2实例 b)当添加新的EC2实例时,它们应该使用最新的appcode自动“引导”

到目前为止我的想法:
ad a)
phing(http://phing.info)可能就是这部分的答案。我可能会为每个EC2实例添加多个目标,并且在运行部署时,它将部署到所有计算机。可能不幸的是没有并行。但是,当以负载均衡器中的EC2实例“暂停”,再次升级,“取消暂停”并再次运行到下一个实例的方式编写脚本时,这可能甚至是有益的。

ad b)
不知道我将如何实现这一目标。在传统的“基于硬件的设置”中,我可能在网络存储设备上有一个“应用程序代码”卷,并且当添加新服务器时,我只需附加该卷。在部署新的appcode时,我只对该卷进行了一次部署操作。所以我需要一些“中央存储”,从新引导的机器/实例下载它的应用程序代码。我考虑过git,但毕竟git不是一个部署工具,可能不应该被强制用作一个。

我很高兴看到您完成此类任务的设置,并听取您对此类情况的提示和想法。

谢谢,

约书亚

4 个答案:

答案 0 :(得分:3)

这可以使用phing进行。但是,我不确定为什么要让新实例自动检索appcode?你经常得到额外的实例吗?为了让a)将代码部署到多个实例,它仍然需要知道它们吗?

此设置需要主部署服务器并使用推送策略。主服务器需要phing,任何所需的phing包,以及EC2实例的可选ssh密钥。

建议a)

(这只是所需的phing任务的概要)

  • 检索实例列表(配置文件或suuplied参数)
  • 将appcode从存储库导出到主服务器(例如SubVersion)
  • Tar appcode
  • scp tarball到所有EC2实例(到部署文件夹)
  • 使用rsh在EC2实例上解压缩tarball
  • 使用rsh更新EC2实例上的符号链接,以便webserver文件夹指向新的部署文件夹
  • 清除网络服务器上的所有缓存

在您发布新版本后,可以调用上述内容。

建议b) 这可以通过每隔几个小时运行phing脚本来实现,让它登录到EC2实例并检查appcode。如果找不到,它将部署最新的最终版本。 当然,这需要在Web服务器,配置文件等方面正确设置EC2实例(但是,这也可以通过远程shell通过phing实现)。

我以前使用过类似的设置,但没有尝试使用EC2等服务。

答案 1 :(得分:0)

a)看一下Capistrano,因为你没有使用Ruby(和RoR),所以使用railsless-deploy插件。 Capistrano可以部署到多个服务器。

b)没有任何经验,但如果没有Capistrano的插件/宝石可以为你做这件事,我不会感到惊讶。

答案 2 :(得分:0)

我认为phing是一个很好的工具。卡皮斯特拉诺也可以提供帮助。

我在非常相似的环境中部署我的应用程序。到目前为止,我一直在使用简单的bash scirpts,但我可能会转向基于phing的解决方案,主要是因为开发shell脚本有困难(你必须知道一个不是很灵活的新语法,而不是提到跨平台)和并行处理的可用性,这在phing中存在。

答案 3 :(得分:0)

Phing是管理部署任务的绝佳工具,几乎涵盖了(a)的大部分内容。

我们使用OpsCode Chef进行基础架构管理。它有一个deploy_revision目标,同时支持SVN和Git repos用于应用程序代码部署,而knife(主Chef命令行工具)有一个EC2插件,允许您通过一个命令启动新的EC2具有您在Chef中定义的任何角色和环境的实例,并部署您的应用程序代码。

为了使用ELB后面的多个EC2实例来管理它,我们使用Python boto库来编写连接到ELB的非常简单的脚本,获取附加到该ELB的所有实例的列表以及一个-one从ELB中删除实例,在该实例上运行Chef更新(部署新应用程序代码和任何计算机配置更改),将实例重新附加到ELB并转到下一个实例。