轮询策略在长连接场景下需补全三件事:启用upstream级keepalive连接池、改用least_conn调度、收紧三类代理超时;禁用ip_hash以保障连接可迁移。

轮询策略本身不感知连接长短,但要让它在长连接场景下真正可用、不堆积、不倾斜,关键在于补全三件事:后端连接池复用、调度逻辑适配、超时行为收紧。默认轮询配置在长连接下容易导致请求不断打向已满节点,必须叠加针对性优化。
启用 upstream 级别 keepalive 连接池
这是长连接复用的基础。Nginx 默认对每个请求都新建后端连接,高频长轮询会迅速耗尽端口和 TIME_WAIT 资源。
- 在 upstream 块中添加 keepalive N(如
keepalive 32),表示每个 worker 进程最多缓存 N 个空闲长连接到该 upstream 内各后端 - 必须配合两个 proxy 指令使用:
proxy_http_version 1.1;和proxy_set_header Connection '';,否则后端可能因收到Connection: close头而拒绝复用 - keepalive 数值建议按“后端节点数 × 单节点平均并发连接数 × 1.2”估算,常见取值 16–64;过高浪费内存,过低仍频繁建连
改用 least_conn 替代默认轮询
轮询只看请求顺序,不看后端当前连接负载。长连接生命周期长,老连接持续挂起,新请求继续轮到同一台,极易造成单点堆积。
- 在 upstream 中加入 least_conn;,Nginx 将实时选择当前活跃连接数最少的后端分发请求
- 可叠加
max_conns防止单节点过载,例如:server 192.168.1.10:8080 max_conns=1000; - 若后端性能差异明显,可加
weight平衡能力,如server ... weight=2 max_conns=2000;
收紧三类代理超时与客户端 keep-alive 行为
长连接堆积本质是“该断不断”,需从协议层控制空闲连接生命周期。
- 设置 keepalive_timeout 30s;(而非默认 75s),略高于业务最长等待时间即可,避免无意义挂起
- 设置 keepalive_requests 2–5;,长轮询通常一建一响,设太高反而延迟连接释放
- 精准控制代理超时:
proxy_connect_timeout 2s;(建连不能拖)、proxy_send_timeout 15s;(发完请求后后端得及时收)、proxy_read_timeout 45s;(等响应总时长)
禁用 ip_hash,确保连接可迁移
ip_hash 会把同一客户端所有长连接绑定死在一个后端,一旦该节点连接数饱和或异常,无法自动分流,加剧不均。
- 确认 upstream 中未配置
ip_hash; - 若需会话保持,应改用 cookie 或后端统一 session 存储,而非依赖 Nginx 的 IP 绑定


















