Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在弹性负载平衡器后面将PHP webapp部署到多个EC2实例_Php_Deployment_Amazon Ec2_Load Balancing_Phing - Fatal编程技术网

在弹性负载平衡器后面将PHP webapp部署到多个EC2实例

在弹性负载平衡器后面将PHP webapp部署到多个EC2实例,php,deployment,amazon-ec2,load-balancing,phing,Php,Deployment,Amazon Ec2,Load Balancing,Phing,我的问题基本上是两个问题,但由于它们密切相关,我认为整体提问是有意义的 案例: 我正在运行一个webapplication,它分布在AWS弹性负载平衡器后面的多个AWS EC2实例上 预期目标: a) 部署新的应用程序代码(php)时,应自动将其分发到所有EC2实例。 b) 当添加新的EC2实例时,它们应该使用最新的应用程序代码自动“引导” 到目前为止我的想法: 广告a) 芬(http://phing.info)这可能是这一部分的答案。我可能会为每个EC2实例添加多个目标,并在运行部署时将其部署

我的问题基本上是两个问题,但由于它们密切相关,我认为整体提问是有意义的

案例:
我正在运行一个webapplication,它分布在AWS弹性负载平衡器后面的多个AWS EC2实例上

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

到目前为止我的想法:
广告a)
芬(http://phing.info)这可能是这一部分的答案。我可能会为每个EC2实例添加多个目标,并在运行部署时将其部署到所有机器。不幸的是,这可能不是平行的。但是,当EC2实例在负载平衡器中“暂停”、升级、“取消暂停”并继续到下一个实例时,这甚至可能是有益的

广告b)
我不知道如何才能做到这一点。在传统的“基于硬件的设置”中,我可能在网络存储设备上有一个“应用程序代码”卷,在添加新服务器时,我只需附加该卷。部署新appcode时,我只有一个对此卷的部署操作。因此,我需要一些“中央存储”,新启动的机器/实例从中下载其应用程序代码。我考虑过git,但毕竟git不是一个部署工具,可能不应该被强制作为一个工具使用

我很高兴看到你为这些任务所做的设置,并听到你对这种情况的提示和想法

谢谢

Joshua

a)看一看,既然你没有使用Ruby(和RoR),就使用这个插件吧。Capistrano可以部署到多个服务器


b) 我还没有这方面的经验,但如果没有一个Capistrano插件/gem可以为您提供这方面的帮助,我也不会感到惊讶。

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

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

对a)的建议

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

  • 检索实例列表(配置文件或重复参数)
  • 将应用程序代码从存储库导出到主服务器(例如SubVersion)
  • Tar应用程序代码
  • scp
    tarball到所有EC2实例(到部署文件夹)
  • 使用
    rsh
    EC2实例上的tarball解包
  • 使用
    rsh
    更新EC2实例上的符号链接,使Web服务器文件夹指向新的部署文件夹
  • 清除Web服务器上的所有缓存
在您发布新版本后,可以调用上面的内容

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


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

我相信phing是一个很好的工具。卡皮斯特拉诺也可能会有所帮助


我在一个非常相似的环境中部署我的应用程序。到目前为止,我一直在使用简单的bash scirpts,但我可能会转向基于phing的解决方案,主要是因为开发shell脚本(您必须知道一种不太灵活的新语法,更不用说跨平台了)和并行处理的可用性,phing是管理部署任务的一个很好的工具,它几乎涵盖了(a)的大部分内容

我们用于基础设施管理。它有一个deploy_修订版目标,同时支持SVN和Git repos用于应用程序代码部署,而knife(主要的Chef命令行工具)有一个EC2插件,允许您只需一个命令,就可以使用Chef中定义的任何角色和环境启动新的EC2实例,并部署应用程序代码


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

谢谢您的回复!我已经查看了Capistrano。让我有点困扰的是,它是基于Ruby的,我以前没有使用Ruby的经验。希望会有更多的回复,甚至可能来自已经解决此类任务的人。这可能对于许多运行可伸缩(或希望可伸缩)Web应用程序的人来说,这不是一个非常有趣的话题。我知道你来自哪里:-)。我曾经问过一个类似的问题,关于基于Lua或Perl的部署工具,因为我不懂任何Ruby,也懒得学习它。最后我给卡皮斯特拉诺打了一针,现在还在用。设置它可能需要一些时间,但它大大简化了部署。