加权轮询权重不生效的根本原因多在配置加载错误、健康检查干扰或日志验证偏差:需确认upstream配置位于http块内且已reload生效;排除ip_hash等策略覆盖及max_fails导致节点被标记down;必须通过access_log中$upstream_addr精确统计实际分发比例验证。

加权轮询权重不生效,通常不是 weight 参数本身写错了,而是 Nginx 没有按预期把请求分发到高权重节点——根本原因多在配置加载、健康检查干扰或日志验证方式偏差上。
确认 upstream 配置已正确加载并生效
weight 是 upstream 块内 server 指令的属性,必须确保: • 配置写在 http 块内,且被 include 或直接写入主配置; • 修改后执行 nginx -t 校验语法,再用 nginx -s reload 重载(不是 restart); • 检查是否误将 weight 写在 location 或 server 块里——这类位置不支持 weight,会被忽略; • 若使用了 ip_hash、least_conn 等其他调度策略,会覆盖加权轮询,需确认 upstream 块中未混用。
排除健康检查导致的“权重失效”假象
Nginx 默认开启被动健康检查:某台 server 连续失败(如 Connection refused、timeout),会被临时标记为 down,即使 weight=10 也不会转发请求。表现就是“高权重机器完全收不到流量”。 • 查看 error.log 中是否频繁出现类似 "upstream connect failed" 或 "no live upstreams" 的记录; • 运行 curl -s http://localhost/status?json(需启用 stub_status)或检查 nginx -T | grep -A5 "upstream" 输出,确认各 server 的 state 是否为 up; • 临时关闭健康检查验证:在 server 行后加 max_fails=0 fail_timeout=0,观察权重是否恢复作用。
用 access_log 精确验证实际分发比例
别只看请求数大致感觉,要靠日志算真实分布: • 在 log_format 中加入 $upstream_addr 和 $upstream_bytes_received; • 发起足够请求(建议 ≥1000 次),用 awk 统计各后端 IP 出现频次: awk '{print $9}' access.log | sort | uniq -c | sort -nr • 若 weight=3:2:1 的三台机器,实际请求比接近 50% : 33% : 17%,说明权重生效;若全部接近 33%,大概率是 upstream 未生效或全被标记为 down。
检查是否被 proxy_pass 路由逻辑绕过 upstream
常见低级但高频的失误: • location 中写的是 proxy_pass http://192.168.1.10:8080(直连 IP),而非 proxy_pass http://weighted_pool(引用 upstream 名); • upstream 名称拼写错误,比如定义为 weighted_backend,但 proxy_pass 指向 weighted_pool; • 使用了 rewrite + break,导致请求未进入目标 location,也就没走 upstream; • 启用了 cache 或 try_files,部分请求被本地响应,未触达 upstream。


















