后端负载不均主因是策略与实际特征不匹配,需区分请求分配不均与真实压力不均;优先用least_conn应对性能差异、耗时波动或长连接;配健康检查防假存活;调优keepalive管理连接复用;按业务选分流逻辑。

后端负载不均,通常不是 Nginx “分错了”,而是所选策略与实际运行特征不匹配。关键要先区分是“请求流量分配不均”,还是“真实处理压力不均”——前者看日志中各节点请求数比例,后者需观察连接数、响应时间、CPU 等指标。
优先启用 least_conn 策略
当后端存在性能差异、接口耗时波动大,或大量使用长连接(如 WebSocket、文件上传、HTTP/2 流)时,轮询类策略容易导致连接堆积。least_conn 直接基于当前活跃连接数调度,新请求自动发给连接最少的节点,更贴近真实负载。
- 配置简单:在 upstream 块中直接写 least_conn;
- Nginx 1.15+ 支持加权 least_conn,可保留 weight 参数,能力更强的节点自然承接更多连接
- 不建议混用 ip_hash 或 hash $request_uri,否则会人为固化连接路径,加剧不均
补全健康检查,避免“假存活”吸流
一台后端进程僵死、TCP 端口仍通,但 HTTP 返回超时或 500,Nginx 默认轮询仍会持续转发——这会让本就吃紧的节点雪上加霜。
- 为每个 server 显式配置:max_fails=2 fail_timeout=10s,让 Nginx 主动标记并临时剔除异常节点
- 若后端提供 /health 接口,可用 nginx_upstream_check_module 实现主动探测(需编译安装)
- 配合 down 或 backup 标记,保留人工干预通道
收紧 keepalive 连接管理
后端开启 keepalive 后,一个 TCP 连接可能复用上百次请求,而轮询只管“派发次数”,不管“连接是否扎堆”。这时连接分布比请求数更能说明问题。
- 在 upstream 块中设置:keepalive 32;(建议值 16–64,按并发量调整)
- 在 location 中关闭与客户端的 keepalive:proxy_http_version 1.1; proxy_set_header Connection '';
- 后端同步调小 keepalive_timeout(如 Tomcat 的 keepAliveTimeout),防止空闲连接长期占位
按业务特征选择分流逻辑
固定访问模式会放大局部压力,需匹配策略缓解:
- 有登录态或依赖本地 session:用 ip_hash 保证粘性(注意 NAT 环境下 IP 集中问题)
- 静态资源多、CDN 缓存弱:用 hash $request_uri consistent; 提升缓存命中率
- 灰度发布或版本隔离:按请求头哈希,例如 hash $http_x_version;











