least_conn需与max_conns、slow_start、健康检查协同防止单点过载:max_conns硬限并发,slow_start缓冲冷启动,健康检查+proxy_next_upstream主动避障,keepalive双向控制防虚高连接数。

least_conn 本身不防“瞬间压垮”,它只选连接数最少的节点——如果新节点刚上线、连接数为 0,它反而会最先被猛灌流量。真正防止单点被打爆,靠的是 least_conn + max_conns + slow_start + 健康检查 四者协同,形成一道动态防护层。
设 max_conns 实现硬性并发截断
每个 server 必须明确设置最大允许活跃连接数,超过即自动剔出调度池,哪怕它当前仍是“最少连接”:
- server 10.0.1.20:8080 max_conns=120; —— 普通计算节点,上限 120 连接
- server 10.0.1.21:8080 max_conns=40; —— AI 推理节点,显存敏感,上限压得更严
- 一旦某节点活跃连接 ≥ max_conns,Nginx 立即跳过,不再转发任何新请求
加 slow_start 缓冲冷节点接入
新扩容或重启后的后端初始连接数为 0,least_conn 会把它当作“最空闲”节点倾泻流量。slow_start 让它逐步承接压力:
- server 10.0.1.30:8080 max_conns=120 slow_start=45s;
- 上线后前 45 秒,连接权重从 0 线性升至 100%,避免模型未加载完、缓存未预热就被打满
- 特别适合 GPU 节点、JVM 预热、大模型加载等启动耗时长的服务
配健康检查与 proxy_next_upstream 主动避障
least_conn 不识别“卡死但连接未断”的节点。必须靠健康检查+重试机制及时隔离问题节点:
- 每个 server 加 max_fails=2 fail_timeout=10s;连续两次失败(如超时或 502)即摘除 10 秒
- 在 location 中配 proxy_next_upstream error timeout http_500 http_502; —— 后端返回这些错误时自动换节点重试
- 搭配 proxy_read_timeout 15s(略高于业务 P99),防止一个 30 秒卡死请求长期占位
启用 keepalive 并控制空闲生命周期
空闲 keepalive 连接若长期不释放,会被计入活跃连接数,导致 least_conn 误判“已满”,实际却无负载。需双向对齐:
- upstream 块中设 keepalive 32;(每个 worker 最多缓存 32 条空闲连接)
- 后端服务同步配置短 keep-alive timeout:如 Uvicorn 设 --keep-alive 5,Spring Boot 设 server.tomcat.connection-timeout=5000
- 避免“僵尸连接”虚高连接数,让 least_conn 统计始终贴近真实手头活儿











