Nginx 反向代理排错:502/504、上游超时与 WebSocket 升级(2026)
摘要:相对「多站点 HTTPS 怎么配」,本文按 nginx.org 官方文档整理反向代理常见 502/504:先分清错误码、再查 error.log 与上游是否存活,再核对 proxy_*_timeout 与 WebSocket 的 Upgrade/Connection。查询日期 2026-10-20;只放官网普通链接(affiliate_later)。
依据:nginx.org · Module ngx_http_proxy_module、WebSocket proxying、Module ngx_http_upstream_module。查询日期:2026-10-20(北京时间)。示例域名与端口均为文档占位;把地址换成你机器上的上游。本文只放 Nginx 官网普通链接(
affiliate_later);不写云厂商单价。
本站已有两篇相关文,先划清边界,避免重复阅读:
- Nginx 反向代理多站点:证书、强制 HTTPS 与常见 502——侧重 server 块 / SNI / 强制 HTTPS / 基础 proxy_pass。
- Uptime Kuma 自建监控——侧重 探测与告警(站点挂了谁喊你)。
本文只做排错手册:浏览器或客户端已经报 502 Bad Gateway / 504 Gateway Timeout,或 WebSocket 连不上 / 握手失败 时,按官方指令含义一步步缩小范围。证书续期仍见免费 HTTPS 证书自动续期;宝塔环境注意面板端口与反代权限见宝塔面板优缺点与安全。
一、502 和 504 先别混
| 状态码 | 常见含义(反代场景) | 你优先怀疑什么 |
|---|---|---|
| 502 Bad Gateway | Nginx 作为网关,从上游拿到了无效响应,或根本连不上上游却以网关错误返回 | 上游进程挂了、端口写错、协议错(http/https/unix:)、防火墙拦了本机回环、上游立刻复位连接 |
| 504 Gateway Timeout | Nginx 在限定时间内等不到上游完成响应 | proxy_read_timeout / proxy_send_timeout / proxy_connect_timeout 过短、上游慢查询、上游线程堵死、缓冲/上游排队 |
官方 ngx_http_proxy_module 把连接建立、读写超时拆成多条指令;排错时先看 error.log 原文,再改超时——不要一上来把所有 timeout 改成 3600。

二、固定排查顺序(建议打印贴显示器旁)
- 复现一次,记下完整 URL、时间、是整站还是某个 path。
- 看 Nginx error.log(路径因发行版而异,常见
/var/log/nginx/error.log)。关键词示例:connect() failed、Connection refused、upstream timed out、no live upstreams。 - 绕过 Nginx 直连上游:若上游是本机
127.0.0.1:3000,在服务器上curl -v http://127.0.0.1:3000/健康路径。直连也失败 → 先修应用/容器/端口,别改 Nginx。 - 核对
proxy_pass目标:IP/端口/unix socket 是否与进程实际监听一致;location末尾斜杠会改变 URI 拼接(见官方proxy_pass说明),路径 404 有时被误当成「反代坏了」。 - 再谈超时与 WebSocket(下文)。
- 改完
nginx -t再 reload;监控侧可用 Kuma 盯 5xx(见 Kuma 文),但监控不能替代读日志。
多上游时,用 upstream 块把后端编组,便于权重、backup 与后续排错:

三、超时相关:先认指令,再改数字
ngx_http_proxy_module 中与「连得上但等太久 / 建连失败」最常打交道的包括(默认值以你本机 nginx -V 对应版本文档为准,以下只强调语义):
proxy_connect_timeout:与上游建立连接的超时。上游没在听、安全组丢包,多在这一层暴露。proxy_send_timeout:向上游发送请求的超时。proxy_read_timeout:在两次连续读操作之间,等待上游的超时;长轮询、慢接口、大文件生成常见卡在这里 → 客户端侧常表现为 504。proxy_next_upstream/proxy_next_upstream_timeout:何种失败可换下一台上游、以及换上游的总时间窗。只有你真的配了多 upstream 时才有意义。
实践建议:
- error.log 已写
upstream timed out→ 先确认是业务本身慢,还是超时设得不合理。 - 只对确有长耗时的
location(导出、AI 推理回调等)提高proxy_read_timeout,避免全局开到「永远不超时」。 - 上游是 PHP-FPM / Node / Java 时,还要核对这些进程自己的超时;只改 Nginx 不够。
- 缓冲相关(
proxy_buffering、proxy_buffer_size等)更多影响大响应与首包行为;偶发 502 伴随upstream sent too big header一类日志时再针对性加大,而不是和 504 混改。
四、WebSocket:Upgrade 与 Connection
浏览器或桌面客户端要升级到 WebSocket 时,需要把连接从 HTTP 升级为长连接。官方文档《WebSocket proxying》说明:自 1.3.13 起 Nginx 支持特殊隧道模式;并给出最小配置思路——把客户端的 Upgrade 传给上游,并把 Connection 设为 upgrade。

文档示例(查询日页面;注释提到较新版本对 proxy_http_version 1.1 的默认行为有变化,以你安装版本的文档为准):
http {
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
location /chat/ {
proxy_pass http://backend;
# 旧版本常需显式:proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host;
}
}
}
排错清单:
- 浏览器开发者工具看握手是否仍是普通 HTTP、状态码是否 4xx/5xx。
- 确认反代层是否丢掉了
Upgrade(多层 CDN/另一层反代也要放行)。 - WebSocket 空闲断开:同时检查
proxy_read_timeout与上游心跳;超时过短会在「看似已连上」后被网关掐断。 wss://场景先保证外层 TLS 正常,再查升级头——证书问题见 HTTPS 专项文,不要和 Upgrade 混为一谈。
五、和「站点监控」怎么配合
- Kuma / 云拨测:告诉你「外网看到 5xx 或超时」;适合值班。
- 本篇:告诉你「日志里是 refused 还是 timed out、WebSocket 头缺没缺」。
两者一起用效率最高:监控告警 → SSH 上机 → 按第二节顺序读 error.log → 直连上游 → 再动超时或 Upgrade。独立站若还接支付回调,偶发 502 会导致重试与拒付沟通成本上升,收款侧注意见本站跨境/拒付相关文;本文不展开支付协议。
六、相关阅读
- Nginx 反向代理多站点:证书、强制 HTTPS 与常见 502
- Uptime Kuma 自建监控:HTTP/SSL 探测与告警
- 网站 HTTPS 免费证书怎么申请和自动续期
- 宝塔面板优缺点与安全
- 网站可用性监控怎么设
来源与查询日期
- nginx.org — Module ngx_http_proxy_module
- nginx.org — WebSocket proxying
- nginx.org — Module ngx_http_upstream_module
- 查询日期:2026-10-20(北京时间)。
风险提示
错误的反代与超时配置可能导致服务长时间不可用或 WebSocket 业务中断;改配置前请备份、在低峰验证,并确保 nginx -t 通过后再 reload。云主机安全组、面板与应用进程权限配置不当还有被扫端口风险。本文不构成运维托管承诺。