验证Nginx加权轮询是否按预期比例分流,关键在于真实流量下统计$upstream_addr分布:需正确配置weight、禁用健康检查干扰、用wrk等工具发起高并发短连接压测,并通过awk分析access_log中各后端请求频次,偏差超3%时应排查ip_hash、后端异常或版本兼容性问题。

要验证 Nginx 加权轮询(weight)在高并发压测下是否真正按预期比例分流,不能只看配置是否写对,关键在于**真实流量下的响应分布统计**。Nginx 本身不直接暴露每秒到各 upstream 的请求数,需结合日志、压测工具和简单分析手段交叉验证。
1. 确保 upstream 配置正确且可区分
在 upstream 块中明确设置 weight,并为每个后端加可识别标识(如不同端口或 host header),便于后续日志归因:
upstream backend {
server 127.0.0.1:8001 weight=3;
server 127.0.0.1:8002 weight=1;
server 127.0.0.1:8003 weight=1;
}注意:weight 是相对值,上述配置理论期望分流比为 3:1:1(即 60% : 20% : 20%)。确保后端服务本身无长连接复用干扰(如压测时禁用 keepalive 或控制连接数),避免连接池掩盖真实调度行为。
2. 启用并定制 access_log 记录上游信息
在 server 或 location 块中,用 $upstream_addr 和 $upstream_response_time 记录每次请求实际转发的目标:
log_format upstream_log '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$upstream_addr $upstream_response_time $request_time';重启 Nginx 后,每条日志末尾会追加类似 127.0.0.1:8001 0.002 0.005 的字段,清晰标识本次请求由哪个后端处理。
3. 使用压测工具发起稳定高并发请求
推荐使用 wrk 或 hey(避免 ab,因其 HTTP/1.0 默认不复用连接,易导致轮询失真):
- 用 wrk 模拟 100 并发、持续 60 秒:
wrk -t4 -c100 -d60s http://your-nginx-host/ - 确保压测期间无其他流量干扰,Nginx 无 reload、后端无重启
- 若后端响应时间差异大(如某台慢 10 倍),Nginx 默认会临时降权(
max_fails/fail_timeout),需关闭该机制做纯权重验证:max_fails=0 fail_timeout=0
4. 日志统计与偏差判断
压测结束后,快速统计各后端被选中的次数:
# 提取 upstream_addr 字段,去空、去超时标记(*表示失败),排序计数
awk '{print $12}' /var/log/nginx/access.log | grep -v '\*' | sort | uniq -c | sort -nr输出类似:
12045 127.0.0.1:8001 4012 127.0.0.1:8002 4008 127.0.0.1:8003
计算实际占比(12045 / 20065 ≈ 59.9%,其余各≈20.0%),误差在 ±0.5% 内属正常。若偏差>3%,需检查:
- 压测时间是否足够长(建议 ≥30 秒,避开初始冷启动抖动)
- 是否启用了
ip_hash或hash $request_uri等覆盖策略 - 后端是否有主动拒绝连接(触发 Nginx 临时摘除)
- Nginx 版本是否过低(1.9.1+ 对 weight 调度逻辑更稳定)
不复杂但容易忽略的是:加权轮询是“请求级”调度,不是“连接级”。只要压测工具正确复用连接(HTTP/1.1 + keep-alive),Nginx 会在每个新请求时重新按权重选择后端——这才是验证的基础。


















