轮询策略无法避免响应延迟堆积,需结合least_conn、超时控制、健康检查与连接复用等机制优化:least_conn按活跃连接数分发,配合max_conns限制;proxy_*超时主动断连;proxy_next_upstream实现失败重试与自动摘除;keepalive复用后端连接。

轮询策略本身无法避免后端响应延迟堆积,它只按顺序分发请求,不感知后端当前负载或响应快慢。要防止堆积,必须在轮询基础上叠加主动控制机制——核心是让 Nginx “看得见”后端状态、“刹得住”无效连接、“绕得开”已满节点。
用 least_conn 替代纯轮询
轮询对长连接或耗时差异大的服务极不友好:请求仍会均匀打向已堆积 500 个等待响应的后端,而空闲节点却被闲置。least_conn 是最直接有效的补救:
- 在 upstream 块中添加 least_conn;,Nginx 会实时选择当前活跃连接数最少的后端
- 配合 max_conns=800(例如)限制单节点最大并发连接,超限自动跳过
- 若后端性能不均,可叠加 weight,如 server 192.168.1.10:8080 weight=2 max_conns=1600;
收紧三类超时,不让连接“赖着不走”
堆积本质是连接该断不断。proxy_* 超时不是兜底,而是主动裁决点:
- proxy_connect_timeout 3s:建连失败立即换节点,不卡在握手阶段
- proxy_send_timeout 15s:发完请求后,后端若迟迟不确认接收,断开重试
- proxy_read_timeout 45s:设为业务最长等待时间 +5s,超时即释放上游连接并返回 504
启用健康检查与自动摘除
轮询不主动探测,只能靠失败触发规避。需显式配置容错逻辑:
- proxy_next_upstream error timeout http_500 http_502 http_503 http_504;:任一错误都触发重试
- max_fails=2 fail_timeout=15s:15 秒内连续失败 2 次,临时剔除该节点,到期自动恢复探测
- 避免使用 proxy_next_upstream off 或仅 retry 一次,否则失败请求直接穿透堆积
强制复用后端连接,减少 TIME_WAIT 泛滥
每次长轮询都新建后端连接,会快速耗尽本地端口并拖慢回收速度:
- upstream 块中加 keepalive 32;(每 worker 缓存最多 32 个空闲连接)
- location 中配 proxy_http_version 1.1; 和 proxy_set_header Connection "";,清除 close 头确保复用
- 禁用 ip_hash 或固定绑定,否则连接永远打向同一台,放大倾斜风险


















