nginx支持websocket长连接轮询代理需配置upstream keepalive、透传upgrade/connection头、禁用缓冲及延长超时。示例:upstream启用keepalive 32,location中设proxy_http_version 1.1、proxy_set_header upgrade $http_upgrade、connection "upgrade"、proxy_buffering off、proxy_read_timeout 86400。

要让 Nginx 的 upstream 支持 WebSocket 长连接轮询代理,关键不是仅靠“轮询”算法本身,而是确保后端连接池能复用、协议升级不被破坏、连接不被超时中断。Nginx 默认的轮询(round-robin)是启用的,无需额外声明,但必须配合特定 upstream 和 location 配置才能真正支撑 WebSocket。
upstream 块需启用 keepalive 并禁用健康检查干扰
WebSocket 是长生命周期连接,后端服务(如 Swoole、Node.js WS Server)通常维持稳定 TCP 连接。因此 upstream 必须开启连接复用,避免每次请求都新建 TCP:
- keepalive 32:保持最多 32 个空闲长连接到每个后端,显著降低握手开销
- 去掉
max_fails/fail_timeout或设为宽松值(如max_fails=3 fail_timeout=60s),避免因心跳间隔长被误判为宕机 - 不使用
ip_hash或hash $remote_addr——除非业务强制要求粘性连接;否则轮询更利于负载均衡
location 中必须透传升级头并关闭缓冲
仅定义 upstream 不够,实际代理行为由 location 决定。WebSocket 握手依赖两个逐跳头,Nginx 默认会丢弃它们:
- proxy_http_version 1.1:强制使用 HTTP/1.1(HTTP/1.0 不支持 Upgrade)
-
proxy_set_header Upgrade $http_upgrade:原样转发客户端的
Upgrade: websocket -
proxy_set_header Connection "upgrade":注意是固定字符串
"upgrade",不是变量;因为Connection是逐跳头,不可继承 - proxy_buffering off:禁用响应缓冲,防止 WebSocket 帧被暂存、延迟或粘包
超时设置要匹配业务心跳周期
WebSocket 空闲时无数据流,Nginx 默认 60 秒超时会主动断连。需按后端心跳策略放大:
- proxy_read_timeout 86400(24 小时):适用于后端每 30–45 秒发一次 ping 的场景
- proxy_send_timeout 86400:保障服务端消息(如广播、通知)能顺利发出
- 可选:proxy_connect_timeout 10:连接建立阶段超时,一般 5–10 秒足够
完整可运行配置示例
以下为生产环境常用结构(假设后端 WebSocket 服务监听 8080 端口):
http {
upstream ws_backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
keepalive 32;
}
server {
listen 80;
server_name ws.example.com;
location /ws/ {
proxy_pass http://ws_backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_buffering off;
proxy_read_timeout 86400;
proxy_send_timeout 86400;
}
}
}











