单纯靠proxy_pass指令无法实现容灾切换,真正的容灾依赖upstream块定义主备后端组、max_fails/fail_timeout健康感知机制及proxy_next_upstream错误重试策略三者协同;必须proxy_pass指向upstream名称,并配置超时、header透传等配套项。

单纯靠 proxy_pass 指令本身无法实现容灾切换——它只是把请求发给某个地址的“转发开关”。真正的备用切换能力,来自 upstream 块定义的后端组 + 健康感知机制 + 错误重试策略三者配合。配置对了,Nginx 才能在主后端挂掉时自动切到备用节点,用户几乎无感。
用 upstream 定义主备后端组
所有容灾逻辑都从这里开始。不能把 proxy_pass 直接写成具体 IP,必须指向一个命名的 upstream 块:
- 主节点不加修饰,正常参与轮询(或按权重分配)
- 备用节点末尾加
backup,日常完全不接收流量,仅当所有非 backup 节点都被标记为不可用时才启用 - 每个 server 行建议显式配置
max_fails=3 fail_timeout=20s,让 Nginx 主动识别连续失败并临时剔除节点
示例:
upstream app_backend {
server 192.168.1.10:8080 weight=5 max_fails=3 fail_timeout=20s;
server 192.168.1.11:8080 weight=5 max_fails=3 fail_timeout=20s;
server 192.168.1.12:8080 backup;
}
在 location 中启用错误触发重试
光有 upstream 不够。单次请求遇到连接拒绝、超时或 502/503 等网关错误时,Nginx 默认直接返回错误。需明确告诉它:“这些情况就换台机器再试一次”:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
-
proxy_next_upstream error timeout http_500 http_502 http_503 http_504—— 触发重试的条件 -
proxy_next_upstream_tries 3—— 最多尝试 3 台不同后端(含首次) -
proxy_next_upstream_timeout 15s—— 整个重试过程总耗时不超 15 秒
这些指令必须和 proxy_pass 写在同一级 location 块内:
location /api/ {
proxy_pass http://app_backend;
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
proxy_next_upstream_tries 3;
proxy_next_upstream_timeout 15s;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_connect_timeout 5s;
proxy_send_timeout 10s;
proxy_read_timeout 10s;
}
补充关键配套项避免连锁故障
缺少这些,高可用容易失效或引发雪崩:
-
超时必须设合理值:不设
proxy_read_timeout,后端卡死会占满 worker 连接;建议读超时 ≤ 后端平均响应时间 × 2 - 真实 IP 和协议头要透传:否则后端日志全是 Nginx 的 IP,限流、鉴权、跳转链接都会出错
-
避免被动检查滞后:生产环境建议加主动健康检查(如用 OpenResty 的
lua-resty-upstream-healthcheck或编译 nginx-upstream-check-module),每 3–5 秒探测/health接口,比等请求失败再踢更及时
验证是否真生效
配完别急着上线,手动验证几步:
- 停掉一台主后端,发起请求,看 access log 是否打到其他节点或 backup 节点
- 故意让主后端返回 503,观察是否触发重试、是否在
proxy_next_upstream_timeout内返回结果 - 查 Nginx error log,确认有没有
upstream timed out或no live upstreams类报错
容灾不是配出来就完事,而是测出来、调出来的。










