后端全宕时nginx默认逐请求失败返回502/503,需通过启用健康检查(max_fails=1 fail_timeout=15s或主动health_check)、proxy_intercept_errors on、error_page 500 502 503 504 =200 @global_degrade、location @global_degrade中return 200 json响应,并辅以proxy_cache_use_stale和超时优化实现毫秒级自动降级。

后端集群全盘宕机时,Nginx 默认会为每个请求都尝试连接、快速失败并返回 502/503,造成日志爆炸和用户体验断层。要实现自动降级并返回特定 JSON,关键不是“等失败再响应”,而是提前感知故障、阻断转发链路、由 Nginx 自身毫秒级生成结构化响应。
启用上游健康探测与熔断机制
仅靠 backup 参数无法触发降级——Nginx 不主动探活,必须让所有主节点被标记为 down,backup 才有机会启用;更稳妥的是跳过 backup,直接走本地兜底。
- 在
upstream中统一配置max_fails=1 fail_timeout=15s,使单次失败即隔离节点,15 秒内不再试探 - 搭配
proxy_next_upstream error timeout http_502 http_503 http_504,确保连接失败、超时或收到网关错误时触发重试逻辑(从而累计失败次数) - 若已部署
nginx-upstream-check-module或使用 Nginx Plus,建议改用主动健康检查(如health_check interval=5 fails=2 passes=2),更早发现全挂状态
拦截失败响应并重定向至 JSON 降级入口
当所有 upstream 节点均不可用,请求最终会落到 error_page,此时应终止代理,切换到纯 Nginx 内部响应流程。
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 开启错误拦截:
proxy_intercept_errors on;(必须加,否则 5xx 不会被捕获) - 统一对接失败码:
error_page 500 502 503 504 =200 @global_degrade;(注意:用=200强制转为 200 状态,避免浏览器渲染默认错误页) - 定义降级 location:
location @global_degrade { internal; default_type application/json; add_header Content-Type 'application/json; charset=utf-8'; return 200 '{"code":50301,"msg":"系统维护中,请稍后再试","data":{}}'; }
增强容错:叠加缓存兜底与超时优化
即使降级逻辑就绪,若后端持续返回 503,Nginx 可能反复回源。启用 stale 缓存可进一步降低冲击,并保障“有响应”。
- 在对应
location块中添加:proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504; - 对降级响应本身也做短缓存:
proxy_cache_valid 503 30s;(配合proxy_cache已启用的前提) - 缩短连接等待:
proxy_connect_timeout 3s;避免 SYN 卡顿;proxy_read_timeout 8s;防止半开连接堆积
验证与可观测性建议
降级不是配完就结束,需确保它真实生效且不被绕过。
- 手动模拟全挂:临时停掉全部 upstream 服务,用
curl -I /api/order检查响应头是否为Content-Type: application/json且 body 是预期 JSON - 在降级 location 中加入唯一标识头,例如:
add_header X-Defered-By "nginx-fallback-v1";,便于日志追踪来源 - 监控
@global_degrade的命中次数(通过 access_log 或 Prometheus + nginx-lua-module),突增即说明上游异常










