502 Bad Gateway 常见原因
- 后端应用没有启动,Nginx 连接不上 upstream。
- proxy_pass 写错端口、协议或 socket 路径。
- 后端进程崩溃,返回了非法响应。
- PHP-FPM、Node、Java 服务重启中或权限不足。
Nginx Troubleshooting
502 更常见于上游不可用或返回异常,504 更常见于上游响应超时。先确认进程和端口,再看代理配置和日志。
systemctl status nginx
nginx -t
tail -n 100 /var/log/nginx/error.log
ss -lntp
curl -I http://127.0.0.1:后端端口
| 现象 | 先看哪里 | 典型证据 |
|---|---|---|
| 502 立即出现 | 上游地址、端口、进程和 Socket 权限 | error.log 出现 connection refused 或 no such file。 |
| 502 偶发出现 | 进程重启、连接池、内存和上游提前断开 | 应用同一时刻退出,或出现 upstream prematurely closed。 |
| 504 等待固定秒数后出现 | 慢查询、外部接口、队列阻塞和超时值 | 耗时接近 proxy_read_timeout,应用仍在处理。 |
| 只有 CDN 域名 502 | 回源 IP、端口、Host/SNI 和源站 ACL | 直接访问源站正常,CDN 回源失败。 |
经过 CDN 的场景请继续使用CDN 502 Bad Gateway 排查清单,不要一开始就扩大超时时间。
sudo tail -f /var/log/nginx/error.log
sudo journalctl -u myapp -f
curl -sv --resolve example.com:443:源站IP https://example.com/ -o /dev/null
同时观察 Nginx 和应用日志,按时间戳对应同一次请求。--resolve 可在不修改公共 DNS 的情况下携带正确 Host 与 TLS SNI 访问指定源站。
nginx -t 通过只代表配置语法正确,还要检查服务状态、80/443 监听以及对应虚拟主机是否命中。127.0.0.1:端口、Unix Socket 或容器服务名。若这里已经失败,先修应用,不要继续改 Nginx。容器里的 127.0.0.1 只指向当前容器,不一定是宿主机或另一个应用容器。Nginx 在宿主机、应用在 Docker 时,应使用明确发布的宿主端口或同一容器网络中的服务名,并确认应用监听 0.0.0.0 而不是只监听容器内回环地址。
使用 Unix Socket 时,文件存在不代表 Nginx 有权限连接。应沿目录逐级检查执行权限、Socket 所属用户组和服务重启后路径是否改变。把 Socket 临时改成全员可写会掩盖权限模型问题,不应作为长期修复。
namei -l /run/myapp/app.sock
sudo -u www-data curl --unix-socket /run/myapp/app.sock http://localhost/health
docker ps --format 'table {{.Names}}\t{{.Ports}}\t{{.Status}}'
只有应用在预期时间内确实可以完成任务,并且业务允许用户等待时,才考虑修改 proxy_connect_timeout、proxy_send_timeout 或 proxy_read_timeout。如果慢请求来自无索引 SQL、连接池耗尽、外部接口无超时或后台任务误放在同步请求里,扩大 Nginx 超时只会让更多连接长期占用。
调整前先记录应用 P50、P95、P99 耗时和最慢调用位置。长任务更适合进入队列并返回任务状态;健康检查接口应保持轻量,不能依赖全部下游服务都完成复杂查询。
作者与维护:iphelp站长工具箱站长 核对方式:公网实测与官方资料 最后核对:2026年8月21日
本文依据公开协议、官方文档与本站实时检测结果维护。发现结果差异时,请通过反馈表单提供页面、现象与复现时间。