«

Nginx报504 Gateway Timeout超时排查

时间:2026-10-7 07:42     作者:emer     分类: 无


前言

访问网站提示 504 Gateway Timeout,意思是 Nginx 把请求转发给后端(PHP-FPM 或其他服务),后端半天没响应,Nginx 等不及了就返回 504。本文讲一下 504 的排查思路。

504 和 502 的区别

常见原因

原因1:PHP 程序执行太慢

一个 PHP 请求要跑 30 秒,Nginx 默认等 60 秒就超时了。

解决: 优化 PHP 代码,或者调大 Nginx 超时时间。

原因2:PHP-FPM 进程不够

PHP-FPM 进程数用完了,新请求排队等着。

解决: 增加 PHP-FPM 进程数。

原因3:后端服务挂了

后端的 Java/Node.js 服务没启动,或者端口不对。

解决: 确认后端服务在跑。

排查步骤

第一步:看 Nginx 错误日志

tail -f /var/log/nginx/error.log

找具体是哪个请求超时了。

第二步:看 PHP-FPM 状态

ps aux | grep php-fpm

看进程数是不是满了。

第三步:直接访问后端

绕过 Nginx,直接访问后端服务:

curl http://127.0.0.1:9000/

看后端自己响应快不快。

调大 Nginx 超时时间

如果程序确实需要跑很久,调大超时时间:

location ~ \.php$ {
    fastcgi_pass   unix:/run/php-fpm/www.sock;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;

    # 超时时间
    fastcgi_connect_timeout 60s;
    fastcgi_send_timeout    60s;
    fastcgi_read_timeout    60s;
}

参数说明:

参数 说明
fastcgi_connect_timeout 连接后端超时时间
fastcgi_send_timeout 发送请求超时时间
fastcgi_read_timeout 读响应超时时间

增加 PHP-FPM 进程数

PHP-FPM 配置文件一般在 /etc/php-fpm.d/www.conf:

pm = static
pm.max_children = 50

改成 50 个进程,重载 PHP-FPM。

常见坑

坑1:只调了 Nginx 超时

调了 Nginx 超时,但 PHP 自己也有超时(max_execution_time)。

解决: 同时改 php.ini:

max_execution_time = 60

坑2:后端服务重启了但 Nginx 没重载

后端服务换了端口,Nginx 还连旧端口。

解决: 改完配置 nginx -s reload。

坑3:大文件上传超时

上传大文件,跑到一半 504。

原因: 上传慢,超时了。

解决: 调大 client_body_timeout 和 fastcgi_read_timeout。

坑4:CDN 也有超时

用了 CDN,CDN 自己也有超时限制。

解决: CDN 那边也调大超时时间。

总结

504 排查三步:

  1. 看 Nginx 错误日志
  2. 确认后端服务在跑
  3. 程序优化 or 调大超时时间

记住: 504 是后端响应太慢,不是 Nginx 本身的问题。

遇到问题加QQ23979811 协助处理

标签: Nginx 排查 504 Timeout 超时