Nginx中WebSocket代理断线自动重连的配置保障

2026-03-23服务器59564

Nginx需显式配置WebSocket透传:启用HTTP/1.1、Upgrade/Connection头,调优proxy_read_timeout等超时参数,关闭缓冲与压缩,并可配置upstream健康检查。

WebSocket 代理在 Nginx 中默认不保持长连接,容易因超时、心跳缺失或反向代理层干预导致断线;要实现稳定连接,关键不是“自动重连”(那是前端逻辑),而是让 Nginx 正确透传 WebSocket 协议、维持 TCP 连接不被中断,并配合合理的超时与头部设置。

启用 WebSocket 协议升级支持

Nginx 必须显式处理 UpgradeConnection 头,否则会将 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 层已不再成为单点断连诱因。
标签: