如何跨各种 Amazon EC2 实例运行我的应用程序代码 (PHP)?

Posted

技术标签:

【中文标题】如何跨各种 Amazon EC2 实例运行我的应用程序代码 (PHP)?【英文标题】:How do I run my application code (PHP) across my various Amazon EC2 instances? 【发布时间】:2011-08-06 05:22:42 【问题描述】:

我一直在尝试为客户掌握亚马逊的 AWS 服务。正如我要问的非常愚蠢的问题所证明的那样,我在理解一些非常基本的事情时遇到了一些麻烦:

a) 我玩过几个实例并设法让 LAMP 工作得很好,我遇到的问题是我放在 /var/www 中的代码似乎没有在这些机器之间共享。我必须做什么才能实现这一目标?我在考虑共享 EBS 卷并更改 Apaches 文档根目录?

b) 此外,将代码和资产上传到 EBS/S3 卷的最佳方式是什么?我应该设置一个实例来处理上述共享卷的 FTP 吗?

c) 最后,我有一个基本的设置计划,我想由真正知道他们在说什么的人来运行:

DNS 指向负载均衡器 (AWS Elastic Beanstalk) 负载均衡器管理多个 AWS EC2 实例。 EC2 实例共享来自单个 EBS 存储的代码。 处理数据库查询的 RDS 实例。 Cloud Front 直接向用户提供资产。

谢谢, 丰富。

编辑:我的解决方案适用于在 google 上遇到此问题的任何人。

请注意,我的设置尚未完成,我在此说明中提供的 bash 脚本可能不是很好,因为即使我对命令行非常熟悉,但我没有使用 bash 编写脚本的经验。但是,它至少应该向您展示我的设置在理论上是如何工作的。

所有 AMI 都是 Alestic 的 Ubuntu Maverick i386。

我有两个 AMI 快照:

大师 用户 git - 运行 git-shell 的访问权限非常有限,因此无法通过 SSH 访问,但托管了一个 git 存储库,该存储库可以推入或拉出。 ubuntu - 默认 SSH 帐户,用于管理服务器和部署代码。 服务 通过 ssh 托管简单的 git 存储库。 Apache 和 php,数据库托管在 Amazon RDS 上 奴隶 服务 Apache 和 PHP,数据库托管在 Amazon RDS 上

现在(这将改变)这是将代码部署到我的服务器的方式:

    将更改合并到本地计算机上的 master 分支。 停止所有从属实例。 使用 Git 将主分支推送到主服务器。 在主服务器上通过 SSH 登录 ubuntu 用户并运行执行以下操作的脚本:
      将(git-archive)代码从本地存储库导出到文件夹。 压缩文件夹并将代码备份上传到 S3,并在文件名中附加时间戳。 将 /var/www/ 中的代码替换为文件夹并授予适当的权限。 从主目录中删除导出的文件夹,但保留包含最新代码的完整压缩文件。 5 启动所有从属实例。在启动时,它们会运行一个脚本: Apache 在被触发之前不会启动。 使用 scp(安全复制)将最新的压缩代码从 master 复制到 /tmp/www 提取代码并替换 /var/www/ 并授予适当的权限。 启动 Apache。

我会提供代码示例,但它们非常不完整,我需要更多时间。我还想让我的所有资产(css/js/img)自动推送到 s3,以便它们可以通过 CloudFront 分发给客户。

【问题讨论】:

[AWS FAQ: You can't share EBS ](aws.amazon.com/ec2/faqs/…) 我认为您需要通过 NFS 或其他操作系统级别的方法共享您的代码。 我还听说过使用 CloudWatch/AutoScaling 将终止的实例替换为您的“主”AMI 副本。换句话说,您可以更新 Auto Scale 关闭的 AMI,然后终止池中的所有实例,直到它们全部被最新代码替换(通过 Auto Scale)。 您也可以使用亚马逊弹性文件系统aws.amazon.com/efs 【参考方案1】:

EBS 就像一个可以附加到一个实例的硬盘驱动器,基本上是 1:1 映射。 S3 是 AWS 中唯一的共享存储,否则您将需要设置 NFS 服务器或类似服务器。

您可以做的是将所有 php 文件放在 s3 上,然后在启动时将它们同步到一个新实例。

我建议将自定义 AMI 与您需要安装的所有内容(apache、php 等)捆绑在一起,并设置一个 cron 作业以将 php 文件从 s3 同步到您的文档根目录。您的工作流程是,将文件上传到 s3,让服务器 cron 同步文件。

你的其余设置看起来很标准。

【讨论】:

你参加聚会有点晚了,但还是谢谢你。请参阅我的问题,了解我最终是如何做到的。

以上是关于如何跨各种 Amazon EC2 实例运行我的应用程序代码 (PHP)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Amazon Auto-scaling 组中的多个 ec2 实例上部署和更新应用程序?

创建新实例时如何保护来自 Amazon EC2 实例的数据?

如何转换 Amazon EC2 实例以用于 Auto Scaling?

如何在 Amazon EC2 上使用 Gunicorn 设置 Nginx 代理缓冲?

实际上,如何设置 Amazon AWS 以使其自动扩展?

最佳实践:单个 Amazon EC2 实例上的多个 django 应用程序