nginx proxy_cache_use_stale 实现柔性兜底:需配置缓存区、稳定key、5xx入缓存,并配合background_update与cache_lock,在后端故障时毫秒返回过期缓存。

浏览器缓存本身不会“自动触发”Nginx 的过载保护,它只是客户端行为。真正起作用的是 Nginx 主动配置的代理缓存(proxy_cache)与 stale 降级策略——当后端在超大流量下响应变慢或失败时,Nginx 可主动返回“过期但可用”的缓存内容,从而缓解压力、保核心可用性。
关键不在浏览器,而在 Nginx 如何用缓存做柔性兜底。
启用 proxy_cache 并允许过期缓存服务
必须显式开启缓存并授权 Nginx 在异常时返回 stale(陈旧)版本:
proxy_cache_path /var/cache/nginx/mycache levels=1:2 keys_zone=mycache:10m max_size=1g inactive=60m use_temp_path=off;
server {
location /api/ {
proxy_pass http://backend;
proxy_cache mycache;
proxy_cache_valid 200 302 10s; # 正常响应缓存 10 秒
proxy_cache_valid 503 5s; # 降级响应也缓存 5 秒(快速传播“服务忙”状态)
# ⚠️ 核心:允许在后端出问题时返回过期缓存
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
# 防止缓存失效瞬间大量回源(缓存雪崩)
proxy_cache_lock on;
proxy_cache_lock_timeout 3s;
# 可选:让降级开关绕过缓存(人工干预立即生效)
set $is_downgraded "0";
if ($upstream_http_x_downgraded = "1") {
set $is_downgraded "1";
}
proxy_cache_bypass $is_downgraded;
}
}
搭配 error_page 实现“缓存 + 降级”双保险
当后端超时或返回 5xx,Nginx 不应等待或报错,而是立刻返回缓存(如有)或兜底内容:
error_page 502 503 504 =200 @stale_or_fallback;
location @stale_or_fallback {
internal;
add_header X-Cache-Status "downgraded";
# 尝试返回已过期缓存(若存在)
proxy_cache_use_stale off; # 此处禁用 stale,避免嵌套
proxy_cache mycache;
proxy_cache_valid any 1s;
proxy_cache_bypass 1; # 强制不读缓存,走 fallback
# 直接返回轻量 JSON
return 200 '{"code":503,"msg":"服务繁忙,请稍后再试"}';
}
缓存策略要匹配业务语义
-
静态资源(JS/CSS/图片):可设长缓存(
proxy_cache_valid 200 1h),配合 ETag/Last-Modified,CDN + Nginx 多层缓冲。 -
API 数据(如商品列表):缓存 5–30 秒足够,
updating参数确保后台更新时仍能返回旧数据。 -
登录态或实时订单:禁用缓存(
proxy_cache_bypass 1; proxy_no_cache 1;),避免脏数据。
验证是否生效
- 压测时模拟后端延迟:
proxy_read_timeout 1s;+ 后端 sleep(3s),观察 Nginx 是否在 1s 后返回X-Cache-Status: STALE或兜底响应; - 查看日志:
log_format main '$remote_addr - $upstream_cache_status ...';,重点关注STALE、HIT、MISS、BYPASS字段。
不复杂但容易忽略:缓存不是用来“提速”的,而是在系统承压时做“柔性缓冲”。只要配置了 proxy_cache_use_stale 和合理 proxy_cache_valid,Nginx 就会在超大流量下自动启用这层保护。











