在 nginx 中配置最少连接数负载均衡,需要在 http 块内定义 upstream 模块,并在其中使用 least_conn 指令。该算法会将新请求分配给当前活跃连接数最少的后端服务器,适用于长连接或处理时间差异较大的场景。

upstream 模块的基本结构是怎样的
要启用此功能,必须先在 http 上下文中创建一个 upstream 块,并在其内部声明 least_conn。接着,在该块中列出所有后端服务器的地址和端口。Nginx 会实时统计每个服务器的当前连接数(包括与客户端和后端之间的连接),并将请求发给连接数最小的那个。如果多个服务器连接数相同,则按权重轮询。

upstream backend_pool {
least_conn;
server 192.168.1.10:8080 weight=3;
server 192.168.1.11:8080 weight=1;
server 192.168.1.12:8080 backup;
}
server {
listen 80;
location / {
proxy_pass http://backend_pool;
}
}
上述配置定义了一个名为 backend_pool 的负载均衡组。其中 192.168.1.10 权重为 3,192.168.1.11 权重为 1,192.168.1.12 作为备用服务器仅在其它服务器不可用时才接收流量。当请求进入时,Nginx 会比较前两个活跃服务器的连接数,选择较少者进行转发。
如何验证 least_conn 是否生效
可以通过模拟不同负载情况来观察连接分配。例如,启动一个长时间运行的任务(如 sleep 5秒)在前端,同时发起多个并发请求。通过查看 Nginx 访问日志或后端服务器的连接状态,可以确认请求是否优先分配给了空闲服务器。此外,可以使用 nginx -t 检查配置语法是否正确,并通过 curl 发送测试请求。

# 模拟后端处理耗时
# 假设后端脚本包含:sleep 5; echo "done"
# 前端 Nginx 配置片段
location /slow {
proxy_pass http://backend_pool/slow;
proxy_read_timeout 10s;
}
当多个客户端同时访问 /slow 接口时,由于每个请求占用连接约 5 秒,least_conn 会确保新请求不会全部堆积到同一台服务器。若 192.168.1.10 已有 3 个活跃连接,而 192.168.1.11 只有 1 个,则新请求将发往 192.168.1.11。这种机制有效避免了单点过载,提升了整体吞吐量。
当所有后端服务器连接数相同时如何处理
当所有可用后端服务器的当前活跃连接数完全相等时,least_conn 算法会退化为基于权重的轮询策略。也就是说,它不再随机选择,而是按照预设的 weight 值按比例分配请求。例如,若两台服务器权重分别为 3 和 1,则在连接数相同的情况下,每 4 个请求中有 3 个发往权重高的服务器,1 个发往权重低的服务器。这一行为确保了在高并发且负载均匀分布时,仍能保持预期的流量比例。











