nginx 不实现 websocket 自动重连,仅通过正确配置透传升级请求、延长超时、禁用缓冲压缩及支持后端故障转移来保障连接稳定;前端需自行实现重连逻辑。

Nginx 本身不实现 WebSocket 的断线自动重连逻辑,它也不主动发起重连。所谓“自动重连”,实际由前端客户端(如浏览器)控制;Nginx 的职责是避免成为连接中断的源头——确保每次握手能成功、连接能长期存活、数据帧不被破坏。只要 Nginx 配置得当,前端重连成功率就会大幅提高,用户感知接近“无缝”。
透传 WebSocket 升级请求
WebSocket 握手依赖两个关键 HTTP 头:Upgrade: websocket 和 Connection: Upgrade。Nginx 默认会丢弃或改写它们,必须显式放行:
-
proxy_http_version 1.1;(强制使用 HTTP/1.1,WebSocket 升级的前提) -
proxy_set_header Upgrade $http_upgrade;(动态传递原始 Upgrade 值,不能硬编码) -
proxy_set_header Connection "upgrade";(值必须是小写"upgrade"字符串,引号不可省)
漏掉任一配置,Nginx 就会把请求当普通 HTTP 处理,返回 200 而非 101 状态码,握手直接失败。
延长超时时间防止静默断连
默认 proxy_read_timeout 60s 是 WebSocket 断连最常见的原因。空闲时无数据,Nginx 就会关闭连接。需按业务心跳周期向上调整:
-
proxy_read_timeout 3600;(建议设为心跳间隔的 2–3 倍,例如后端每 30 秒发 ping,则设 ≥90) -
proxy_send_timeout 3600;(与读超时匹配,防发送卡住) -
proxy_connect_timeout 15;(保持合理,避免建连阻塞过久)
注意:这些值要和后端 keepalive 设置对齐,否则单边超时仍会触发断连。
禁用缓冲与压缩保障帧完整性
WebSocket 数据以帧为单位传输,启用响应缓冲或 gzip 可能导致帧粘连、截断或延迟:
-
proxy_buffering off;(强制流式转发,禁用响应缓冲) -
gzip off;(最稳妥;若必须开启,确保gzip_types不含application/octet-stream或自定义二进制类型) -
proxy_buffer_size 4k;(如需保留最小缓冲,设为帧大小对齐值)
支持后端故障转移提升可用性
当某台后端宕机时,Nginx 可快速切换节点,减少重连失败窗口:
- 在
upstream块中定义多个服务器,并启用连接池:upstream ws_backend { server 192.168.1.10:8080; server 192.168.1.11:8080; keepalive 32; } - 配合
proxy_next_upstream error timeout http_500;实现失败自动转发
前端仍需实现指数退避等重连策略,但 Nginx 层已不再因配置不当导致频繁、无谓的断连。











