最少连接调度(least_conn)要求连接数真实反映后端负载,必须同时满足:upstream中声明least_conn、server配置max_fails和fail_timeout、启用proxy_next_upstream被动检查、upstream开启keepalive且后端支持长连接。
最少连接调度(least_conn)不是“挑个空闲节点凑合用”,而是让 Nginx 在请求到达瞬间,从所有健康后端里选出当前活跃连接数最少的那个——它真正起效的前提,是连接数能真实反映后端负载。
光写 least_conn 这一行配置,几乎没用。以下四点缺一不可:
least_conn,否则默认走轮询server 行必须带 max_fails=2 fail_timeout=15s,否则宕机节点仍持续收请求proxy_next_upstream error timeout http_500 http_502
keepalive 32,同时后端服务需支持长连接(如 Tomcat 设置 maxKeepAliveRequests)活跃连接数不准,least_conn 就变成随机分发。常见干扰来源有两个:
keepalive 值(如设为 16)或加 proxy_http_version 1.1; proxy_set_header Connection ''; 让 Nginx 主动管理连接生命周期weight 参数,给性能更强的机器更高权重,避免小规格节点被频繁选中却撑不住单看 $upstream_addr 日志只能知道落到哪台机器,无法判断调度是否合理:
stub_status 或 Prometheus exporter 查各后端的 active connections,若某台长期接近 worker_connections 上限,说明已到瓶颈,算法再准也无济于事$upstream_header_time 和 $upstream_response_time:前者稳定、后者飙升,问题在后端逻辑;两者同步升高,可能是 Nginx 自身连接池不足或网络延迟突增$upstream_cache_status,排除因缓存失效引发的重复计算压力,尤其在模型推理类服务中很关键least_conn 对以下情况提升显著:
weight 显式表达差异但它不适合: