需通过打点、压测、日志统计三步验证upstream策略实际分发效果:先用map为节点打标签并记录$backend_id,再按策略分别压测,最后用awk统计日志中各节点占比并与理论值比对。

直接测试不同 upstream 策略对后端节点的实际分发效果,关键不是看“请求有没有过去”,而是看每个策略下各节点被真实选中的比例是否符合预期——这需要把请求打点落到具体节点、隔离统计、再比对理论值。下面分三步说清楚怎么做。
一、为每个 upstream 节点打上可识别标签
不标记节点,就无法区分是 node-a 还是 node-b 接收了请求。必须用 $upstream_addr 或自定义 ID 埋点:
- 在
http块中用map将后端地址映射为易读 ID:
map $upstream_addr $backend_id {<br> default "unknown";<br> "10.0.1.10:8080" "node-a";<br> "10.0.1.11:8080" "node-b";<br> "10.0.1.12:8080" "node-c";<br>} - 定义日志格式,确保包含
$backend_id和$upstream_addr:log_format upstream_test '$remote_addr [$time_local] "$request" $status $upstream_addr $backend_id'; - 在对应
location中启用该日志:access_log /var/log/nginx/upstream-test.log upstream_test;
二、按策略分别配置并压测
每换一种 upstream 分配方式,都要单独 reload 并跑一次可控压测,避免交叉干扰:
- 轮询(默认):不加任何参数,三个节点理论上各占约 33%;
-
权重(weight):比如
server 10.0.1.10:8080 weight=2;+server 10.0.1.11:8080 weight=1;,预期 node-a 占比应接近 66%; - ip_hash:同一 IP 的所有请求应始终落在同一个节点,适合验证会话粘性;
- 用
wrk或ab发起固定请求数和并发数的压测:wrk -t4 -c100 -d30s http://your-domain/test-api
三、从日志中提取并验证实际命中分布
压测结束后,立即分析日志,看真实分发是否匹配策略设计:
- 统计各节点实际请求数:
awk '{print $7}' /var/log/nginx/upstream-test.log | sort | uniq -c | sort -nr - 算出百分比(例如 node-a 实际占比):
awk '$7 ~ /node-a/ {n++} END{printf "%.1f%\n", n/NR*100}' /var/log/nginx/upstream-test.log - 注意排除异常值:如果出现大量
unknown,说明某些请求没走 proxy_pass(比如被 rewrite 截断或匹配到其他 location);如果某节点始终为 0,检查其max_fails是否已触发熔断、或端口不通导致 Nginx 自动剔除。
只要日志能稳定记录 $upstream_addr,再配合简单 shell 统计,就能快速验证任意 upstream 策略的实际命中率。不需要改代码、不依赖第三方监控,轻量且可靠。


















