Nginx 的自动故障转移由 upstream 块定义主备节点与健康检查、proxy_next_upstream 在 location 中控制重试行为共同实现,需显式配置 error timeout 及 http_500–504 等状态码触发条件,并配合 proxy_next_upstream_tries 和 timeout 限制重试边界,同时建议启用主动健康检查模块提升探测时效性。

Nginx 的 location 块本身不负责定义备用后端或执行故障转移逻辑,它只做请求匹配和路由转发。真正的自动故障转移必须由 upstream 块配合 proxy_next_upstream 等代理指令协同完成。把容错逻辑写进 location 里(比如用 if 判断状态码、硬编码多个 proxy_pass)不仅无效,还会导致配置不可靠、难以维护。
下面直接讲清楚怎么配才真正起作用:
用 upstream 定义主备节点,而不是在 location 里拼地址
所有后端服务器必须统一收口到一个 upstream 块中,其中明确区分主节点和备用节点:
- 主节点不加
backup标识,正常接收流量 - 备用节点加上
backup关键字,仅当所有非 backup 节点都被标记为不可用时才启用 - 每个节点可单独设置容错参数,例如
max_fails=3 fail_timeout=30s,表示连续失败 3 次后,30 秒内不再向该节点发请求
示例:
upstream app_backend {
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 backup;
}在 location 中启用并约束 proxy_next_upstream 行为proxy_next_upstream 是触发重试的关键开关,必须显式开启,并限定哪些情况才重试:
- 默认不重试 502,需手动加入
http_502 - 推荐组合:
error timeout http_500 http_502 http_503 http_504 - 控制重试次数上限:
proxy_next_upstream_tries 3(含首次请求) - 控制整个重试过程耗时上限:
proxy_next_upstream_timeout 10s
同时确保基础代理参数正确,避免干扰重试:
-
proxy_http_version 1.1和proxy_set_header Connection ""必须设置,否则 HTTP/1.0 连接复用可能让重试失效 -
proxy_buffer_size和proxy_buffers要足够大,防止因缓冲区不足间接触发 502
示例 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 10s;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_buffer_size 128k;
proxy_buffers 4 256k;
}补充主动健康检查(可选但推荐)
被动探测(靠失败请求标记节点)有延迟。若需更快发现故障,可用开源模块 nginx_upstream_check_module 实现主动探活:
- 编译时添加
--add-module=/path/to/nginx_upstream_check_module - 在 upstream 块中增加
check指令,例如每 3 秒请求/health,连续 2 次成功即恢复,5 次失败即下线
示例:
upstream app_backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
check interval=3 rise=2 fall=5 timeout=1 type=http;
check_http_send "HEAD /health HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}最后别忘了兜底:自定义 502 页面
即使做了主备+重试,所有后端仍可能同时不可用。此时应返回友好提示,而不是默认 Nginx 错误页:
- 使用
error_page 502 /502.html; - 配置
location = /502.html { root /usr/share/nginx/html; } - 提前准备静态
502.html文件,内容简洁明确
这样一套配置下来,Nginx 就能在后端节点故障时自动切换、重试、降级,整个过程对客户端透明。


















