要使 proxy_cache_background_update 实现“过期后秒回旧内容+后台静默刷新”,必须启用 proxy_cache_use_stale updating 并配合 inactive、cache_lock 等策略协同生效。

要让 proxy_cache_background_update 真正实现“过期后秒回旧内容 + 后台静默刷新”,不能只写一行 on,必须构建一套协同生效的更新策略。它本身不触发动作,只在缓存已过期、且被允许返回时,才悄悄发起子请求——所以核心是让 Nginx “敢用旧的”,同时“管住并发”。
必须启用 stale 响应授权
这是整个机制的启动开关。Nginx 默认遇到过期缓存会阻塞等待回源,只有明确授权才能走后台更新路径:
-
必须包含
updating:写proxy_cache_use_stale updating;,否则即使开了 background update,也不会触发后台请求 -
建议补全异常兜底:如
error timeout http_500 http_502 http_503 http_504,确保上游失败时仍可返回陈旧内容 -
避免漏配 404 缓存:加
proxy_cache_valid 404 10s;,防止无效路径长期占位,干扰更新节奏
合理设定缓存生命周期
有效期不是越长越好,也不是越短越及时,关键在于区分“可用窗口”和“强制刷新点”:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
-
基础有效期(
proxy_cache_valid):例如proxy_cache_valid 200 302 30s;,定义内容“多新才算新鲜” -
stale 宽容窗口(隐含):Nginx 允许在过期后继续使用,但需靠
inactive和proxy_cache_use_stale共同维持;不必额外设“stale 时间”,而是靠proxy_cache_path inactive=2m;确保条目不被过早清理 -
静态资源可拉长:对带哈希的 JS/CSS,设
proxy_cache_valid 200 1h;,文件名变即失效,无需高频刷新
强制加锁防并发击穿
proxy_cache_background_update 本身不限流,高并发下同一 key 可能引发数十次重复回源:
-
开启锁机制:
proxy_cache_lock on;,保证同一 cache key 只有一个请求真正回源 -
设置抢锁超时:
proxy_cache_lock_timeout 3s;,超时后直接走 stale 路径,不卡主响应 -
加入更新冷却:
proxy_cache_lock_age 15s;,锁释放后 15 秒内禁止新更新,避免抖动刷
验证与调优要点
上线后别只看配置是否加载,重点观察行为是否符合预期:
-
加响应头辅助判断:
add_header X-Cache-Status $upstream_cache_status;,命中后台更新时显示STALE -
对比两次请求:间隔略超
proxy_cache_valid时间,第二次应秒回且状态码为 200,上游日志仅出现一次新请求 -
后台请求需节制:单独设
proxy_read_timeout 5s;和proxy_next_upstream_tries 2;,避免慢响应拖垮 worker

















