IT

WordPress频繁502 Bad Gateway?原因排查与快速解决实操

AI智能摘要

WordPress 老弹 502 Bad Gateway,别急着删插件。先看 Nginx 和 PHP-FPM 日志,大多是进程池太小、内存不够或脚本超时。按本文调 max_children、加 swap、改超时,再清掉臃肿插件,基本能稳住。

先看结论:502 不是 WordPress 的错

502 Bad Gateway 的本质是:网关(Nginx、Apache、CDN 或负载均衡)把请求转给后端 PHP 处理,但后端没有返回合法响应。也就是说,问题几乎总在 PHP-FPM、PHP 进程崩溃,或两者之间的连接上,而不是 WordPress 主题或插件本身。所以排查方向应该从「服务器 → PHP-FPM → WordPress」倒着查,而不是先折腾插件。

第一步:确认 502 是偶发还是持续

先看错误日志,这是最直接的证据。Nginx 默认日志位置:

tail -n 50 /var/log/nginx/error.log
tail -n 50 /var/log/php*-fpm.log

如果看到 connect() to unix:/run/php/php8.1-fpm.sock failed (11: Resource temporarily unavailable),说明 PHP-FPM 连接池被打满;如果看到 upstream prematurely closed connection,多半是 PHP 进程被 OOM 杀掉或脚本执行超时。用 dmesg | grep -i oom 可以确认是否被系统内存杀手干掉。

第二步:按优先级排查四类常见原因

  • PHP-FPM 进程池太小:并发一上来,pm.max_children 不够用,请求排队超时。先看 pm.max_children 当前值,再结合内存调整。每个 PHP 进程约占 30–80MB,用 pm.max_children = 可用内存 / 单进程内存 估算。
  • 内存不足触发 OOM:小内存 VPS 上装了 WooCommerce 或大量插件最容易出现。加 swap 能缓解,但治本还是升级内存或限制插件数量。
  • PHP 脚本超时:Nginx 的 fastcgi_read_timeout 默认 60 秒,PHP 的 max_execution_time 默认 30 秒。备份、导入、爬虫抓取时容易触发。适当调大,但别无限大。
  • 插件或主题死循环:如果 502 只在访问某个页面时出现,禁用插件逐个测试。用 wp plugin deactivate --all(WP-CLI)快速定位。

第三步:针对性的修复命令与配置

调整 PHP-FPM 池(以 PHP 8.1 为例,文件在 /etc/php/8.1/fpm/pool.d/www.conf):

pm = dynamic
pm.max_children = 25
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 10
pm.max_requests = 500

改完重启:

systemctl restart php8.1-fpm
systemctl restart nginx

Nginx 侧同步调大超时(在 location ~ .php$ 块内):

fastcgi_read_timeout 120s;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;

如果用了 Cloudflare 等 CDN,还要确认回源超时设置,否则源站恢复了 CDN 仍返回 502。临时可先「暂停 Cloudflare」验证。

第四步:长期预防比救火更重要

502 反复出现的站点,通常有三个共性:内存吃紧、插件臃肿、没有监控。建议做三件事:一是开启 swap(至少 1–2GB),二是用 wp plugin list --status=active 定期清理不用的插件,三是配置 Uptime 监控和日志告警。对于流量较大的站点,把 PHP-FPM 换成 pm = static 并固定进程数,比 dynamic 更稳定,代价是常驻内存略高。做完这些,502 基本能从「天天见」变成「偶尔见」。

发表评论