nginx动态下线服务器的核心是控流+draining+状态隔离:用down参数静态隔离、weight=0灰度摘流、健康检查自动剔除、backup节点无缝接管,实现新请求不进、存量请求走完、业务无感知。

在线动态下线 upstream 中的服务器,核心目标是:新请求不进、存量请求走完、业务无感知。Nginx 本身不自动“优雅”,但通过组合配置可稳定达成——关键不在“停”,而在“控流+ draining + 状态隔离”。
用 down 参数快速静态隔离(最轻量)
适合已确认故障或需立即摘除的节点,无需探测、不依赖模块、reload 即生效:
- 在 upstream 块中对应 server 行末尾直接加 down,例如:
server 192.168.1.20:8080 weight=3 down; - 确保 down 写在地址端口之后、分号之前;不能与
max_fails、fail_timeout等混用 - reload 后该节点彻底退出调度链路:不收新请求、不被健康检查探测、不参与故障转移
- 恢复时删掉 down,再 reload,流量秒级回归
用 weight=0 实现灰度摘流(兼容性最强)
适用于计划内维护,希望逐步减少流量并观察影响:
- 将目标节点 weight 设为 0:
server 192.168.1.20:8080 weight=0; - 执行
nginx -s reload,Nginx 不再向其分发新请求,但已建立的长连接仍可完成处理 - 配合
proxy_read_timeout 60和proxy_ignore_client_abort on,避免中断后端正在处理的请求 - 观察 access_log 停止增长、active connection 归零后再停服务
启用主动健康检查自动剔除(适合常态防护)
依赖 nginx_upstream_check_module 模块,实现故障自动识别与切换:
- 配置周期探测:
check interval=3 rise=2 fall=3 timeout=1 type=http; - 发送轻量探针:
check_http_send "HEAD /health HTTP/1.0\r\n\r\n"; - 定义存活状态:
check_http_expect_alive http_2xx http_503;(含 503 才能识别主动下线) - 节点返回 503 或超时连续失败达 fall 次数,自动标记为 down 并剔除
- 注意:手动设的
down或backup优先级高于 check 结果
结合 backup 节点实现无缝接管
当主节点下线时,流量自动切到备用机,避免单点风险:
- 在 upstream 中声明 backup 节点:
server 192.168.1.25:8080 backup; - 正常情况下 backup 完全静默:不轮询、不建连、不探测
- 仅当所有非 backup 节点均不可用(down 或 check 失败)时,backup 才被激活
- 可用于灾备、灰度发布或主备切换场景,无需额外脚本干预











