Nginx报504 Gateway Timeout超时排查
时间:2026-10-7 07:42 作者:emer 分类: 无
前言
访问网站提示 504 Gateway Timeout,意思是 Nginx 把请求转发给后端(PHP-FPM 或其他服务),后端半天没响应,Nginx 等不及了就返回 504。本文讲一下 504 的排查思路。
504 和 502 的区别
- 502 Bad Gateway:后端服务直接挂了,连不上
- 504 Gateway Timeout:后端服务在跑,但响应太慢,超时了
常见原因
原因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 排查三步:
- 看 Nginx 错误日志
- 确认后端服务在跑
- 程序优化 or 调大超时时间
记住: 504 是后端响应太慢,不是 Nginx 本身的问题。
遇到问题加QQ23979811 协助处理