验证nginx加权轮询需通过日志统计$upstream_addr、state文件解析、prometheus指标归一化或curl响应头校验,对比实际请求分布与配置权重(如3:2:1对应50%:33%:17%)是否一致,排除健康检查、缓存等干扰。

要验证Nginx加权轮询是否按配置权重真实分流,不能只看配置是否写对,关键得看请求实际落到哪台后端、频次是否符合预期比例。监控重点是“请求分布率”与“配置权重比”的一致性,同时排除健康检查剔除、缓存干扰或日志延迟等偏差因素。
通过Nginx访问日志统计请求分布
这是最直接、无需额外组件的方式。前提是每台后端服务器在响应头中注入唯一标识(如X-Server-ID),或你在Nginx中用$upstream_addr记录真实转发目标。
- 在
log_format中加入$upstream_addr字段,例如:log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$upstream_addr"' - 重启Nginx后,用
awk快速统计各节点接收请求数:awk '{print $12}' /var/log/nginx/access.log | sort | uniq -c | sort -nr - 对比结果与权重比:若配置为
server A weight=3; server B weight=2; server C weight=1,理想分布应接近 50% : 33% : 17%,允许±5%波动(受请求并发、短连接影响)
利用Nginx内置状态页(需启用stub_status)
该方式实时性强,但只能看到当前活跃连接数和总处理请求数,不直接显示各节点分流明细。可配合upstream块中启用state文件做辅助验证。
- 在
upstream中添加state /var/run/nginx-upstream-state.conf;,Nginx会持续写入各server的访问计数、失败次数、当前权重等 - 该文件是文本格式,可定时用脚本解析,例如提取
server 192.168.1.10:80 weight=3后的max_fails=2 fail_timeout=30s及累计请求量 - 注意:
state文件中的计数是自上次reload以来的累积值,不是实时QPS;需定期清空或差值计算才能观察单位时间分布
对接Prometheus+Exporter实现可视化比对
适合中大型部署,能长期追踪权重生效稳定性,并关联后端响应延迟、错误率等维度交叉分析。
- 使用
nginx-vts-exporter或nginx-prometheus-exporter采集指标,重点关注nginx_upstream_requests_total{upstream="backend", server="192.168.1.10:80"}这类带server标签的计数器 - 在Grafana中建立面板,用
rate(nginx_upstream_requests_total[5m])计算各节点5分钟请求速率,再归一化为百分比 - 设置告警规则:当某节点实际占比连续10分钟偏离配置权重±15%,触发检查——可能是该节点被健康检查临时剔除,或weight被动态修改未同步
人工模拟请求+响应头校验(小流量验证必备)
上线前或调参后,用可控请求快速验证逻辑是否生效,避免依赖日志聚合延迟。
- 让每台后端在HTTP响应头中返回自身标识,例如
X-Node: app-server-01 - 用
curl -I发起20–30次请求,逐条记录X-Node值:for i in {1..30}; do curl -sI http://your-domain.com/ | grep "X-Node"; done | sort | uniq -c - 若权重为3:2:1,30次请求中应大致出现15次、10次、5次——这个方法能立刻发现配置未加载、语法错误或
upstream名称拼写不一致等低级问题











