down 是 Nginx upstream 层的逻辑隔离开关,仅在流量调度层面即时、精准、可逆地切断请求,不终止服务或释放资源;适用于四层代理与健康检查场景,但不替代 K8s drain、不控制容器/节点状态,自动化脚本需含配置更新、语法校验、reload、下游验证及超时回滚。

用 down 参数实现集群节点安全下线,核心是把它当作 Nginx upstream 层的“逻辑隔离开关”,而非系统级或容器级的停机操作。它不涉及节点重启、服务终止或资源释放,只在流量调度层面做即时、精准、可逆的切断。自动化脚本要围绕这个定位设计,避免越界操作。
明确 down 的适用边界
down 只作用于 Nginx 的 upstream 配置中某台后端服务器,比如:
- 它不能替代 Kubernetes 的
cordon或drain,也不影响 Pod 调度或节点状态 - 它不适用于 Redis Sentinel、ZooKeeper 或 etcd 这类强一致性组件的节点下线流程
- 它对 Docker 容器、K8s Node、物理服务器本身无任何控制力,仅影响 Nginx 发起的出向请求
- 若你的架构中 Nginx 是四层代理(stream 模块)或未启用健康检查,down 仍生效;但若用了第三方模块(如 nginx-upstream-check),需确认兼容性
自动化脚本的关键步骤
一个可靠的 down 下线脚本应包含配置变更、验证、回滚三部分,不依赖人工干预:
-
动态生成配置行:根据输入参数(如 IP 和端口)拼接合法 server 行,例如
server 10.0.1.5:8080 down;,注意末尾分号和不可换行 - 原子化更新 upstream 块:用 sed 或 awk 替换原配置中对应 server 行,或借助 jinja2 模板渲染,避免直接追加导致重复
-
预检与 reload:执行
nginx -t校验语法,成功后再nginx -s reload;失败则退出并输出错误位置 - 下游验证:调用 curl 或 check_http 工具探测该节点是否已无新请求流入(如查看 access.log 最后 10 秒无匹配 IP 记录)
- 内置超时与回滚机制:设置最大等待时间(如 30 秒),若验证失败,自动还原配置并 reload 回退
与真实运维场景联动
单独用 down 不等于完成“节点下线”,它只是第一道流量闸门。脚本需嵌入更完整的流程中:
- 在 Kubernetes 场景中,可先用
kubectl cordon <node></node>阻止调度,再触发 Nginx down 脚本切走流量,最后才kubectl drain - 在滚动发布中,脚本可作为 CI 流水线的一个 stage:新版本就绪 → Nginx down 旧实例 → 等待连接自然耗尽 → 执行
docker stop或kubectl delete pod - 配合 PDB(PodDisruptionBudget),确保 down 操作期间,上游应用仍有足够副本提供服务,避免雪崩
规避常见陷阱
脚本易错点集中在配置格式与状态管理上:
- 不要把
down和backup、weight写在同一行后半段,Nginx 会解析失败 - 避免在 reload 前未备份原配置,导致故障无法快速恢复
- 不要假设 down 后节点“已下线”——它仍在运行,可能被其他路径(如直连、DNS 轮询)访问,需同步通知上下游
- 记得清理:维护完成后删掉 down 参数并 reload,否则重启 Nginx 后该节点会意外回归调度

















