要实现backup节点自动化灾备降级,需联动健康检查、重试策略与错误拦截:为主节点配置max_fails=1和fail_timeout=3s,启用proxy_next_upstream处理5xx等错误,并为backup节点同样配置健康参数,跨协议场景则用error_page兜底。

要让 upstream 中的 backup 节点真正实现自动化灾备降级,不能只加一个 backup 关键字就完事。它本身是“静态标记”,不主动探测、不自动触发、不感知状态——必须和健康检查、重试策略、错误拦截三者联动,才能在主节点出问题时秒级切到备用节点,且主恢复后自动回切。
必须给主节点配被动健康检查
backup 不会自己启动,前提是 Nginx 认定所有非 backup 节点都不可用了。而 Nginx 默认只靠请求失败来标记节点 down,所以得显式配置:
-
max_fails=1:只要 1 次失败(连接超时、502/503/504、拒绝连接等)就标记为不可用 -
fail_timeout=3s:该节点被标记 down 后,3 秒内不再发请求;超时后自动试探一次,成功即恢复 - 参数要写在每个主节点的
server行末尾,例如:server 192.168.1.10:8080 max_fails=1 fail_timeout=3s;
启用 proxy_next_upstream 控制重试行为
默认情况下,Nginx 只对网络层错误(如 connect timeout)重试,HTTP 层错误(比如后端返回 500)会被直接返回给用户。要让它把 5xx 也当作故障并尝试下一个节点,需在 location 块中配置:
proxy_next_upstream error timeout http_500 http_502 http_503 http_504-
proxy_next_upstream_tries 2:最多总共尝试 2 次(含首次),避免卡死 -
proxy_next_upstream_timeout 5s:整个重试过程总耗时上限,防长尾
backup 节点也要设健康参数,防雪崩
很多人忽略一点:backup 节点一旦被启用,它自己也可能出问题。如果不加保护,Nginx 会持续往一个已失效的 backup 上转发请求,导致服务彻底不可用。
- 建议同样给 backup 节点加上
max_fails=1 fail_timeout=3s - 多个 backup 节点之间按轮询或权重调度,提升备用链路自身可用性
- 若所有节点(包括 backup)都不可达,Nginx 会直接返回 502 或 503,不会无限重试
跨协议/跨域名场景用 error_page 做兜底
当 backup 源站不是同个 upstream(比如主源是 HTTP,backup 是 HTTPS 或本地文件),就不能只靠 backup 标记。此时要用 error_page 拦截错误,跳转到独立 location:
- 在主 location 中写:
error_page 502 503 504 = @backup_origin; - 另起一个
location @backup_origin,里面用proxy_pass指向备用地址 - 这样可灵活支持不同协议、不同域名、甚至返回本地静态页或 JSON 降级响应











