Nginx全局流量降级通过http块中map定义热更新布尔变量$is_downgraded,支持请求头/Cookie/URI或Redis动态赋值;在server或location /统一拦截,API返回JSON、HTML重写至降级页,白名单放行/login等路径;结合proxy_cache_use_stale与503短缓存兜底,添加X-Downgraded头及日志字段实现可观测性,静态资源单独跳过降级。

实现 Nginx 全局流量降级,关键在于把决策点前移到请求入口,不依赖后端、不修改业务代码,用配置驱动行为,在毫秒级完成开关切换与响应拦截。
用 map 定义可热更新的全局降级变量
在 http 块中定义一个布尔型开关变量,它能从多种外部信号动态取值:
- 支持从请求头(如 X-Global-Downgrade: on)、Cookie 或 URI 参数读取,适合人工临时触发
- 配合 Lua 脚本可从 Redis 实时拉取,例如
redis:get("global:downgrade:flag"),运维执行SET global:downgrade:flag 1即全站生效 - 变量默认为 0(未降级),值为 "on" 或 "true" 时置为 1,后续逻辑统一识别该变量
统一拦截所有请求路径
在 server 或顶层 location / 中集中判断,避免在每个接口重复写 if:
- 对 API 请求(如
location /api/),直接返回轻量 JSON:if ($is_downgraded) { return 200 '{"code":503,"msg":"服务维护中"}'; } - 对 HTML 页面类请求,重写到预置降级页:
rewrite ^(.*)$ /downgrade.html break; - 需放行核心路径(如登录、健康检查)时,加白名单判断:
if ($request_uri !~ ^/(login|healthz|/static)) { ... }
结合缓存 stale 机制兜底已失效内容
当后端已不可用,Nginx 可主动返回“过期但可用”的缓存,而不是抛错:
- 配置
proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504,让错误状态也走缓存流 - 对 503 响应单独缓存短时间:
proxy_cache_valid 503 10s,便于快速传播降级状态 - 开启
proxy_cache_lock on,防止缓存失效瞬间大量回源,只允许一个请求重建缓存
配套可观测性与安全细节
降级不是掩盖问题,而是可控退守:
- 所有降级响应添加自定义 Header,如
add_header X-Downgraded "true",便于前端或网关识别并展示友好提示 - 日志格式中记录
$is_downgraded字段,方便统计触发频次、路径分布和用户影响面 - 静态资源(CSS/JS/图片)应跳过降级判断,单独配置
location ~* \.(js|css|png|jpg|gif)$并直接返回 - 降级响应设置短缓存(如
expires 1s),防止 CDN 长期缓存错误状态


















