nginx 实现后端自动恢复需主动健康检查+合理rise/fall阈值+无干预回归:启用nginx_upstream_check_module,设check interval=3 rise=2 fall=3 timeout=1 type=http uri=/health,配default_down=true,禁用server down参数,调优fail_timeout与max_fails,并配套可观测性与backup兜底。

要让 Nginx 在后端节点异常后自动恢复,关键不是等它“自己好起来”,而是靠主动探测 + 合理阈值 + 无干预回归三者配合。被动检查只能响应失败,无法提前发现僵死;真正实现“自动恢复”,必须启用主动健康检查,并确保节点在真实可用时能被安全、及时地重新纳入流量池。
启用主动探测并设对 rise 值
主动检查是自动恢复的前提。Nginx 开源版需借助 nginx_upstream_check_module(OpenResty 已内置)实现定时探活:
- 在
upstream块中添加:check interval=3 rise=2 fall=3 timeout=1 type=http uri=/health; - rise=2 表示连续两次成功才标记为 up,避免单次网络抖动或 GC 暂停导致误恢复
- 探测路径应为轻量接口(如 Spring Boot 的
/actuator/health),响应时间控制在 200ms 内 - 务必配
default_down=true,防止 Nginx 启动时把未就绪的节点当健康节点用
避免手动干预,禁用 down 标记
一旦节点被标记为 down,若配置了 server ... down;,该节点将永久退出轮询,除非人工删掉 down 并重载配置:
- 所有后端 server 行不要加
down参数 - 让健康检查机制全权负责状态变更:
fall触发摘除,rise触发回归 - 验证回归是否生效:用
curl -I http://vip/status查看check_status页面,或观察请求是否实际打到刚恢复的 IP
调优 fail_timeout 与 max_fails 实现秒级回归
被动参数也影响恢复节奏。即使启用了主动检查,fail_timeout 仍决定“试探性重试”的间隔:
- 设
max_fails=2 fail_timeout=5s:节点被主动剔除后,5 秒内若通过 rise 检查,立即回归;若未通过,则继续等待下一轮探测 - 不建议设
fail_timeout过长(如 60s),否则即使健康检查已判定恢复,Nginx 仍会延迟尝试 - 对于高可用 API 网关,可进一步缩短至
fail_timeout=2s,配合interval=2s实现亚秒级恢复
配套可观测与兜底,防止“假恢复”
自动恢复不是终点,还要防错判和雪崩:
- 暴露
/status接口(如location /status { check_status; }),接入 Prometheus 或 Zabbix 监控节点状态变化 - 后端健康端点返回内容应含业务逻辑判断(如 DB 连通性、缓存连通性),不能只返回 HTTP 200
- 始终配置
backup节点:server 127.0.0.1:8080 backup;,应对全部后端短暂不可用 - 在
server块中定义error_page 502 503 504 /maintenance.html;,提供友好降级页











