least_conn是基于实时活跃连接数分配新连接的负载均衡策略,适用于后端性能不均、响应慢或长连接场景,能有效避免节点连接堆积,需配合keepalive使用并结合stub_status验证效果。

当后端服务器性能不均或请求处理时间差异较大时,least_conn 是比轮询(round-robin)更合理的负载均衡策略——它把新连接交给当前活跃连接数最少的上游服务器,真正实现“谁闲谁接活”,尤其适合长连接、慢响应场景。
least_conn 原理与适用场景
least_conn 不是按请求数、响应时间或权重分配,而是实时统计每个 upstream server 的当前活跃连接数(即已建立但尚未关闭的 TCP 连接),每次新连接到来时,选数值最小的那个节点。它天然适配以下情况:
- 后端有部分服务响应慢(如数据库查询、文件上传),导致连接长期占用
- 各服务器 CPU/内存配置不同,连接承载能力差异明显
- 使用 HTTP/1.1 持久连接或 WebSocket、gRPC 等长连接协议
- 轮询模式下出现个别节点连接堆积、超时增多的问题
基础配置写法(HTTP 上下文)
在 nginx.conf 的 upstream 块中直接声明 least_conn 即可,无需额外参数:
upstream backend {
least_conn;
server 192.168.1.10:8080;
server 192.168.1.11:8080 weight=2;
server 192.168.1.12:8080 max_fails=3 fail_timeout=30s;
}注意:least_conn 本身不支持 weight,但你可以混用 —— weight 仅影响初始连接分配概率,实际仍以实时连接数为准;max_fails / fail_timeout 等健康检查参数照常生效。
配合 keepalive 提升效果
单独用 least_conn 可能因连接复用不足而削弱效果。建议为 upstream 显式启用连接池:
upstream backend {
least_conn;
keepalive 32; # 每个工作进程最多缓存32个空闲长连接
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
<p>server {
location / {
proxy_pass <a href="https://www.php.cn/link/65b5b8d1f89bf53a5713bc3afdd83e9e">https://www.php.cn/link/65b5b8d1f89bf53a5713bc3afdd83e9e</a>;
proxy_http_version 1.1;
proxy_set_header Connection '';</p><h1>其他 proxy_* 配置...</h1><pre class="brush:php;toolbar:false;"><code>}}
这样 Nginx 会复用后端空闲连接,减少握手开销,也让 least_conn 统计更稳定、更贴近真实负载。
验证与排查要点
least_conn 效果无法单看 access.log,需结合指标观察:
- 用
nginx -T确认配置已加载且无语法错误 - 通过
stub_status或第三方模块(如 nginx-module-vts)查看各 upstream server 的 active conn 数 - 压测时对比轮询与 least_conn 下各节点的
Active connections分布是否更均匀 - 注意:如果所有后端都繁忙(active 连接数接近 max_connections),least_conn 退化为随机选择,此时应扩容或优化后端

















