将节点 weight 设为 0 是软摘除机制:不参与请求分发但持续接受健康检查,无需 reload 即生效,恢复时改回正整数即可;须写在 upstream 的 server 行末尾,适用于临时降级而非故障兜底。

把某个节点权重设为 0,Nginx 会将其从当前轮询队列中移除——它不再接收任何新请求,但依然保留在 upstream 块中,并持续接受健康检查探测。
weight=0 的真实行为
这不是“下线”或“删除”,而是一种软摘除机制:
- 该节点完全不参与请求分发,流量为 0%
- 仍被 health check(如
max_fails/fail_timeout或第三方模块的check指令)主动探测,便于观察是否恢复 - 无需 reload 即可生效:改完 weight=0 后执行
nginx -s reload,配置即刻切换 - 恢复时只需改回正整数(如 weight=1),健康检查通过后自动回归流量池
正确配置方式
必须写在 upstream 块内的 server 行末尾,且不能换行、不能独立成行:
- ✅ 正确:
server 10.0.0.5:8080 weight=0; - ❌ 错误:
server 10.0.0.5:8080;weight=0;(语法报错) - ❌ 错误:
location / { proxy_pass http://backend; weight=0; }(weight 不在 location 上下文生效)
适用场景与注意事项
weight=0 主要用于临时降级或灰度观察,不是故障兜底方案:
- 适合 CPU 飙高、GC 频繁、日志打满等“尚能响应但不宜承压”的状态
- 不等于
down:后者彻底屏蔽健康检查,weight=0仍保持心跳可见 - 不触发
backup切换逻辑:backup 节点只在所有非 backup 节点都不可用时启用,weight=0 的节点仍算作“可用但不参与轮询” - 若需彻底隔离(连健康检查都停),应配合注释掉该 server 行或使用外部脚本管理配置
验证是否生效
上线后建议快速确认:
- 查 access log:对比各后端 IP 出现频次,weight=0 的节点应无新请求记录
- 查 Nginx 状态页(需启用
stub_status)或 OpenResty 共享字典,观察连接数是否归零 - 手动 curl 健康检查路径(如
/health),确认该节点仍返回 200











