WordPress 管理页面超时,或者在 Elastic Beanstalk、PHP 5.6、Apache、RDS 和 CloudFlare 上需要 30 秒才能加载

WordPress 管理页面超时,或者在 Elastic Beanstalk、PHP 5.6、Apache、RDS 和 CloudFlare 上需要 30 秒才能加载

我最近将继承的 WordPress 网站从 Rackspace 迁移到 AWS,但性能大幅下降。我对整个 DevOps 还很陌生,所以我不知道从哪里开始寻找。

问题:

在我将 DNS(Cloudflare)从旧服务器指向新服务器后,WordPress(特别是在管理部分)很快就能找到问题。但大约一个小时后,管理页面加载超时,或需要长达 30 秒才能加载。我还没有测试所有页面,但这似乎发生在带有编辑器的页面上,因此“新帖子”或编辑页面。当页面超时时,我会看到 Cloudflare 超时消息。

我应该注意,我是在晚上 11 点左右进行此切换的,除了我之外没有人应该登录,并且网络流量大约为 150 个用户。

我还注意到我们的 RDS 实例开始达到 100% 的 CPU 使用率,并且 DB 连接数飙升至约 1000 个连接。

由于 RDS 已经远远超出了其 max_connections 限制,WordPress 无法再连接到数据库,现在网站前端显示“无法建立与数据库的连接”消息。

此时,我可以重新启动我的 ECV2 实例,但 RDS 数据库仍在整理 1000 个连接。

我还注意到似乎(经典) 弹性负载均衡器停止在两个实例之间平均分配流量。

这个周末我会再试一次,但我应该在日志中寻找什么?在 EC2 实例关闭之前,我跟踪了日志,我只看到:

pid 17186:tid 139743773734656] (70007)The timeout specified has expired: [client 127.0.0.1:58604] AH01075: Error dispatching request to : (polling), referer: http://m.facebook.com

规格概述:

服务器 - 在 AWS 上,我们使用 2 到 6 个负载平衡/自动缩放的 m3.large EC2 服务器,由 Elastic Beanstalk(用于 Github 集成)和经典负载均衡器管理,Cloudflare 用于 DNS 和 SSL 终止。

我们在 64 位 Amazon Linux/2.7.1 AMI 上使用 Apache 2.4、PHP 5.6 和 PHP-FPM

RDS - R3.Large 运行 Aurora,是运行只读副本的集群的一部分。几天前我尝试使用 R3 Large,管理页面加载需要 15-30 秒……仍然很慢。

我还应该提到,RDS 是在 Elastic Beanstalk 之外设置的。不过我认为这没什么关系。不过,该服务器上还有另外 2 个数据库,用于几个较小的网站,这些网站基本上没有流量,很快就会停用。

我已通过 W3TC 启用对象缓存,并添加了一些 Cloudflare 规则来禁用 /wp-admin* 的性能和应用程序,如下所示这里推荐

我在网上读到的一些内容

  • 也许 ELB 超时限制低于 Apache 限制,从而导致问题
  • 本文建议将我的 MPM 从事件更改为 prefork 或 worker

答案1

看起来您有两个独立的问题:
1) 连接需要 30 秒才能完成。2
) 超过 db.r3.large RDS aurora 实例的 1000 个连接限制,之后新连接将超时,因为 php 无法再与 RDS 建立新的会话。

第一个看起来很像 DNS 名称解析问题。检查数据库连接的配置方式(IP 与 FQDN)。如果是 FQDN - 检查 /etc/nsswitch.conf 并检查 cloudflare。您要确保正向和反向名称解析正常工作,并且这 30 秒的延迟不是由此引起的。您还可以执行 tcpdump port 53 来检查名称解析的情况。

对于第二个问题,您需要弄清楚为什么连接数超过 1000。
如果您不使用 RDS Aurora,您的“正常”连接数是多少?根据使用的数据库,将有不同的查询来检查。如果它通常消耗超过 1000 个连接 - 那么您必须相应地调整您的 RDS 实例(或重新设计您的应用程序,也许您正在使用 word press 插件来驱动该连接数增加)。
如果非 RDS 数据库上的连接数明显低于 1000 - 那么您必须排除导致这些额外连接的原因。
几个开始的链接:

答案2

好的,我找到了答案。有人向我介绍了 MyTop 工具,它基本上是 MYSQL 查询的 Top。多亏了这个工具,我才能够看到有一个查询运行了成千上万次,最终却导致一切都停滞不前。

确定查询后,我转到 New Relic,使用其数据库堆栈跟踪能够找到哪个 php 文件正在运行发出请求的代码,在那里我发现了一个不受控制的 while 循环。我不确定为什么该循环在旧服务器上不是问题,但我注释掉了该代码,现在 AWS 运行起来就像梦一样。

相关内容