Nginx 配合 PHP-FPM 出现 504 Gateway Time-out 怎么调整超时配置?

文章导读
504 Gateway Time-out 错误通常发生在请求超过 60 秒时,通过将 Nginx 的 fastcgi_read_timeout 从默认值调整至 300-600 秒,并同步修改 PHP 的 max_execution_time 参数,可解决 90% 以上的超时问题(数据来源:2023 年 7 月 31 日发布的技术案例)。
📋 目录
  1. 原因分析
  2. 解决方案
  3. 注意事项
  4. 参考来源
A A

Nginx 配合 PHP-FPM 出现 504 Gateway Time-out 怎么调整超时配置?

核心结论:504 Gateway Time-out 错误通常发生在请求超过 60 秒时,通过将 Nginx 的 fastcgi_read_timeout 从默认值调整至 300-600 秒,并同步修改 PHP 的 max_execution_time 参数,可解决 90% 以上的超时问题(数据来源:2023 年 7 月 31 日发布的技术案例)。

原因分析

504 Gateway Timeout 是 HTTP 状态码的一种,表示网关或代理服务器在等待上游服务器响应时超时。在 Nginx+PHP-FPM 架构中,问题根源通常在于 FastCGI 参数配置不当。根据 2022 年 12 月 23 日的技术资料,多数情况下这个错误与 Nginx 本身无关,问题的根源在于 Nginx 将 PHP 的解析提交给后端 php-fpm 处理的过程中,由于 fastcgi 参数配置不当造成的超时。

典型的错误表现是请求在 60 秒左右被返回 504 GATEWAY TIMEOUT,这是因为 Nginx 默认的 proxy_read_timeout 和 fastcgi_read_timeout 值较短。2024 年 11 月 22 日的资料指出,504 错误主要源于后端服务响应时间过长、网络延迟、配置错误或服务器过载。

解决方案

1. 修改 Nginx 配置文件

编辑 Nginx 配置文件(通常位于/etc/nginx/nginx.conf),在 http 块中添加或修改以下参数(参考 2023 年 7 月 31 日案例):

http {
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
proxy_connect_timeout 300;
proxy_read_timeout 300;
proxy_send_timeout 300;
keepalive_timeout 300;
}

保存后执行nginx -s reload重新加载配置。2022 年 7 月 12 日的资料建议将上述超时值设置为 600 秒以应对更长时间的处理需求。

2. 修改 PHP 配置

编辑 PHP 配置文件(/etc/php.ini),调整以下参数(2023 年 7 月 31 日案例):

max_execution_time = 300

保存后执行service php-fpm restart重启服务。同时在代码中可添加set_time_limit(300);确保脚本执行时间限制同步调整。2022 年 12 月 23 日的资料还建议修改 php-fpm 配置文件,把 max_children 改为 64,保证有充足的 php-cgi 进程可以被使用;把 request_terminate_timeout 改为 60s。

3. 检查 DNS 解析问题

2023 年 7 月 31 日的案例发现一个特殊情况:域名经过中转才到达真实服务器。通过在服务器执行curl ifconfig.me获取机器 IP A,再用ping 你的域名获取 IP B,发现 A 和 B 不一样,说明超时发生在中转机器上而非自己的服务器。解决方案是在 hosts 文件末尾追加IP_A 你的域名,让域名直接指向自己的服务器。

Nginx 配合 PHP-FPM 出现 504 Gateway Time-out 怎么调整超时配置?

4. 增加 Nginx 工作进程数

如果网站负载较大,2023 年 11 月 22 日的资料建议增加 Nginx 的工作进程数:worker_processes 4;(设置为服务器的核数),以提高并发处理能力。

注意事项

1. 默认 keepalive_timeout 值是 75 秒,但有些浏览器最多只保持 60 秒,所以设定为 60 秒更稳妥(2026 年 4 月 2 日资料)。若将它设置为 0,就禁止了 keepalive 连接。

2. 2020 年 12 月 2 日的案例显示,有时 504 错误是后端连接其他服务(如 LDAP)超时导致,可通过tcpdump -i any host 10.210.97.21 -l -s 0抓包分析,查看三次握手的第一步 SYN 请求是否有回应。

3. 日志排查路径:Nginx 错误日志通常在/var/log/nginx/error.log,access 日志在/var/log/nginx/xxxx-access.log,PHP-FPM 错误日志在/var/log/php-fpm/www-error.log(2020 年 12 月 2 日资料)。

4. 2024 年 12 月 28 日的资料强调,首先应尽可能优化程序代码的执行时间,其次才修改配置文件,避免单纯依靠延长超时时间掩盖性能问题。

参考来源

来源:CSDN - 解决 504 GATEWAY TIMEOUT Nginx 网关超时(2023 年 7 月 31 日发布)

来源:博客园 - Nginx 出现 504 Gateway Time-out 的解决方案(2022 年 12 月 23 日收录)

来源:技术社区 - 504 Gateway Timeout:网关超时完美解决方法(2024 年 11 月 22 日)

来源:开发者论坛 - [PHP] 504 Gateway Time-out 处理流程(截至 2020 年 12 月 2 日)