
在 Nginx 轮询策略中排除临时维护的节点,最直接、立即生效的方式是使用 down 参数显式标记该节点。它不依赖健康检查或失败计数,配置后 Nginx 会立刻跳过该 server,不再分发任何新请求,同时已建立的连接仍可正常处理完——真正实现“零流量切入、平滑下线”。
用 down 参数临时屏蔽节点
只需在 upstream 块中对应 server 行末尾添加 down,无需重启 Nginx,重载配置(nginx -s reload)即可生效:
- 示例配置:
upstream backend {<br> server 192.168.1.101:8080;<br> server 192.168.1.102:8080 down;<br> server 192.168.1.103:8080;<br>} - 该节点将完全退出轮询队列,
$upstream_addr日志中不会出现其 IP - 已存在的长连接或正在处理的请求不受影响,自然结束
配合 weight=0 实现渐进式下线
若需更柔和地减少某节点流量(比如观察负载下降趋势),可用 weight=0 替代 down:
- weight=0 表示该节点不参与轮询分发,但仍在健康检查范围内(max_fails/fail_timeout 仍起作用)
- 适合计划内维护前的预降级:先设 weight=0,确认无新请求进入,再加 down 或直接停服务
- 注意:不能与 down 同时使用,否则 down 优先级更高,weight 被忽略
避免误操作的关键提醒
临时维护场景下,有些做法看似合理实则风险高:
- 不要仅靠停掉后端服务来“等待自动剔除”——被动健康检查有延迟(需 max_fails 次失败),期间请求仍会打到故障节点
- 不要删掉 server 行再 reload——会导致配置变更、可能引发 reload 失败,且无法快速恢复
- 不要依赖 backup 标记做维护隔离——backup 只在所有主节点不可用时才启用,不符合“主动屏蔽”意图
恢复节点的正确操作
维护结束后,只需移除 down(或改回 weight=1),reload 配置即可:
- Nginx 不会缓存 down 状态,reload 后该节点立即回归轮询队列
- 无需等待 fail_timeout 或试探周期,响应即时
- 建议搭配 slow_start=30s 使用,防止刚上线就承接全量流量(尤其在高并发场景)











