least_conn能有效缓解硬件差异导致的负载不均和雪崩,因其按后端活跃连接数分配请求,配合健康检查、连接复用、限流及非幂等操作禁重试,可避免低配节点过载崩溃并拖垮集群。

用 least_conn 替代轮询,再配合健康检查与连接复用,就能有效缓解硬件差异引发的负载不均和雪崩。
为什么轮询在硬件差异下会失效
轮询只按顺序分发请求,完全不感知后端真实负载。当一台低配机器响应慢、连接堆积时,它仍会持续收到新请求,而高配机器可能空闲——流量越分越歪,压力越积越重,最终低配节点率先崩溃,连锁拖垮整个集群。
启用 least_conn 并验证效果
- 在 upstream 块中明确声明:
least_conn;,禁用ip_hash或weight等冲突策略 - 必须搭配
keepalive 32;(数值按连接池大小调整),并在对应 location 中启用 HTTP/1.1 和 Connection 头,否则连接无法复用,least_conn 失去意义 - 用
curl -I http://your-domain/api多次请求,再查 Nginx access_log 中的$upstream_addr字段,确认请求确实倾向落在活跃连接更少的节点上
叠加主动健康检查防“假存活”
硬件差异大时,部分节点可能 CPU 高、连接满但 HTTP 健康接口仍返回 200。仅靠被动失败切换(proxy_next_upstream)已滞后。
- 在 upstream 块内添加:
health_check interval=3 fails=2 passes=2; - 检查路径应真实反映业务可用性,例如:
check_http_expect_alive 2xx 3xx;,避免用空 /health 接口 - 同时配置
max_fails=2 fail_timeout=30s,形成双重判断:既防偶发抖动,也兜底健康检查失效场景
前置限流+禁用非幂等重试
硬件差异放大了单点瓶颈,一次超时若盲目重试,等于把压力翻倍打向本就吃紧的节点。
- 对 POST、PUT、DELETE 等非幂等操作,设
proxy_next_upstream_tries 1,彻底关闭重试 - 如需重试(如 GET 查询),仅开启
error timeout http_502 http_503 http_504,禁用http_500和所有 4xx - 在 proxy_pass 前的 location 中配置
limit_req,控制单位时间请求数,给后端留出喘息窗口











