Nginx 实现后端宕机兜底需四环节协同:1. upstream 设置 max_fails=1 fail_timeout=30s 快速剔除故障节点并配置 backup;2. location 中启用 proxy_next_upstream error timeout http_502–504 及 tries/timeout 限制重试;3. proxy_intercept_errors on 配合 error_page 拦截错误并导向本地响应;4. 推荐集成 nginx_upstream_check_module 主动探测,提前规避失败请求。

Nginx 的 proxy_pass 本身不带兜底能力,后端宕机时默认返回 502/504 或透传错误。要实现真正可用的兜底,必须组合 upstream 容错、重试机制、错误拦截和本地响应四个环节。
配置带健康标记的 upstream 组
兜底的前提是 Nginx 能识别哪些后端不可用,并避免反复试探:
- 在
upstream块中为每个节点设置max_fails=1 fail_timeout=30s,单次失败即剔除 30 秒 - 至少配置两个正常节点;若需强保障,加一个
backup节点作为最后防线 - 不建议仅靠单节点 + retry 应对宕机,那样重试无意义
示例:
upstream backend {
server 192.168.1.10:8080 max_fails=1 fail_timeout=30s;
server 192.168.1.11:8080 max_fails=1 fail_timeout=30s;
server 192.168.1.12:8080 backup;
}
启用请求级自动重试
仅靠 upstream 剔除还不够——单次请求仍可能打到刚失效的节点。需用 proxy_next_upstream 显式定义重试条件:
- 加上
error timeout http_502 http_503 http_504,覆盖连接失败、超时和常见网关错误 - 设
proxy_next_upstream_tries 3,限制最多尝试 3 台(含首次) - 设
proxy_next_upstream_timeout 10s,从第一次发出起计时,超时即终止并走兜底
这些指令必须放在与 proxy_pass 同级的 location 块中。
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
拦截错误并接管响应
即使重试失败,也不能把 502 直接甩给用户。关键一步是开启拦截:
- 必须写
proxy_intercept_errors on,否则 5xx 响应直接透传,error_page不生效 - 配合
error_page 502 503 504 = @fallback,将错误导向内部 location - @fallback 中用
internal防止外部直接访问该路径,再用root指向静态页或return返回 JSON
例如:
location /api/ {
proxy_pass http://backend;
proxy_intercept_errors on;
error_page 502 503 504 = @fallback;
}
location @fallback {
internal;
root /usr/share/nginx/html;
try_files /maintenance.html =503;
}
补充主动健康检查(生产推荐)
被动剔除有滞后性。后端刚宕机时,前几个请求仍会失败并触发重试。更优做法是提前感知:
- 开源环境可编译安装
nginx_upstream_check_module - 在 upstream 中添加
check interval=3 rise=2 fall=5 type=http,定期探测 - 配合
proxy_next_upstream ... http_503,让探测失败返回的 503 也能触发切换
这样能大幅减少“惊群响应”,让兜底更及时、更安静。

















