详解 least_conn 最少连接数算法:如何在长连接场景下优化后端负载

大枫君_4481

大枫君_4481

2026-05-20

955人浏览

原创

least_conn是Nginx基于实时活跃连接数调度的负载均衡策略,优先将请求分发给连接数最少的后端,适用于长连接多、响应时间差异大或后端性能异构的场景;它过滤不可用节点后比较活跃连接总数(含keepalive空闲连接),并支持max_conns实现软性容量控制。

详解 least_conn 最少连接数算法:如何在长连接场景下优化后端负载

least_conn 是 Nginx 原生支持的负载均衡策略,核心逻辑很简单:把新请求发给当前活跃连接数最少的后端服务器。它不看 CPU、不比响应时间,只盯住一个数字——此刻这台机器还有多少 TCP 连接没关。这对长连接多、处理时长差异大的场景特别管用。

为什么长连接下轮询容易失衡

轮询策略按顺序分发请求,假设后端有三台机器 A、B、C,其中一台在处理一个 30 秒的文件上传,另两台刚完成毫秒级查询。轮询仍会继续往那台“卡着”的机器派新请求,导致它的连接数越堆越高,而其他机器空闲。用户感知就是部分请求变慢、超时增多,监控上看到 conn_established 持续偏高,但 CPU 却不高——这正是 least_conn 要解决的典型失衡。

  • 长连接(如 WebSocket、HTTP/2 流、大文件上传)会让连接长期占用,轮询无法感知这种“隐性负载”
  • 后端性能异构(比如混用了不同代际的物理机或容器规格)也会放大轮询的偏差
  • 接口响应时间波动大(既有 20ms 的读缓存,也有 8s 的报表导出),让静态调度策略失效

least_conn 的真实调度逻辑

Nginx 并不是简单取个最小值就完事。它在每次选节点前会做三步:

  • 先过滤掉健康检查失败或被标记为 down/backup 的不可用节点
  • 在剩余可用节点中,比较它们当前的活跃连接总数(包括 keepalive 空闲连接)
  • 选连接数最少的那个;如果多个节点并列最少,则在这些节点里走加权轮询(注意:此时 weight 才生效)

这里的关键是:keepalive 连接会计入总数。如果你配置了 upstream 中的 keepalive 100,那每个 worker 维持的 100 条空闲连接,也会算在对应后端的连接数里。所以 keepalive 值不宜设得过大,否则可能人为拉高某台机器的“账面连接数”,干扰 least_conn 判断。

Lantay
Lantay

Lantay是一款AI办公效率工具,面壁智能推出的文档处理智能工作台。

下载

用 max_conns 实现软性容量控制

least_conn 本身不支持 weight,但你可以用 max_conns 来体现节点能力差异。比如高性能节点可承载更多并发,普通节点需限制接入量:

upstream backend {
    least_conn;
    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;   # 普配
}

这样,当高配节点连接数为 1999、普通节点为 799 时,新请求仍倾向高配节点;一旦它达到 2000,Nginx 就自动跳过,转投其他节点——相当于一种带容量上限的动态权重。

  • max_conns 是硬限制,超过即拒绝接入,不会排队等待
  • 它和健康检查独立,故障节点仍需靠 health_check 或 max_fails/fail_timeout 主动剔除
  • 建议结合监控(如 nginx stub_status 或 Prometheus exporter)定期核对实际连接数与 max_conns 设置是否匹配

配置与避坑要点

基础写法很简洁,但几个细节容易踩坑:

  • upstream 块内直接写 least_conn;,不需要参数,也不支持和 weight 同时出现(weight 会被忽略)
  • 务必单独配置健康检查,least_conn 不自带故障熔断,例如加 check interval=3 rise=2 fall=3(需启用 ngx_http_upstream_check_module)
  • 如果后端启用了 connection reuse(如 Tomcat 的 keep-alive),要确保 Nginx 的 proxy_http_version 和 proxy_set_header 适配,避免连接复用异常影响计数准确性
  • 在高并发突增场景下,可配合 limit_conn 或 limit_req 做入口限流,防止 least_conn 被瞬间打满而失去调节余地

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2963

5

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

7350

13

后端的主要工作内容介绍
后端的主要工作内容介绍

后端是应用程序的服务端部分,负责核心任务,如数据库交互、业务逻辑处理和响应客户端请求。想了解更多后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6926

10

C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

3829

3

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

2023.07.25

2508

9

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

2023.08.02

1440

5

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.09

1378

4

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

2023.09.05

1456

5

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2023.09.20

2438

7

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Docker Desktop设置与维护手册
Docker Desktop设置与维护手册

共0课时 | 0人学习

LLVM官方文档
LLVM官方文档

共0课时 | 0人学习