Nginx需显式配置WebSocket透传:启用HTTP/1.1、Upgrade/Connection头,调优proxy_read_timeout等超时参数,关闭缓冲与压缩,并可配置upstream健康检查。
WebSocket 代理在 Nginx 中默认不保持长连接,容易因超时、心跳缺失或反向代理层干预导致断线;要实现稳定连接,关键不是“自动重连”(那是前端逻辑),而是让 Nginx 正确透传 WebSocket 协议、维持 TCP 连接不被中断,并配合合理的超时与头部设置。
启用 WebSocket 协议升级支持
Nginx 必须显式处理
和
头,否则会将 WebSocket 请求当作普通 HTTP 处理并关闭连接:
在
块中添加:
proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";
确保后端服务(如 Node.js、Spring Boot)也正确响应
,否则 Nginx 会回退为 200 并终止升级流程。
调优超时参数防止非预期断连
默认的 Nginx 超时值(如
默认 60s)远低于 WebSocket 的典型空闲时长,需延长:
proxy_read_timeout 86400;
—— 设置为 24 小时,允许长时间无数据传输(如后台监控连接)
proxy_send_timeout 86400;
—— 同步匹配发送超时
proxy_connect_timeout 30;
—— 保持合理,避免后端不可达时阻塞过久
注意:这些值需与后端服务的 keepalive 和心跳间隔协调,例如后端每 30 秒发一次 ping,则 timeout 至少设为 45 秒以上。
禁用缓冲与压缩保障实时性
启用缓冲或 gzip 压缩可能截断流式帧、破坏 WebSocket 二进制/文本帧边界:
proxy_buffering off;
—— 关闭响应缓冲,避免延迟或粘包
proxy_buffer_size 4k;
—— 若必须设缓冲区,保持最小且对齐帧大小
gzip off;
或至少确保
不包含
或自定义 WebSocket MIME 类型
可选:添加健康检查与平滑故障转移
当后端实例宕机时,Nginx 可快速切换节点,减少重连失败窗口:
使用
块定义多个后端,开启
连接池:
upstream ws_backend {server 192.168.1.10:8080;server 192.168.1.11:8080;keepalive 32;}
配合
实现失败自动转发
前端仍需实现重连逻辑(如指数退避),但 Nginx 层已不再成为单点断连诱因。
UpgradeConnectionlocation101 Switching Protocolsproxy_read_timeoutgzip_typestext/event-streamupstreamkeepaliveproxy_next_upstream error timeout http_500;