如何设置proxy_cache_background_update以实现资源过期的后台静默异步更新?
- 内容介绍
- 文章标签
- 相关推荐
本文共计922个文字,预计阅读时间需要4分钟。
请提供需要改写的原文内容,我将根据您的要求进行改写。
启用 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,可进一步节省带宽
最小可用配置示例
以下是一个典型、安全、可立即部署的配置片段:
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 与主请求完全一致,否则会更新错条目
本文共计922个文字,预计阅读时间需要4分钟。
请提供需要改写的原文内容,我将根据您的要求进行改写。
启用 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,可进一步节省带宽
最小可用配置示例
以下是一个典型、安全、可立即部署的配置片段:
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 与主请求完全一致,否则会更新错条目

