nginx 的故障转移依赖 upstream 定义与 proxy_next_upstream 配合:upstream 管理节点状态、权重和 backup,proxy_next_upstream 控制请求级重试,需配合健康检查与正确代理头设置。

proxy_pass 本身不负责故障转移,它只是把请求转给 upstream 块;真正实现多台后端自动容错,靠的是 upstream 定义 + proxy_next_upstream 控制重试逻辑。
用 upstream 定义带容错的后端组
必须把后端服务器写在 upstream 块里,而不是直接写在 proxy_pass 后面。这样才支持节点状态管理、权重分配和备用节点。
- 每个 server 行可加 max_fails=3 fail_timeout=30s:连续失败 3 次,就标记为不可用,30 秒内不再分发请求
- 某台机器加 backup 标记:仅当所有非 backup 节点都不可用时才启用
- 可选加 weight=2 等值:只影响健康节点间的流量比例,不影响故障判断
示例:
upstream backend {server 192.168.1.10:8080 max_fails=3 fail_timeout=30s weight=3;
server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8080 backup;
}
在 location 中启用请求级重试
upstream 只管“哪些节点可用”,但单次请求仍可能因网络抖动或瞬时超时失败。这时需要 proxy_next_upstream 显式告诉 Nginx:“遇到这些情况就立刻换一台再试”。
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
- 触发条件写全:error timeout http_500 http_502 http_503 http_504
- proxy_next_upstream_tries 3:最多尝试 3 台(含首次),避免无限循环
- proxy_next_upstream_timeout 10s:整个重试过程不能超过 10 秒
这部分要和 proxy_pass 写在同一 location 块里:
location /api/ {proxy_pass http://backend;
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
proxy_next_upstream_tries 3;
proxy_next_upstream_timeout 10s;
}
补充主动健康检查(生产推荐)
被动容错依赖真实失败请求来标记节点,有滞后性。更稳妥的方式是让 Nginx 主动发探测请求,提前发现宕机节点。
- Nginx 开源版不内置主动健康检查,需配合第三方模块(如 nginx_upstream_check_module)
- Nginx Plus 或商业版原生支持 active health check,配置简洁,例如:
health_check interval=3 fails=2 passes=2; - 若无法升级,可用外部脚本 + API 方式定期调用 Nginx 的 status 接口做兜底监控
别漏掉基础代理头设置
没有正确的请求头,后端可能拿不到真实客户端 IP 或 Host,导致日志不准、跳转异常甚至鉴权失败。
- proxy_set_header Host $host;:透传原始 Host
- proxy_set_header X-Real-IP $remote_addr;:传递真实来源 IP
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;:兼容多层代理场景










