解决 Nginx + PHP-FPM 环境下 WordPress 出现 504 网关超时错误

最近在一个 Nginx + PHP-FPM 的环境下部署 WordPress,访问网站时出现了 504 网关超时错误。经过一番排查和解决,最终网站恢复了正常。在这篇文章中,我将详细记录问题的解决过程,希望对遇到类似问题的朋友有所帮助。

1. 问题描述

WordPress 网站部署在一个 Nginx + PHP-FPM 的环境下。但是当访问网站时,页面长时间无响应,最后显示"504 Gateway Time-out"错误。

2. 问题排查

2.1 检查 Nginx 错误日志

首先,我检查了 Nginx 的错误日志,发现有大量类似下面的错误:

复制

vbscript 复制代码
2023/06/08 15:30:45 [error] 1234#1234: *1 upstream timed out (110: Connection timed out) while connecting to upstream, client: xxx.xxx.xxx.xxx, server: example.com, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php8.1-fpm.sock", host: "example.com"

这个错误表明,Nginx 在尝试连接 PHP-FPM 的过程中超时了。

2.2 检查 PHP-FPM 服务状态

接下来,我检查了 PHP-FPM 的状态,使用命令 sudo systemctl status php8.1-fpm,发现 PHP-FPM 服务是正常运行的。

2.3 检查 Nginx fastcgi 超时设置

然后,我怀疑可能是 Nginx 的 fastcgi 超时设置太短了。我检查了 Nginx 的配置文件 /etc/nginx/nginx.conf,发现 fastcgi 的超时设置如下:

复制

ini 复制代码
fastcgi_connect_timeout 60s;
fastcgi_send_timeout 60s;
fastcgi_read_timeout 60s;

这些设置看起来是合理的,60秒的超时时间对于大多数请求来说应该足够了。

2.4 检查 PHP-FPM 进程数设置

最后,我怀疑可能是 PHP-FPM 的进程数太少,导致请求排队,超过了 Nginx 的超时时间。我检查了 PHP-FPM 的配置文件 /etc/php/8.1/fpm/pool.d/www.conf,发现 PM 设置如下:

ini

复制

ini 复制代码
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

这个设置表明,PHP-FPM 的进程数是动态调整的,最多可以有5个进程,起始有2个进程,最少有1个空闲进程,最多有3个空闲进程。

考虑到网站的访问量,这个设置的进程数可能有点少。

2.5 检查 Nginx 配置文件

在检查 Nginx 配置文件时,我发现在多个地方定义了 fastcgi_index 指令,导致 Nginx 报错,无法启动。

具体来说,fastcgi_index 指令同时出现在以下两个文件中:

  • /etc/nginx/snippets/fastcgi-php.conf
  • /etc/nginx/sites-available/wordpress.conf

3. 问题解决

3.1 解决重复的 fastcgi_index 指令

为了解决重复的 fastcgi_index 指令问题,我决定在网站的配置文件 /etc/nginx/sites-available/wordpress.conf 中保留 fastcgi_index 指令,然后从 /etc/nginx/snippets/fastcgi-php.conf 文件中删除 fastcgi_index 指令。

修改完成后,我运行 sudo nginx -t 测试 Nginx 配置,确保没有错误。然后我运行 sudo systemctl reload nginx 重新加载 Nginx 配置。

3.2 调整 PHP-FPM 进程数设置

为了解决 504 网关超时问题,我调整了 PHP-FPM 的 PM 设置,增加了进程数:

复制

ini 复制代码
pm.max_children = 20
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 10

调整后,PHP-FPM 最多可以有20个进程,起始有5个进程,最少有5个空闲进程,最多有10个空闲进程。这个设置应该能够满足更高的并发请求。

保存配置文件后,我重启了 PHP-FPM 服务:

复制

复制代码
sudo systemctl restart php8.1-fpm

然后我再次访问网站,这次网站成功加载,没有再出现504错误

4. 总结

造成 WordPress 出现 504 网关超时错误的原因可能有多种,在我这个案例中,主要原因是 PHP-FPM 的进程数设置太少,导致请求排队,超过了 Nginx 的 fastcgi 超时时间。此外,Nginx 配置文件中重复的 fastcgi_index 指令也导致了 Nginx 无法正常启动。

解决方法如下:

  1. 检查 Nginx 错误日志,定位问题
  2. 检查 PHP-FPM 服务状态
  3. 检查 Nginx fastcgi 超时设置
  4. 检查 PHP-FPM 进程数设置
  5. 检查 Nginx 配置文件,解决重复的 fastcgi_index 指令
  6. 调整 PHP-FPM 进程数设置,增加进程数
  7. 重启 PHP-FPM 服务,重新加载 Nginx 配置

在实际生产环境中,我们需要根据网站的访问量,合理设置 PHP-FPM 的进程数。同时也需要关注 Nginx 的 fastcgi 超时设置,确保其与 PHP-FPM 的处理能力相匹配。定期检查 Nginx 配置文件,避免出现重复的指令。

希望这篇文章对大家有所帮助。如果大家有任何问题或建议,欢迎在评论区交流。

相关推荐
野犬寒鸦7 分钟前
从零起步学习并发编程 || 第二章:多线程与死锁在项目中的应用示例
java·开发语言·数据库·后端·学习
没有bug.的程序员11 分钟前
Spring Cloud Sentinel:熔断降级规则配置与分布式流量防线实战终极指南
java·分布式·后端·spring cloud·sentinel·熔断规则·分布式流量防线
JP-Destiny13 分钟前
后端-RabbitMQ
后端·消息队列·rabbitmq·java-rabbitmq
李慕婉学姐15 分钟前
【开题答辩过程】以《基于SpringBoot Vue的校园后勤管理系统设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
vue.js·spring boot·后端
咖啡啡不加糖20 分钟前
Arthas 使用指南:Java 应用诊断利器
java·spring boot·后端
努力也学不会java21 分钟前
【Spring Cloud】优雅实现远程调用-OpenFeign
java·人工智能·后端·spring·spring cloud
J_liaty21 分钟前
SpringBoot整合Canal实现数据库实时同步
数据库·spring boot·后端·canal
lead520lyq22 分钟前
Golang Grpc接口调用实现账号密码认证
开发语言·后端·golang
JaguarJack24 分钟前
Laravel AI SDK 在 Laracon India 2026 首次亮相
后端·php·laravel
bjxiaxueliang2 小时前
一文掌握SpringBoot:HTTP服务开发从入门到部署
spring boot·后端·http