加权轮询日志统计失真是因配置、状态或观测干扰权重落地,需从配置合规性、后端等效性、日志真实性三方面排查:确保upstream仅含weight参数且无其他负载策略;各节点max_fails等健康参数一致并显式声明;通过error.log、access.log和健康探测验证节点可用性;使用结构化日志采集足够样本(≥100次)并比对理论权重偏差(±3%内合理)。

加权轮询日志中统计数量失真,不是算法本身出错,而是配置、状态或观测方式干扰了权重意图的落地。排查要从“配置是否真按权重运行”“后端是否真被等效对待”“日志是否真反映实际分发”三方面切入。
检查 upstream 配置是否混入非加权逻辑
加权轮询要求所有 server 行只保留 weight 参数,其他修饰会覆盖或扭曲权重行为:
- 确认没有启用 ip_hash、hash $arg_id、least_conn 等指令——哪怕注释掉也不行,必须整行删除
- 删掉所有 backup、down、max_fails 不一致的配置;若要用健康检查,必须为每台 server 显式写上相同参数,例如:server 192.168.1.10:8080 weight=3 max_fails=2 fail_timeout=15s;
- 避免部分 server 写了 weight、部分没写:Nginx 会把未写 weight 的默认为 1,但混合存在易引发理解偏差;建议全部显式声明,如 weight=1、weight=2、weight=3
验证后端节点是否处于“可用且稳定”的等效状态
权重再合理,节点频繁被摘除也会导致统计严重偏斜:
- 查看 Nginx error.log,搜索 "upstream temporarily disabled" 或 "max_fails",确认是否有节点因超时/失败被临时踢出
- 对比各后端 access.log 中的请求量与 Nginx upstream 日志中的 $upstream_addr 字段计数,若某台长期无记录,说明它已不在轮询队列中
- 用 curl 手动探测每台后端健康接口(如
curl -I http://192.168.1.10:8080/health),确认响应时间、状态码、连接稳定性一致
用结构化日志+足够样本量做真实分发归因
别只看平均值或前几次请求,加权轮询是周期性分配,需可观测、可统计的日志支撑:
- 在 http 块定义带 upstream 地址的日志格式:log_format weighted_log '$remote_addr - [$time_local] "$request" $status $upstream_addr $request_time';
- 在 location 中启用:access_log /var/log/nginx/weighted.log weighted_log;
- 发起至少 100 次以上请求(用脚本循环 curl 更可靠),再用命令统计:awk '{print $8}' /var/log/nginx/weighted.log | sort | uniq -c | sort -nr
- 对照理论权重比(如 weight=3:2:1 → 理论占比 50% : 33.3% : 16.7%),允许 ±3% 偏差;若某台偏差超 10%,优先查它是否被静默剔除或响应异常











