Nginx通过upstream模块的max_fails、fail_timeout和proxy_next_upstream实现被动式故障转移,支持自动剔除异常节点、请求重试及backup备用服务器接管;主动健康检查需nginx-plus或OpenResty等扩展。

在 Nginx 中实现负载均衡集群的故障转移(Failover),核心是利用 upstream 模块的健康检查机制与容错参数,让 Nginx 自动跳过不可用后端节点,将请求转发给健康的服务器。Nginx 本身不提供主动心跳探测(需配合第三方模块或外部工具),但通过内置参数已能实现基础且可靠的被动式故障转移。
配置 upstream 实现自动故障剔除
在 http 块中定义 upstream 组,使用 max_fails 和 fail_timeout 控制故障判定逻辑:
- max_fails:指定连续失败多少次后,将该服务器标记为不可用
- fail_timeout:设定“失败窗口期”,在此时间内达到 max_fails 才触发下线;超时后会尝试恢复连接
- 默认情况下,Nginx 仅在
proxy_pass发生连接拒绝(connection refused)、超时(timeout)或返回 500/502/503/504 时计为失败(取决于proxy_next_upstream设置)
示例配置:
upstream backend_cluster {
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8080 max_fails=3 fail_timeout=30s;
}
启用请求重试与错误码重发(proxy_next_upstream)
仅靠服务器下线还不够——还需让当前失败请求能转给其他节点。通过 proxy_next_upstream 指令开启重试行为:
- 设置
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;表示遇到这些情况时尝试下一个 upstream 服务器 - 配合
proxy_next_upstream_tries(如设为 3)可限制最多重试次数,避免无限循环 - 注意:
http_500等状态码需后端真实返回,Nginx 不会主动拦截并伪造
添加 backup 服务器实现手动 Failover 分流
当所有主节点异常时,可指定备用服务器承接流量(常用于维护或灾备场景):
- 在 upstream 中添加带
backup标志的 server,它默认不参与负载,仅当其他 server 全部失效时启用 - backup 服务器也支持
max_fails和fail_timeout,确保自身稳定性 - 示例:
server 192.168.1.99:8080 backup max_fails=2 fail_timeout=20s;
可选:启用主动健康检查(需 nginx-plus 或 openresty)
开源版 Nginx 默认只支持被动检查(即请求失败才感知)。如需主动探测:
- nginx-plus 提供
health_check指令,支持周期性 HTTP 请求检测 - OpenResty 可用 lua-resty-upstream-healthcheck 模块实现类似能力
- 普通开源 Nginx 用户可通过外部脚本 + API(如 nginx-module-vts)或 Consul + registrator 实现服务发现与动态 reload


















