nginx 502 与 504 的区别及排查思路
该文章由AI生成,仅为SEO优化测试,相关内容不保证准确!!!
引言
502 Bad Gateway 和 504 Gateway Timeout 都是“nginx 到后端的链路出了问题”,但含义完全不同:502 是后端连不上或直接断了,504 是后端还活着但处理超时。区分这一点,排查方向就完全不同。
一、502 的常见原因与排查
502 表示 nginx 把请求转给后端(PHP-FPM、Tomcat、Node)时失败。常见原因:①后端进程挂了——ps aux | grep php-fpm 确认进程存在,systemctl status php-fpm 看是否崩溃重启;②监听地址不一致——nginx 的 fastcgi_pass 写 127.0.0.1:9000,但 php-fpm 只监听 unix socket,必须对齐;③权限问题——unix socket 文件 www 用户不可读写,检查 socket 文件属主与 nginx worker 用户;④后端积压——backlog 满时新连接被拒,看 ss -ltn 的 Recv-Q。排查顺序:先确认进程活着,再对齐监听地址与权限,最后看错误日志 tail -f /www/wwwlogs/xxx.error.log,里面会写明 connect() failed 还是 Connection reset。
二、504 的常见原因与排查
504 表示请求已成功转给后端,但后端在规定时间内没处理完。典型原因:①慢 SQL——一条 30 秒的查询直接超时,开慢查询日志定位;②后端死锁或外部接口阻塞——应用在等一个永远不返回的第三方请求;③超时参数太短——nginx 默认 proxy_read_timeout 60s、fastcgi_read_timeout 60s,长任务(导出报表、大文件处理)需要调大。排查:error.log 里 504 会标 upstream timed out;配合 SHOW PROCESSLIST 看数据库是否卡着慢查询;用 curl -w "%{time_total}" 实测接口耗时,确认是普遍慢还是个别请求慢。
三、参数调整建议
504 类:把 fastcgi_read_timeout / proxy_read_timeout 调到业务需要的值(如 300s),同时 PHP 的 max_execution_time、request_terminate_timeout 也要同步调大,三者取最小值才是实际生效的超时。502 类:php-fpm 的 pm.max_children 是否耗尽(watch "ps aux | grep php-fpm | wc -l"),pm.max_requests 适当设置防内存泄漏。注意:调大超时只是缓解,慢的根本原因(慢 SQL、阻塞调用)必须解决,否则只是让用户等更久。
总结
502 = 后端死了/连不上(查进程、监听地址、权限),504 = 后端太慢/超时(查慢 SQL、阻塞、超时参数)。先看 error.log 的具体报错,再按方向排查,不要一上来就调参数——那是把症状藏起来而不是治病。