nginx加权轮询在弱网下的容错表现取决于健康检查、权重调度与重试策略协同:需用短连接压测,配置max_fails/fail_timeout实现故障剔除,通过access_log和stub_status验证节点规避与恢复行为。

测试 Nginx 加权轮询在弱网或高延迟节点上的容错表现,关键不是看“权重是否按比例分发”,而是观察当某个后端响应变慢、超时甚至间歇性失败时,Nginx 是否仍能维持稳定调度、避免流量持续打向异常节点,以及是否及时规避故障——这本质上是验证 健康检查 + 权重调度 + 重试策略 三者的协同效果。
用短连接压测模拟弱网干扰
避免 keepalive 复用掩盖问题:客户端复用连接会让 Nginx 倾向复用已有后端连接,掩盖轮询和故障转移逻辑。应强制使用短连接测试:
- 用
wrk或ab发起无 keepalive 的请求,例如:wrk -t4 -c10 -d30s --timeout 2s http://nginx-proxy/(超时设为 2s,比默认更敏感) - 后端服务可人工注入延迟,比如在某台节点上用
sleep(3)模拟高延迟,或直接iptables -A OUTPUT -p tcp --dport 8080 -j DROP模拟丢包 - 观察 access log 中
$upstream_addr和$upstream_response_time,重点关注超时后是否重试、重试是否跳过慢节点、重试次数是否可控
开启并校验健康检查行为
加权轮询本身不带容错能力,必须依赖 max_fails / fail_timeout 才能动态剔除异常节点:
- 确保所有
server行统一启用健康检查,例如:server 192.168.1.10:8080 weight=3 max_fails=2 fail_timeout=15s; - 临时将某节点设为高延迟(如返回 3s 延迟),持续发起请求,检查 error.log 是否出现类似
upstream timed out (110: Connection timed out) while connecting to upstream,并确认该节点在后续 15 秒内不再出现在$upstream_addr中 - 注意:若某节点未配
max_fails,即使它已开始超时,Nginx 仍会按权重持续转发,造成“假健康”
验证重试机制是否合理避让
Nginx 默认会在失败时重试(最多一次,除非显式配置 proxy_next_upstream_tries),但重试逻辑可能破坏权重预期:
- 在
location块中明确控制重试行为,例如:proxy_next_upstream error timeout http_500;proxy_next_upstream_tries 2;proxy_next_upstream_timeout 3s; - 配合日志格式,添加
$upstream_http_x_request_id或自定义 header 标识首转目标,避免把重试日志误统计为“该节点承接了更多流量” - 对比开启/关闭
proxy_next_upstream时的 502 分布:若关闭后 502 集中在慢节点,开启后明显分散,则说明容错生效
结合 stub_status 实时观察节点状态
启用 stub_status 后,访问 /nginx_status 可看到每个 upstream server 的实时请求数、失败数、健康状态:
- 手动制造一个节点延迟,观察其
fails计数是否上升、unavail是否变为 1 - 等待
fail_timeout过期后,再发请求,确认该节点重新进入可用列表且请求数缓慢回升(而非瞬间满负荷) - 若某节点长期
unavail=1但错误日志无对应记录,可能是max_fails设得过高,或健康检查探针路径(health_check)未正确配置











