nginx upstream备用机容灾需三者协同:显式标记backup节点、配置max_fails/fail_timeout实现健康感知、启用proxy_next_upstream触发重试转移;backup仅在所有非backup节点不可用时启用,且须验证其独立承载能力。

在 Nginx 中配置 upstream 节点的备用机容灾策略,核心是让主节点承担日常流量,仅当它们全部不可用时,才启用备用节点。这不是简单的“多加一台”,而是通过 backup 标识 + 健康状态感知 + 重试触发逻辑 三者协同实现的自动接管。
明确标记 backup 节点
在 upstream 块中,给备用服务器显式添加 backup 参数:
- 它不参与任何常规调度(轮询、权重、least_conn 都忽略)
- 只有当所有非 backup 节点都被 Nginx 标记为“不可用”时,才会被纳入转发队列
- 多个 backup 节点之间仍按轮询方式分发请求
示例:
upstream app_servers {server 10.0.1.10:8000 max_fails=3 fail_timeout=20s;
server 10.0.1.11:8000 max_fails=3 fail_timeout=20s;
server 10.0.2.100:8000 backup;
}
配置健康探测与自动摘除机制
Nginx 不主动探活,而是靠请求失败行为动态判断节点状态。必须配合以下参数才能让 backup 真正“等得起、接得住”:
- max_fails=3:连续 3 次请求失败(连接拒绝、超时或 proxy_next_upstream 显式声明的 HTTP 错误)后,标记该节点为不可用
- fail_timeout=20s:在 20 秒内不再向该节点发新请求;超时后自动重试一次,成功则恢复,失败则继续隔离
- 这些参数要写在每个 server 行后面,不能只写在 upstream 块顶层
启用重试逻辑,触发故障转移
仅靠连接失败太被动。需在 location 块中开启 proxy_next_upstream,让 Nginx 在收到异常响应时主动换节点:
- 加上 error timeout http_502 http_503 http_504,覆盖常见服务端故障场景
- 设置 proxy_next_upstream_tries 3,限制最多尝试 3 个节点(含重试)
- 搭配 proxy_next_upstream_timeout 15s,防止总耗时过长影响用户体验
这样,当主节点返回 503 时,Nginx 会立即重试下一个可用主节点;若全部主节点都已失效,才会落到 backup 节点上。
验证与注意事项
上线前务必实测:
- 手动停掉一台主 server,观察 access log 是否开始打到 backup 节点
- 检查 error log 是否出现 upstream server temporarily disabled 记录
- 确认 backup 节点能独立承载全量流量——否则切换后仍会雪崩
- 避免将 /health 等探测路径与业务接口混用,建议用独立路径如 /health?site=dr











