proxy_cache_background_update 用于缓存过期后后台异步回源更新,同时返回旧内容以降低延迟和后端压力;需配合 proxy_cache_use_stale updating、proxy_cache_valid 等配置生效。

proxy_cache_background_update 是 Nginx 缓存模块中一个关键配置项,用于在缓存条目过期后,**不阻塞用户请求**,而是由 Nginx 在后台悄悄发起回源请求更新缓存,同时将**已过期但未更新完成的旧缓存内容**(需配合 proxy_cache_use_stale updating)继续返回给客户端。这能显著降低用户感知的延迟和后端压力。
启用 background update 的前提条件
该指令本身只是“开关”,实际生效依赖多个配套配置:
- 必须开启缓存:使用
proxy_cache指定缓存区,且proxy_cache_valid设置了缓存有效期 - 必须允许使用过期缓存:通过
proxy_cache_use_stale updating明确授权 Nginx 在更新中可返回旧内容 - 建议搭配
proxy_cache_lock on(可选但推荐):避免相同请求并发回源,仅首个请求触发更新,其余等待锁释放后直接读新缓存 - 确保后端支持条件请求(如
If-Modified-Since/If-None-Match)并正确响应304 Not Modified,可进一步节省带宽
最小可用配置示例
以下是一个典型、安全、可立即部署的配置片段:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
proxy_cache_path /var/cache/nginx/mycache levels=1:2 keys_zone=mycache:10m max_size=1g inactive=60m use_temp_path=off;
<p>server {
location /api/ {
proxy_pass <a href="https://www.php.cn/link/65b5b8d1f89bf53a5713bc3afdd83e9e">https://www.php.cn/link/65b5b8d1f89bf53a5713bc3afdd83e9e</a>;
proxy_cache mycache;
proxy_cache_valid 200 302 10s; # 正常响应缓存 10 秒
proxy_cache_valid 404 1s; # 404 也缓存 1 秒(防刷)
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
proxy_cache_background_update on; # ✅ 关键:开启后台更新
proxy_cache_lock on; # ✅ 避免重复回源
proxy_cache_lock_timeout 5s; # 锁超时,避免长阻塞
}
}说明:当缓存过期后,第一个到达的请求会触发后台更新;后续请求在锁存在期间,若缓存仍可用(即使过期),且配置了 updating,Nginx 就会直接返回旧内容,不等新内容写入完成。
验证是否生效的方法
可通过日志与行为观察确认机制运行正常:
- 开启
error_log /var/log/nginx/error.log notice;,后台更新会记录类似cache file not found while updating cache或updating cache key ...的 notice 级日志(非错误) - 用
curl -I多次请求同一资源,观察X-Cache响应头(需自定义添加):首次过期后应出现HIT-STALE或类似标识,表示返回的是过期但正在更新的内容 - 在后端加访问日志或计数器,确认过期后单位时间内回源请求数远低于并发请求数(例如 100 并发下仅 1~2 次回源)
常见误区与注意事项
这个功能看似简单,但配置不当容易失效或引发问题:
-
不能单独使用:只开
proxy_cache_background_update on而没配proxy_cache_use_stale updating,过期后请求仍会同步回源,后台更新形同虚设 -
不适用于所有状态码:只有
proxy_cache_valid中声明的状态码才参与缓存和后台更新逻辑;未声明的响应(如 500)即使被缓存,也不会触发 background update - 后台更新不保证立即完成:它只是“发起请求”,如果后端慢、网络抖动或返回非 200,旧缓存仍会持续服务,直到下次满足更新条件或被清理
-
注意缓存键一致性:若使用
proxy_cache_key自定义键,请确保后台更新使用的 key 与主请求完全一致,否则会更新错条目

















