weight=0是Nginx中实现逻辑隔离而非物理下线的机制,节点不参与请求分发但持续接受健康检查,适用于临时摘流并保留可观测性的场景,如升级维护、JVM预热或灰度验证。

weight=0 的节点不参与常规请求分发,但会持续接受健康检查探测——它被逻辑隔离,而非物理下线。
weight=0 的真实作用
设为 0 并不是“禁用”或“删除”,而是告诉 Nginx:这台机器暂时不承接业务流量,但仍需保持监控状态。它仍会出现在 upstream 列表中,健康检查(如 max_fails / fail_timeout)照常运行,响应状态也会被记录。
- ✅ 请求不会路由到该节点(即使其他节点全挂,也不会 fallback 到 weight=0 的节点)
- ✅ 健康检查探针(如 /health 接口)仍会定期发起,便于运维观察其恢复进度
- ❌ 它不能和 backup 同时使用——backup 是备用兜底角色,而 weight=0 是主动剔除角色,二者语义冲突
什么场景适合设 weight=0
适用于需要临时摘流、又不想中断可观测性的维护操作:
- 后端正在升级数据库 schema,接口可能短暂不可用,但希望保留日志和探活链路
- 某台机器刚重启,需等待 JVM 预热或缓存加载完成,先隔离再逐步放量
- 灰度验证中发现兼容性问题,快速切走流量,同时保留 trace 和指标对比能力
配置写法与常见误区
必须严格写在 server 行末,且只能是正整数或 0:
- ✅ 正确:
server 192.168.1.200:8080 weight=0; - ❌ 错误:
server 192.168.1.200:8080; weight=0;(Nginx 启动报 unknown directive) - ❌ 错误:
weight=0.5或weight=-1(只接受非负整数,小数和负数均非法)
注意:weight=0 节点的 slow_start、max_fails 等参数依然生效,但因无请求进入,fail_timeout 实际不会触发剔除动作。
weight=0 和 backup 的关键区别
两者目标相似(减少主流量),但机制完全不同:
- weight=0:彻底退出轮询池,永不接收业务请求;健康检查持续,适合“观察式隔离”
- backup:默认不参与任何分发,仅当所有非 backup 节点都失败时才启用;适合灾备兜底,不是日常隔离手段
若想实现“先隔离、恢复后自动回归”,应优先用 weight=0 + 健康检查;若想实现“主挂了才用它”,才用 backup。


















