我在 AWS 中使用自定义 Debian9 映像触发了一个自动扩展组(来自启动配置),其中我已预安装了 Apache、Memcache、Chrony 等软件包以及 PHP 代码库和其他所需包。在我更改 PHP 代码库之前,这一直运行良好。每天至少在服务器上手动修改一次 PHP 代码库。
每当基于预定义指标(如内存负载、CPU 等)触发自动扩展时,我都想启动另一台服务器。这台新创建的服务器必须具有更新的代码库,以便两台服务器保持同步。
问题:当第二台服务器启动并运行时,如何才能实现这一点,而不仅仅是将文件从一台服务器复制到另一台服务器?
一种方法是使用 rsync 将文件从旧服务器复制到新创建的服务器。我认为这不是最好的解决方案。每小时拍摄快照不是一个选择,因为它会增加运营成本。
每当 php 代码库更改时,更新自定义图像的最佳方法是什么?有人可以建议/推荐我最好的方法吗?我相信在这个社区中有一些专家在 AWS 中做过类似的事情。
答案1
如果您的代码在存储库中,那么直接从存储库获取代码是有意义的。与将代码放在 S3 上相比,这种方法有优势:您只会提取自创建 AMI 以来的更改,而不是项目的整个目录。更快、更便宜。
答案2
将您的 PHP 代码放在 Amazon S3 上。停止手动更新 EC2 实例。
当您的 EC2 实例启动时,让它从 S3 下载 PHP 代码。这样,所有新启动的 EC2 实例都将具有更新的代码。
更新 PHP 代码时:
- 在 S3 中更新 PHP 代码,
- 启动一个新的 EC2 实例(它将获取新代码),
- 删除旧的 EC2 实例。
另一种选择是使用 Elastic Beanstalk 作为您的 PHP 应用程序,而不是自己管理 EC2 实例。
答案3
有多种方法可以实现此目的:
- 将所有代码放在 EFS 上,并将其安装到您的服务器上(最简单,但如果您使用包含大量模块的大型/复杂应用程序,性能可能会受到影响 - 您可以使用 php 的 opcache 来缓解这种情况)。
- 每次发布时将您的代码嵌入到新的 AMI 中
- 在启动时执行 git pull
- 设置 codebuild 以构建代码并上传到 S3,然后使用 CodePipeline 将其部署到您的 EC2 实例。您可以自动执行此操作以在每次 GitHub 推送时自动运行(这里有一个我写过一篇关于使用 Codebuild 和 PHP 的文章)
- 使用 docker 和 ECS 而不是 EC2(尤其是新的 ECS Fargate,它可以让您完全放弃 EC2 实例)
如果你的应用使用会话,你需要在实例之间共享它们 - 根据我们的经验,最好的方法是使用DynamoDB