nginx节点恢复后需依赖effectiveweight自动回升实现权重平滑过渡,前提是启用max_fails/fail_timeout被动健康检查;禁用down标记、reload及过小max_fails值,可避免破坏渐进性;主动健康检查模块能进一步提升恢复精准度。

节点恢复后,Nginx 默认不会“渐进式”恢复其权重,而是直接按配置值参与调度——这可能引发流量突增、响应延迟或连接堆积。要实现真正的权重平滑过渡(即刚恢复的节点先分得少量请求,随健康度提升逐步承载更多),需结合健康检查机制与权重动态调节逻辑,不能只靠静态 weight 配置。
依赖 effectiveWeight 的自动衰减与回升机制
Nginx 内部实际使用三个权重变量协同工作:weight(配置值)、effectiveWeight(运行时有效权重)、currentWeight(调度用的动态计数器)。其中 effectiveWeight 是实现平滑回归的关键:
- 节点异常时,Nginx 会自动将其
effectiveWeight逐次减 1(最低为 0),降低其被选中的概率 - 节点恢复后,每次成功转发请求,
effectiveWeight就加 1,直到回到原始weight值 - 这个过程是隐式发生的,无需 Lua 或外部脚本,但前提是启用了被动健康检查(
max_fails/fail_timeout)
配置必须启用被动健康检查
仅写 weight=5 不足以触发平滑过渡。必须为每个 server 显式添加故障探测参数:
-
max_fails=2:连续失败 2 次即标记为不可用 -
fail_timeout=5s:5 秒内不向该节点发新请求 - 示例:
server 192.168.1.10:8080 weight=5 max_fails=2 fail_timeout=5s;
这样,节点宕机期间 effectiveWeight 会持续下降;恢复后,只要开始成功响应,它就自动缓慢回升,调度器随之自然增加其请求占比。
避免手动干预破坏平滑性
以下操作会中断平滑过渡过程,应避免:
- 在 upstream 中对恢复节点加
down标记——这会让 Nginx 完全跳过它,且不会自动清除 - reload 配置重置所有节点的
effectiveWeight到初始值——相当于“一键满血”,失去渐进效果 - 将
max_fails=1设得过激——容易因单次网络抖动误判,导致频繁升降权,反而抖动
补充:主动健康检查可加速感知与回归
若需更快速、更可控的恢复节奏,建议引入 nginx_upstream_check_module:
- 配置
check rise=3 fall=2 interval=3000:连续 3 次探活成功才视为真正恢复 - 配合后端轻量级
/health接口,确保探针响应快、不带业务逻辑 - 该模块虽不直接暴露
effectiveWeight,但通过控制“是否纳入调度池”,间接实现比被动检查更精准的流量释放节奏











