加权最小连接数在Nginx开源版中需通过least_conn+weight组合实现,权重仅在连接数相同时生效,不参与数值计算;实操需配合keepalive调优、slow_start和健康检查;性能差异大时应升级Nginx Plus或改用响应时间加权。

加权最小连接数(Weighted Least Connections)不是 Nginx 开源版原生支持的独立算法,但可通过 least_conn 策略 + 权重配置组合实现近似效果——它不改变“选连接最少”的核心逻辑,而是在连接数相等时引入权重倾向性,同时配合合理配置让权重在实际调度中真正起作用。
权重只在连接数相同时生效
least_conn 本身只比较各 server 的当前活跃连接数,选出最小值;若多个 server 连接数相同,Nginx 才会参考 weight 值,优先选择 weight 更高的节点。这意味着:
- weight=5 和 weight=1 的两台服务器,如果前者连接数是 10、后者是 2,请求仍会落到连接数更少的后者上
- 只有当两者连接数同为 3 时,weight=5 的节点才更可能被选中
- 权重不会放大或缩放连接数,也不参与“连接数 × 权重”计算(那是商业版或某些第三方模块的行为)
让权重真正影响调度的实操方法
要使权重在 least_conn 场景下发挥实际调节作用,需从连接行为和节点状态入手,避免所有节点长期处于“连接数相同”的理想态:
- 控制 keepalive 连接复用粒度:上游 keepalive 设置过大会导致空闲连接长期占用计数,掩盖真实负载差异。建议设为 16–32,并确保后端开启连接池,让连接真正复用而非频繁新建/关闭
- 错峰上线新节点:新扩容服务器初始连接数为 0,容易被大量请求打满。可配合 slow_start 参数(如 slow_start=60s),让其权重在 60 秒内从 0 线性升至设定值,缓冲冷启动压力
- 主动剔除异常节点:仅靠连接数无法识别卡死服务。必须启用健康检查(如 ngx_http_upstream_check_module),对 /health 探针失败的节点临时摘除,防止其连接数低但实际不可用,干扰权重判断
配置示例与关键细节
以下是一个兼顾连接统计准确性与权重引导性的 upstream 配置:
upstream backend {least_conn;
server 10.0.1.10:8080 weight=3 slow_start=30s max_fails=2 fail_timeout=10s;
server 10.0.1.11:8080 weight=1;
server 10.0.1.12:8080 weight=2 backup;
keepalive 24;
}
说明:
- weight 影响的是“并列最空闲”时的选择倾向,不是硬性分配比例
- slow_start 防止新节点瞬间过载,max_fails/fail_timeout 提升容错能力
- keepalive 数值需与后端连接池大小匹配,避免连接堆积或过早释放
什么时候该换策略?
如果后端性能差异极大(比如 CPU 能力相差 5 倍以上),且请求处理时间高度不均,单纯 least_conn + weight 很难动态反映真实负载。此时建议:
- 升级到 Nginx Plus,使用原生 weighted_least_conn 算法(连接数 × 权重取最小)
- 或改用响应时间加权(third-party 模块如 nginx-upstream-healthcheck + 自定义指标上报)
- 在应用层做灰度路由,把长耗时请求定向到高配节点,短平快请求走 least_conn


















