nginx 默认轮询不支持长连接,需配置 keepalive、禁用缓冲、透传 upgrade 头、延长超时及改用 least_conn 调度才能可靠支撑 websocket 等场景。

Nginx 默认的轮询(round-robin)模式本身不感知连接状态,仅按顺序分发请求,对长连接场景天然不友好。要让它真正支撑 WebSocket、长轮询等长耗时连接,必须配合一系列关键配置,否则容易导致后端连接堆积、负载倾斜甚至连接中断。
必须启用 upstream 连接复用
轮询只是调度逻辑,而长连接依赖底层 TCP 复用。若不开启,每次请求都会新建后端连接,迅速耗尽端口与资源:
- 在
upstream块中添加keepalive 32;(数值按后端平均并发连接数 × 1.2 估算,常见 16–64) - 移除或放宽健康检查干扰:如
max_fails=3 fail_timeout=60s,避免因心跳间隔长被误判宕机 - 禁用
ip_hash或其他粘性策略(除非业务强要求),否则会固化连接,失去负载均衡意义
location 中要透传协议升级并禁用缓冲
Nginx 默认会丢弃 WebSocket 握手所需的逐跳头,且缓冲机制会破坏流式响应:
-
proxy_http_version 1.1;(HTTP/1.0 不支持 Upgrade) -
proxy_set_header Upgrade $http_upgrade;(转发客户端的 Upgrade 请求头) -
proxy_set_header Connection "upgrade";(注意是固定字符串"upgrade",不是变量) -
proxy_buffering off;(防止响应被缓存,确保数据即时透传) - 可选:
proxy_buffer_size 4k;(保障响应头不被截断)
超时参数需协同延长并匹配业务节奏
默认 60 秒超时会直接切断空闲长连接,必须按实际等待周期调整:
-
proxy_read_timeout 86400;(例如后端每 30 秒发一次 ping,设为 24 小时较稳妥) -
proxy_send_timeout 86400;(保障服务端广播类消息能发出) -
proxy_connect_timeout 5–10s;(仅控制建连阶段,不宜过长)
改用 least_conn 调度更合理
轮询不看后端负载,而长连接生命周期长,极易造成节点“越堵越分”:
- 在
upstream中明确声明least_conn; - 可叠加
max_conns限流,如server 192.168.1.10:8080 max_conns=1000; - 若后端性能差异大,可加
weight,如weight=2 max_conns=2000;
不复杂但容易忽略的是:轮询本身无需额外开启,真正起作用的是这些配套配置。只要后端稳定维持连接、正确响应心跳,Nginx 就能完成可靠透传。











