我在 1 个 EC2 实例上运行了 6 个 WordPress 网站。所有网站都连接到同一个 RDS 实例中的数据库。
今天早些时候,最大的网站流量达到峰值,RDS 实例出现瓶颈 - CPU 利用率超过一小时,达到 100%。这影响了我所有的网站,因为它们都需要很长时间才能加载。
为了防止此类问题再次发生,以下哪件事最重要,我应该首先投入时间和精力?
(我稍后会处理所有事情,现在我只需要确定优先事项)
- 改善所有网站的缓存
- 微调数据库服务器
- 微调我的 Apache 服务器
这会对我网站的用户体验产生什么影响?一些快速搜索显示我应该限制到我的 Web 服务器的并发连接数,但这不会阻止用户访问我的网站吗?
更多背景:
- 我最大的网站每月有 14 万次访问和 66 万次页面浏览量。其他 5 个网站的总访问量应该比这个少得多。
- 我正在使用大型 EC2 实例作为 Web 服务器
- 我正在使用中型 RDS 实例作为数据库服务器
我已经做了什么:
- 使用 W3 Total Cache 插件对大多数网站进行缓存,尤其是最大的网站(对于最大的网站,我几乎无能为力)
我是否在浪费资源,或者我的网站是否没有足够的资源——或者更确切地说,我自己该如何回答这个问题?
答案1
在单个 EC2 实例上运行所有内容会破坏基于云的部署的整个要点:自动扩展和自我修复的能力。正如我之前所写,自动扩展是 AWS 的核心和灵魂,如果您不使用它,最好使用传统的 co-lo 服务器或 VPS。它既便宜又更耐用。
我刚刚完成了与您的需求非常相似的 AWS 部署。该客户端运行三个流量相当大的 Wordpress 网站(流量比您的网站大很多)。配置如下所示:
- 所有内容均位于 VPC 中,以提高安全性。VPC 包含两个可用区 (AZ) 中的六个子网
- 跨两个子网/可用区的弹性负载均衡器
- m1.small 实例的自动扩展 (AS) 组用作应用程序层。根据流量负载,应用服务器最少有 2 个,最多有 10 个。正常运行时,它仅使用 2 个实例运行,平均 CPU 利用率始终低于 15%。AS 组每次使用两个实例进行扩展和缩减,每个可用区一个。
- 每个应用程序实例都运行 Nginx + PHP-FPM + APC。在这个堆栈前面,我安装了 Varnish 来提供额外的缓存。
- 两个私有子网中的一个小型多可用区 RDS 实例。即使在极高的流量负载下,由于应用程序端缓存量很大,它几乎不会受到影响。
- 静态资产由 Cloudfront 提供,以进一步减轻应用程序服务器的负载。
- 文件存储在一对镜像 Gluster 节点上,每个节点位于单独的 AZ 中,以实现 HA。浮动弹性 IP 地址分配给其中一个节点,这使您能够通过 SSH 或 SFTP 访问实际的 Wordpress 文件。节点是其自己的 AS 组的一部分,因此如果文件服务器死机,它将被自动终止并重新创建。在启动时,它会重新连接包含 Wordpress 文件的卷。自动备份通过一系列每小时卷快照进行。
- t1.micro 实例充当私有子网中实例的 NAT 网关。
这种设计没有任何单点故障*,如果实例死亡,将自动自我修复,并且足够智能,可以根据资源需求扩大或缩小规模。总成本:如果您选择购买 1 年的预留实例,则每月约 200 美元。
我正在努力将此配置放入 CloudFormation 模板和 cloud-init/Python 脚本的组合中,这些脚本会在启动时自动从 Github 中提取。基本上,任何人都可以按下按钮,等待大约一个小时,然后返回,整个环境都会等待。我希望在今年年底前完成这项工作。如果您有兴趣获得模板的副本,请向我的个人资料中列出的网站上的“jamie”发送电子邮件。
* NAT 实例是 SPoF,但这主要是 VPC 的设计限制。而且它是一个非关键组件,即使发生故障也不会影响应用程序。