我们有一个网站,其中的页面需要不时更新。该网站随时大约有 8 个 EC2 实例在运行,但偶尔会变得更大。我们使用负载平衡器和自动缩放来创建更多实例。页面只是磁盘上的普通文件;没有内容管理系统。Web 服务器是 Jetty。
如果我修改了一个页面,如何将其部署到所有当前页面以及未来实例?
显然,我不能使用 Fabric 之类的管理工具,因为它不会更新未来实例所基于的 AMI。创建新 AMI 并进行部署也是一个错误,因为首先,这是一个繁琐的过程,其次,它会终止现有实例上的所有当前用户会话。
我认为实例需要从某处提取网站的页面,并时不时地检查更新。
我考虑过将页面放在 S3 上,但是这不可行,因为 1) S3 无法在页面更改时通知实例,2) 因此您必须不断轮询 S3,3) 这很昂贵,并且 4) 您必须对每个页面单独执行此操作。
最简单的方法是什么?如果最好 != 简单,那么最好的方法是什么?
答案1
我认为有以下几种选择:
- 使用 S3;我知道您表示这是不可能的,但新服务器必须从某个地方获取代码。假设您的部署已编写脚本以部署到正在运行的实例,请添加一行以推送到 S3。这也可以使用 man 源代码控制工具自动完成。
- 创建一个主服务器,所有其他服务器都可以通过 ssh 轮询代码。
- 从 github 等代码托管服务中拉取
答案2
您可以通过在自动缩放中使用一些克隆后步骤来实现这一点。具体方法取决于您的舒适度,但这样的解决方案可能会为您带来很多帮助:
- 在类似 git 的程序中构建您的 web 目录。
- 在 AMI 中,构建一个 cron 任务来按照计划从 repo 服务器进行 git-pull。
- 在 AMI 中,构建 git-pull 作为启动任务的一部分。
这是一种批处理模式。现有服务器不会收到新文件的通知,但由于 cron 执行时间,它们都会在大约同一时间收到通知。新服务器将在启动时收到新文件。
这里的关键是将您的内容与 AMI 本身分离。