least_conn是专为长连接、响应不均场景设计的负载均衡算法,它实时将新请求分配给活跃连接数最少的后端节点,需配合keepalive、http/1.1、合理超时及后端长连接支持才能生效。

least_conn 是专为长连接、响应不均场景设计的负载均衡算法,它不按顺序或权重分发请求,而是实时把新请求交给当前活跃连接数最少的后端节点——这直接对应“谁手头活儿最少”,比轮询或 IP hash 更贴近真实负载。
为什么长连接业务必须用 least_conn
长连接(如 WebSocket、文件上传、报表导出、AI 推理接口)的特点是单个请求耗时长、连接持续时间久。轮询会机械地轮流派发,容易让某台机器堆积几十甚至上百个未关闭连接;IP hash 则完全绑定客户端,无法动态释放压力。least_conn 每次选节点前都查一遍实时连接数,天然规避了“忙的越忙、闲的越闲”的失衡问题。
基础配置要写对这三处
在 nginx.conf 的 http 块内定义 upstream,关键点如下:
- 首行直接写 least_conn,无需参数
- 每个 server 行不要加 weight(least_conn 会忽略它),但可配 max_conns 实现容量分级
- 必须启用 keepalive,否则连接频繁新建,活跃数统计失真
示例配置:
upstream backend {least_conn;
keepalive 32;
server 192.168.1.10:8080 max_conns=2000;
server 192.168.1.11:8080 max_conns=800;
server 192.168.1.12:8080 max_conns=800;
}
配合 keepalive 和超时才真正生效
单独开 least_conn 效果有限,必须联动以下设置:
- 在 location 块中强制 HTTP/1.1 并清空 Connection 头:proxy_http_version 1.1; proxy_set_header Connection ''
- 后端服务本身要支持长连接(如 Tomcat 配置 keepAliveTimeout,Spring Boot 默认开启)
- 设好超时:proxy_read_timeout 至少等于后端最长预期处理时间(例如 300 秒),避免慢请求长期占位
- 全局 keepalive_timeout 可设为 65 秒,兼顾复用与及时回收
验证是否调优到位
上线后重点看两个地方:
- 通过 Nginx stub_status 查看各 upstream server 的 Active connections 分布,应大致趋近,无明显单点偏高
- 在后端服务器上执行 ss -s | grep 'estab' 或 netstat -an | grep :8080 | grep ESTAB | wc -l,确认连接数分布与 Nginx 统计一致
- 若仍不均衡,检查是否后端未复用连接(比如每请求 new HttpClient)、或存在大量空闲未关闭连接(需调小 keepalive_timeout 或后端 idle timeout)











