Nginx需显式配置WebSocket透传:启用HTTP/1.1、Upgrade/Connection头,调优proxy_read_timeout等超时参数,关闭缓冲与压缩,并可配置upstream健康检查。
WebSocket 代理在 Nginx 中默认不保持长连接,容易因超时、心跳缺失或反向代理层干预导致断线;要实现稳定连接,关键不是“自动重连”(那是前端逻辑),而是让 Nginx 正确透传 WebSocket 协议、维持 TCP 连接不被中断,并配合合理的超时与头部设置。
启用 WebSocket 协议升级支持
Nginx 必须显式处理 Upgrade 和 Connection 头,否则会将 WebSocket 请求当作普通 HTTP 处理并关闭连接:
- 在
location块中添加:
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade"; - 确保后端服务(如 Node.js、Spring Boot)也正确响应
101 Switching Protocols,否则 Nginx 会回退为 200 并终止升级流程。
调优超时参数防止非预期断连
默认的 Nginx 超时值(如 proxy_read_timeout 默认 60s)远低于 WebSocket 的典型空闲时长,需延长:
Drimo
专注服务影视、广告行业的AI创作平台
下载
- 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; 或至少确保
gzip_types不包含text/event-stream或自定义 WebSocket MIME 类型
可选:添加健康检查与平滑故障转移
当后端实例宕机时,Nginx 可快速切换节点,减少重连失败窗口:
- 使用
upstream块定义多个后端,开启keepalive连接池:
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 层已不再成为单点断连诱因。