Nginx轮询本身不自动清理废弃节点,需通过被动检查(max_fails=1 fail_timeout=5s+proxy_next_upstream)、主动健康检查(nginx_upstream_check_module探针)及运维协同(配置即代码、自动校验)实现等效清理。

明确区分:废弃节点 ≠ 故障节点
故障节点(如临时宕机)可通过 max_fails + fail_timeout + proxy_next_upstream 实现临时隔离;而废弃节点是**永久性退出服务、不应再被任何请求触达**的条目。Nginx 不会因“连不通”就从配置里删掉它,必须人工或自动化手段干预配置文件。
被动方式:靠失败判定让废弃节点自然“失活”
即使节点已废弃,只要还在 upstream 块中,Nginx 仍会尝试转发。要避免请求打过去,需强制启用失败感知:
- 每个
server行必须显式加上max_fails=1 fail_timeout=5s(短周期快速标记) - 在
location中配置proxy_next_upstream error timeout http_500 http_502 http_503 http_504 - 搭配
proxy_connect_timeout 3s; proxy_read_timeout 5s;缩短单次试探耗时 - 这样,首次请求即失败 → 立刻标记为 down → 后续请求跳过该节点,直到
fail_timeout到期再试一次(大概率仍失败)
主动方式:用健康检查提前识别并规避
被动检查依赖真实流量触发,对长期无人访问的废弃节点无效。更可靠的是主动探针:
- 使用
nginx_upstream_check_module(OpenResty 已内置,原生 Nginx 需编译) - 在 upstream 块中添加:
check interval=5 rise=1 fall=2 timeout=3 type=http uri=/health - 后端若已下线,/health 返回非 200 或超时 → Nginx 主动标记为 down,且状态页(
/status)可直观查看 - 注意:探针路径必须轻量、无副作用,禁用
/或业务接口
运维层面:配置即代码,杜绝手工残留
最根本的“清理”,发生在配置管理环节:
- 将 upstream 配置纳入版本控制(Git),每次节点变更走 PR + 自动化校验
- 用 Ansible/Terraform 动态生成 upstream 块,源数据来自服务注册中心(如 Consul、Nacos)或 CMDB
- 上线前执行脚本扫描:检查所有
server地址是否能curl -I --connect-timeout 2 http://ip:port/health,失败则报错阻断发布 - 定期巡检 Nginx error log,搜索
no live upstreams或高频connection refused,反向定位废弃条目
临时兜底:用 down 和 backup 标记过渡状态
在确认节点废弃但尚未删除配置时,可立即生效的标记方式:
-
server 192.168.1.100:8080 down;:永久屏蔽,不参与任何调度(包括重试) -
server 192.168.1.100:8080 backup;:仅当其他节点全不可用时才启用,适合灰度下线观察期 - 二者都无需 reload 即刻生效,比直接删配置更安全可控


















