最可靠方式是直接压测上游入口并统计downstream实际请求分布;加权轮询仅作用于直连upstream,需逐跳验证nginx配置、关闭干扰策略、用日志精准统计分发比。

直接压测上游入口并统计 downstream 的实际请求分布,是最可靠的方式。加权轮询本身不感知微服务层级,只作用于它直连的 upstream 后端;所谓“多级嵌套”中的权重效果,必须落到每一跳 Nginx 的具体 upstream 配置上逐层验证。
明确测试边界:只测当前 Nginx 的 upstream 分发行为
微服务链路如 Client → Nginx-A → Service-B → Nginx-C → Service-D,Nginx-A 的加权轮询只决定发给哪些 Service-B 实例,和 Nginx-C 无关。要验证“转发比”,只需聚焦 Nginx-A 的 upstream 定义与它背后真实的 Service-B 节点列表:
- 确认 upstream 块中每个 server 行的 weight 值(例如 weight=3、weight=1、weight=2)
- 确保这些 server 指向的是 Service-B 的真实实例 IP+端口,而非域名或抽象服务名(避免 DNS 缓存干扰)
- 关闭其他干扰策略:删掉 ip_hash、hash $request_uri 等非轮询指令,保证纯加权轮询生效
用可控请求 + 日志精准统计分发比例
不依赖后端返回或链路追踪 ID,直接从 Nginx 自身日志反推实际调度结果:
- 在 Nginx 配置中启用 upstream_addr 字段记录:log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$upstream_addr" $request_time;'
- 用 wrk 或 hey 发起至少 1000 次以上无缓存、带唯一 query 参数的请求(如 ?t=123456),避免代理或客户端复用连接影响轮询节奏
- 压测结束后,提取 access.log 中所有 $upstream_addr 值,按 IP:port 分组计数,计算各节点占比
例如权重为 3:1:2 的三节点,实测应接近 50% / 16.7% / 33.3%,偏差超过 ±3% 就需检查配置是否 reload 成功、是否有健康检查临时剔除节点等。
穿透多级时的分层验证法
若整条链路含多个 Nginx 跳转(如 A→B→C),不能只看最终后端,而要逐跳验证:
- 先固定 Nginx-B 的 upstream 为静态 IP 列表,关闭其健康检查,单独压测 Nginx-A,确认 A 层分发比符合预期
- 再将 Nginx-A 固定打向单个 Service-B 实例,对该实例发起请求,观察它转发到 Nginx-C 的日志中 upstream_addr 分布
- 每跳都用相同方法:控制输入、采集日志、统计输出,避免把上一级的不均等误判为下一级权重问题
注意真实环境干扰项
以下情况会导致测试结果偏离理论权重,需提前排除:
- keepalive 连接复用:长连接下,一个 client 可能始终落在同一后端,压测要用短连接(wrk 加 --connection-timeout 1s)或高并发多 client 模拟
- 被动健康检查触发:max_fails 导致某节点被临时摘除,日志里会显示 upstream_addr 为空或 fallback 地址,需检查 error.log 中 health check 相关报错
- 后端主动拒绝或超时:proxy_next_upstream 配置会让失败请求重试另一节点,扭曲原始分发比,测试期间可临时注释该行











