Nginx 报 502 / 504?先分清是“上游死了”还是“上游太慢”
【摘要】 Nginx 报 502 / 504?先分清是“上游死了”还是“上游太慢”502 和 504 看起来都是“网关出问题”,但指向的环节完全不同:502 是 Nginx 连上游时就失败了,或者上游返回了坏响应;504 是 Nginx 连上了上游、却在规定时间内没等到响应。一个是“连不上 / 响应坏了”,一个是“等太久”。先分清,再动手,少走一半弯路。 一、先看报错和日志,定方向先确认两件事:浏览...
Nginx 报 502 / 504?先分清是“上游死了”还是“上游太慢”
502 和 504 看起来都是“网关出问题”,但指向的环节完全不同:502 是 Nginx 连上游时就失败了,或者上游返回了坏响应;504 是 Nginx 连上了上游、却在规定时间内没等到响应。一个是“连不上 / 响应坏了”,一个是“等太久”。先分清,再动手,少走一半弯路。
一、先看报错和日志,定方向
先确认两件事:浏览器看到的到底是 502 还是 504,以及 Nginx 错误日志里那一行写的是什么。
tail -n 100 /var/log/nginx/error.log
- 日志里是
connect() failed (111: Connection refused) while connecting to upstream:上游根本没在监听,502 的典型成因。 - 日志里是
upstream timed out (110: Connection timed out) while reading response header from upstream:上游接了请求但响应太慢,504 的典型成因。 - 日志里是
upstream sent invalid header或upstream prematurely closed connection:上游返回了 Nginx 无法理解的响应,也会报 502。
只看浏览器状态码不够,日志里那一行才是分流依据。
二、502:上游没起来,或者响应坏了
按从近到远的顺序查:
systemctl status php-fpm --no-pager # 以实际后端为准:php-fpm、gunicorn、node、java 进程都一样
ss -tlnp | grep -E '9000|8000|8080' # 上游到底在监听哪个端口 / 套接字
curl -v http://127.0.0.1:8080/ # 绕过 Nginx,直接问上游
- 进程没跑:先看它为什么挂掉,
journalctl -u php-fpm --since "30 minutes ago" --no-pager,修好原因再启动,只重启不治本。 - 进程在跑但端口不对:核对 Nginx 里
proxy_pass/fastcgi_pass指向的地址,和上游实际监听的地址是不是同一个。改过端口、换过套接字路径后最容易在这里错位。 - 直接 curl 上游也报错:问题在上游本身,不在 Nginx,先修上游。
- 直接 curl 上游正常、经 Nginx 就 502:再查 Nginx 这一侧——
proxy_pass有没有写错、SELinux / 防火墙有没有挡住 Nginx 到上游的本地连接、磁盘满了有没有导致套接字写不进去。
三、504:上游太慢,或者超时配得太短
504 不等于上游死了,很多时候是上游在干重活:慢查询、大文件处理、外部接口拖延。先确认慢在哪一层:
curl -o /dev/null -s -w '总耗时 %{time_total}s,首字节 %{time_starttransfer}s\n' http://127.0.0.1:8080/慢接口
- 直接问上游也慢:去上游侧定位——慢 SQL、缺索引、外部 API 超时、进程数被打满(php-fpm 的
pm.max_children到顶后新请求只能排队)。 - 直接问上游很快、经 Nginx 就 504:看 Nginx 的超时是不是比上游实际耗时短:
proxy_connect_timeout 5s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
只把超时调大是掩盖问题,不是修问题:先确认这个接口本来就该这么慢(报表、大文件导出),再按实际耗时放宽;如果是不该慢的接口,先修慢查询和外部依赖。
四、几个容易误判的点
- 刚上线就 502:先查部署有没有真的完成——新进程没起来、旧进程占着端口、配置文件 reload 没生效(
nginx -t && systemctl reload nginx),都比“代码 bug”常见。 - 间歇性 502/504:看是不是上游进程数到顶、连接池耗尽,或者后端在滚动重启。
upstream配了多个节点时,逐个直接 curl 每个节点,别只看负载均衡后的结果。 - 大响应 502:上游返回的响应头过大时,调大缓冲前先确认是不是上游在异常地吐超大 Cookie 或响应头:
proxy_buffer_size 16k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
- 改完配置没生效:Nginx 改配置要 reload,php-fpm 改配置要重启对应服务,只保存文件是不生效的。
五、排查清单(收藏版)
- 是 502 还是 504?错误日志那一行写的是什么?
- 绕过 Nginx 直接 curl 上游:上游本身通吗、快吗?
- 502:进程在跑吗?监听地址和
proxy_pass对得上吗?响应头合法吗? - 504:慢在哪一层?上游慢就修慢查询和外部依赖,超时配得短再按实际耗时放宽。
- 间歇性问题:逐个节点查,别只看负载均衡后的结果。
- 改配置后 reload / 重启了吗?
502 查“连通和响应”,504 查“耗时和超时”,分清再动手,大多数 Nginx 网关报错都能在半小时内定位到具体一层。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)