Nginx 不负责 WebSocket 无缝重连,而是通过透传升级头、调长超时、禁用缓冲压缩、配置 upstream 故障转移四项配置,确保连接稳定不中断,从而支撑前端实现高效重连。

Nginx 本身不提供 WebSocket 的“无缝重连”机制,它也不负责重连逻辑。所谓“无缝重连”,实际是前端客户端(如浏览器)在连接断开后主动发起的新连接;Nginx 的角色是让每一次连接都能稳定建立、长时间保持、不被意外中断——这才是实现“看似无缝”的关键。
真正要做的,不是让 Nginx 去重连,而是让它不成为断连的源头。下面从四个实操重点讲清楚怎么做:
✅ 正确透传协议升级头
WebSocket 握手依赖 Upgrade: websocket 和 Connection: Upgrade 这两个 HTTP 头。Nginx 默认会过滤或改写它们,必须显式放行:
-
proxy_http_version 1.1;(WebSocket 要求 HTTP/1.1) -
proxy_set_header Upgrade $http_upgrade;(动态传递客户端原始 Upgrade 值) -
proxy_set_header Connection "upgrade";(注意引号不能少,值必须是"upgrade"字符串)
漏掉任一配置,Nginx 就会把 WebSocket 请求当普通 HTTP 处理,返回 200 而非 101,握手直接失败。
⏱ 合理设置超时参数,避免静默断连
默认 proxy_read_timeout 60s 对 WebSocket 来说太短。空闲时没数据,Nginx 就会主动关闭连接。应设为远高于业务心跳间隔:
-
proxy_read_timeout 3600;(1 小时,适用于常规心跳) -
proxy_send_timeout 3600;(匹配读超时,防发送卡住) -
proxy_connect_timeout 15;(保持合理,避免阻塞太久)
⚠️ 注意:这些值需和后端服务的 keepalive 心跳周期对齐。比如后端每 45 秒发一次 ping,timeout 至少设为 60 秒以上。
? 关闭缓冲与压缩,防止帧损坏
WebSocket 数据以帧(frame)为单位传输,启用响应缓冲或 gzip 可能导致帧粘连、截断或延迟:
-
proxy_buffering off;(强制流式转发,禁用响应缓冲) -
gzip off;或至少确保gzip_types不包含application/octet-stream、自定义二进制类型 - 若必须开启 gzip,请确认后端已明确声明
Content-Encoding: identity,避免双重压缩
? 配合 upstream 实现后端故障自动切换
单点后端宕机时,Nginx 可快速转向健康节点,减少重连失败窗口:
upstream ws_backend {
server 192.168.1.10:9501;
server 192.168.1.11:9501;
keepalive 32;
}
location /ws {
proxy_pass http://ws_backend;
proxy_next_upstream error timeout http_500;
# 其他 WebSocket 必配项...
}这样即使某台 Swoole 实例挂了,Nginx 会在下次请求时自动选另一个节点,前端重连成功率显著提升。
前端仍需实现带退避策略的重连(如 1s→2s→4s 指数增长),但只要 Nginx 不乱杀连接、不改头、不缓存、不压缩,重连就会又快又稳——用户几乎感知不到中断。


















