nginx 实现多 upstream 组自动容灾切换需结合主动健康检查、变量映射与 fallback 机制;开源版依赖 nginx-upstream-check-module 或 openresty 的 lua-resty-upstream-healthcheck,通过 map+try_files 或 lua 动态路由实现组间 failover。

利用 Nginx 实现后端负载均衡组之间的自动容灾切换,核心在于结合健康检查、上游组动态管理与 failover 逻辑,而非仅靠单个 upstream 块的简单轮询。Nginx 本身不原生支持“多 upstream 组间自动切换”,但可通过 upstream 模块 + 状态探测 + rewrite/try_files + Lua(或 OpenResty)或第三方模块(如 nginx-upstream-check-module)协同实现可靠容灾。
基础:启用主动健康检查并标记失效节点
Nginx 开源版默认只做被动检查(如 connection refused 或 timeout 后踢出),无法提前感知后端服务降级(如 HTTP 503、响应超慢)。需借助 nginx-upstream-check-module(需编译安装)或使用 OpenResty 内置的 lua-resty-upstream-healthcheck 库。
- 配置定期 TCP 或 HTTP 探针,例如每 3 秒检查 /health 端点,连续 2 次失败则标记为 down
- 设置
max_fails=2 fail_timeout=30s配合被动检查,作为兜底保障 - 注意:仅靠 passive 检查无法触发“整组切换”,必须依赖主动探测结果做决策依据
关键:用变量+map+try_files 实现组间 fallback(无 Lua 场景)
若不能引入 Lua,可借助 Nginx 的 map 和 try_files 模拟 failover 路由逻辑。前提:定义多个 upstream 组(如 primary、backup1、backup2),并通过状态文件或共享内存标识其可用性。
- 用定时任务或外部监控脚本,将各组健康状态写入本地文件(如 /var/run/upstream-primary.ok),Nginx 通过
map读取并映射为变量 - 在 location 中用
try_files @primary @backup1 @backup2 =503,配合内部 named location 分发请求 - 每个 named location 对应一个 upstream,失败时自动跳转下一组(依赖 error_page 或 try_files 的 fallback 机制)
进阶:OpenResty + Lua 实现智能组切换
OpenResty 是更推荐的方案,能实时读取上游健康状态、自定义切换策略(如按成功率、延迟加权)、记录日志并上报。
- 使用
resty.upstream.healthcheck模块初始化多组健康检查器,分别监控 primary、dr 组 - 在 access_by_lua_block 中查询当前最优可用组(例如:优先 primary,若其可用率
- 用
balancer_by_lua_block动态设置balancer.set_current_peer,将请求路由到目标组内节点 - 可集成 Consul 或 etcd,把切换决策外置,Nginx 只做执行器
注意事项与避坑点
实际部署中常见问题比配置本身更影响稳定性:
- 健康检查路径必须轻量、不走业务逻辑(如 /health 返回 200 即可),避免压垮后端
- fail_timeout 设置不宜过短(建议 ≥ 30s),否则频繁上下线导致连接抖动
- 多组切换需统一 session 处理方式(如后端共享 session store),否则用户登录态丢失
- DNS 解析类 upstream(如使用域名)会绕过健康检查,务必用 IP 列表或 resolver + valid 显式控制











