我对 Amazon Web Services 还比较陌生,我正在尝试弄清楚 Elastic Load Balancing 如何在 WordPress 设置中工作。此外,我还想就拟议的基础设施寻求一些建议。
我最初提议的基础设施如下:
- 1x EC2 m1.small - Ubuntu 12.04.3 LTS 64 位(带 1 个 EBS 卷)
- 1x EC2 t1.micro - Ubuntu 12.04.3 LTD 64 位(有或没有 EBS 卷?)
- 1x 微型 RDS 实例 - MySQL 5.6.13
EC2 我当前的 EC2(t1.micro)正在运行 LAMP 堆栈并配置为运行 wordpress。
我想使用 m1.small 实例来实现负载平衡,运行 t1.micro 实例的克隆。
我目前未知的情况如下:
- 负载平衡设置如何管理跨实例对 wordpress CMS 所做的更改?每次在 wordpress 中发生更改时,我是否必须不断更新 AMI?
- 我的网站是电子商务网站。这对负载平衡设置有什么影响吗?即,订单有可能存在于一个实例上而不存在于另一个实例上吗?
这可能是一个非常愚蠢的问题,但我认为有些问题并不相关,因为基础设施引用了一个数据库。
最后,是否有更好的方法来设置负载平衡基础设施?即我是否应该考虑使用 Amazon S3 来存储我的所有文件并使用 Cloudfront 作为 CDN 来确保高效运行并解决任何 EBS 文件复制问题。
非常感谢您的帮助。
劳埃德
答案1
无状态的 Web 应用程序很难。
众所周知,WordPress 非常依赖写入磁盘的内容。以下是建议的基础设施
- 弹性负载均衡器
- 由小型 EC2 实例组成的自动缩放组
- Foreman/Dev micro ec2 实例
- 适用于 CMS 数据的微型/小型 RDS
- 用于会话存储的 Elasticache 集群
- 用于媒体上传的 S3 存储桶
现在是最困难的部分。
让我们暂时忘记代码库的更新,看看如何让整个系统无状态。你应该做以下事情来让这个系统水平可扩展:
- 从您的微实例开始。它将充当部署机制和模板
- 设置 PHP 会话以使用 memcached 进行会话管理并将其指向您的 elasticache 集群http://www.dotdeb.org/2008/08/25/storing-your-php-sessions-using-memcached/
- 在微实例上安装 git
- 安装某种 wordpress 插件,将所有文件上传到 S3(可选,但可以节省您每次将媒体文件上传到 cms 时重新部署的时间)尝试 W3 Total Cache 插件
这将完成设置
如何部署新变更
您将使用微实例对 wordpress 安装进行所有未来更改。这包括更新 wordpress、更新主题文件以及磁盘上存储的几乎所有内容。
您需要创建两个脚本:
第一个将用于将更改部署到自动缩放组。它应该执行以下操作:
- 将所做的更改提交到其 git 仓库
- 对所有生产实例执行 ping 操作,并告诉它们从微实例下载新的代码库。您需要使用某种形式的 AWS SDK 来获取自动扩展组中的实例列表并触发它们的接收脚本。我个人通过我创建的 HTTP 端点来执行此操作。
第二个脚本将存在于自动扩展组的实例上,并由第一个脚本触发,并在实例首次初始化时运行。它应该执行以下操作:
- 连接到微实例上的 git 存储库
- 获取最新更改,并在分离的 HEAD 状态下检出更改
每次对系统文件进行任何更改时,都应该运行上面的部署脚本。这会将更改传播到所有生产实例。
现在为生产实例创建一个基本 AMI。它应该与微型实例非常相似,但实际上不应安装 wordpress。您将使用启动时传递到 ec2 实例的用户数据来运行上面的第二个脚本,以从微型实例下载最新版本的代码库。
最后一件事...如果您正在运行任何形式的电子商务,您将需要在负载均衡器上安装 SSL 证书。请查看此处的指南:http://www.nczonline.net/blog/2012/08/15/setting-up-ssl-on-an-amazon-elastic-load-balancer/