Nginx 不支持 proxy_cache_revalidate 指令,平滑缓存更新依赖其原生 HTTP 协商缓存机制:后端必须规范输出带引号的 ETag 与 Cache-Control s-maxage,Nginx 配置 proxy_cache_lock、proxy_cache_use_stale updating 等真实参数,配合 proxy_cache_valid 触发自动 If-None-Match 条件请求,日志中出现 revalidated 且 curl 可见 304 响应即验证成功。

nginx 中没有 proxy_cache_revalidate 这个指令——它在所有官方文档、源码和稳定版本中均不存在。所谓“实现平滑缓存更新”,靠的不是开启某个虚构开关,而是 Nginx 对 HTTP 协商缓存机制的原生支持,配合后端正确输出校验头与合理配置真实参数协同完成。
后端必须提供可靠的内容指纹
ETag 是协商更新的核心依据,不是可选装饰:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- ✅ 推荐用响应体内容哈希生成,如
"md5(content)",确保每次内容变更时值必然不同 - ✅ 格式必须带英文双引号,例如
ETag: "a1b2c3"或ETag: W/"d4e5f6" - ❌ 避免使用毫秒时间戳、数据库主键、固定字符串或不加引号的值
- 同时设置明确的缓存策略,优先使用
Cache-Control: public, s-maxage=3600,让 Nginx 知道该资源可被代理缓存多久
Nginx 需启用基础缓存并配置关键保障参数
只要后端返回了规范的 ETag 和 s-maxage,Nginx 在缓存过期后会自动发起带 If-None-Match 的条件请求。你只需确保以下真实生效的配置已就位:
-
proxy_cache_path已定义,proxy_cache已启用 -
proxy_cache_valid 200 302 1h;明确设置基础有效期,为协商触发留出窗口 -
proxy_cache_lock on;防止多个并发请求同时回源验证,避免击穿 -
proxy_cache_use_stale updating;在后台校验期间继续返回旧缓存,用户无感知 -
proxy_cache_background_update on;异步刷新缓存,不影响实时响应
如何验证平滑更新是否真实发生
不看配置有没有写,要看运行时行为是否符合预期:
- 日志中加入
$upstream_cache_status,看到revalidated表示缓存过期后成功收到 304 响应 - 用
curl -I观察:首次响应含ETag和s-maxage;过期后再请求,若返回304 Not Modified且无Content-Length、无响应体,说明协商成功 - 注意区分:浏览器自己发的条件请求也返回 304,但这属于客户端行为,与 Nginx 缓存层的
revalidated状态无关

















