优化网站性能的方法 WordPress、Amazon EC2 Apache 和 RDS MySQL

eri*_*icn 0 mysql website wordpress amazon-ec2 amazon-rds

我有 6 个 WordPress 网站在 1 个 EC2 实例上运行。所有网站都连接到 1 个相同 RDS 实例中的数据库。

今天早些时候,最大网站的流量达到顶峰,RDS 实例陷入瓶颈——CPU 利用率在一个多小时内达到 100%。它影响了我所有的网站,因为它们需要永远加载。

为了防止此类问题再次发生,以下哪项最重要,因此我首先要投入时间和精力?
(我将在以后工作,我现在只需要优先考虑)

  • 改进所有网站的缓存
  • 微调数据库服务器
  • 微调我的 Apache 服务器

对我网站的用户体验有何影响?一些快速搜索表明我应该限制到我的 Web 服务器的并发连接数,但这不会阻止用户访问我的网站吗?

更多背景:

  • 我最大的网站每月有 14 万次访问和 66 万次页面浏览。其他 5 个网站加起来应该比这少得多。
  • 我使用大型 EC2 实例作为 Web 服务器
  • 我使用中型 RDS 实例作为数据库服务器

我已经做了什么:

  • 使用 W3 Total Cache 插件为大多数网站进行缓存,尤其是最大的网站(在缓存方面,我几乎无法为最大的网站做任何其他事情)

我是在浪费资源,还是根本没有足够的资源用于我的网站——或者更确切地说,我如何自己回答这个问题?

jam*_*ieb 5

在单个 EC2 实例上运行所有内容违背了基于云的部署的全部意义:自动扩展和自我修复的能力。正如我之前所写,自动缩放是 AWS 的核心和灵魂,如果您不使用它,最好使用传统的 co-lo 服务器或 VPS。它既便宜又耐用。

我刚刚完成了一个与您的需求非常相似的 AWS 部署。客户端运行三个相当大容量的 Wordpress 站点(比您的站点流量多一点)。配置如下所示:

  • VPC 中的所有内容以提高安全性。VPC 包含跨两个可用区 (AZ) 的六个子网
  • 跨越两个子网/可用区的弹性负载均衡器
  • m1.small 实例的自动缩放 (AS) 组用作应用程序层。根据流量负载,最少有两个应用服务器,最多有 10 个。在正常操作中,它只运行两个,平均 CPU 使用率始终低于 15%。AS 组一次扩展和缩减两个实例,每个 AZ 一个。
  • 每个应用实例运行 Nginx + PHP-FPM + APC。在这个堆栈的前面,我安装了 Varnish 来提供额外的缓存。
  • 两个私有子网中的小型多可用区 RDS 实例。即使在极高的流量负载下,由于应用程序端缓存的数量,它也几乎没有受到影响。
  • 静态资产由 Cloudfront 提供服务,以进一步减少应用服务器上的负载。
  • 文件存储在一对镜像 Gluster 节点上,每个节点都位于单独的可用区中以用于 HA 目的。一个浮动弹性 IP 地址被分配给其中一个节点,这使您可以通过 SSH 或 SFTP 访问实际的 Wordpress 文件。节点是它自己的 AS 组的一部分,所以如果文件服务器死了,它会被自动杀死并重新创建。启动时,它会重新附加包含 Wordpress 文件的卷。自动备份通过一系列每小时的卷快照进行。
  • t1.micro 实例用作私有子网中实例的 NAT 网关。

这种设计没有任何单点故障*,在实例死亡时会自动自我修复,并且足够智能,可以根据资源需求进行扩展或缩减。总成本:约 200 美元/月。如果您选择购买 1 年期预留实例。

我正在将此配置放入 CloudFormation 模板和 cloud-init/Python 脚本的组合中,这些脚本在启动时自动从 Github 中提取。基本上,它几乎允许任何人按下按钮,等待大约一个小时,然后回来,整个环境都将等待。我希望在年底前完成这项工作。如果您有兴趣获得模板的副本,请在我的个人资料中列出的网站上向我发送电子邮件至“jamie”。

* NAT 实例是 SPoF,但这主要是 VPC 的设计限制。它是一个非关键组件,可能会发生故障并且不会影响应用程序。