nginx 中不存在 proxy_cache_revalidate 指令;真实生效的是 http 协商缓存机制,依赖后端返回规范 etag 或 last-modified、合理配置 proxy_cache_lock、proxy_cache_use_stale updating 等参数,并通过 $upstream_cache_status=revalidated 和 curl -i 验证 304 响应。

nginx 中没有 proxy_cache_revalidate 这个指令——它不是官方支持的配置项,在所有稳定版 Nginx 源码、文档和发行版本中均不存在。所谓“最佳实践”建立在一个根本不存在的指令之上,容易误导配置、掩盖真实问题。
真正起作用的是 HTTP 协商缓存机制
Nginx 在缓存过期后自动发起条件请求(如带 If-None-Match 或 If-Modified-Since),前提是:
- 后端响应中包含规范的
ETag(带英文双引号,如"abc123")或Last-Modified - 响应头含明确的缓存控制策略,优先使用
Cache-Control: public, s-maxage=3600 - Nginx 已启用基础缓存:定义
proxy_cache_path、设置proxy_cache和合理的proxy_cache_valid
后端必须输出可靠的内容指纹
ETag 不是可有可无的装饰头,而是内容变更的唯一标识:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- ✅ 推荐用响应体哈希生成:
ETag: "md5(content)"(Spring Boot、Express、Django 等均可实现) - ❌ 避免固定值、毫秒时间戳、数据库 ID 或不带引号的字符串
- 收到
If-None-Match时,后端必须严格比对并返回干净的304 Not Modified(空响应体、无Content-Length、无分块编码)
Nginx 端需配置稳定性保障机制
无需虚构指令,靠以下真实参数协同实现高效、安全的缓存更新:
-
proxy_cache_lock on;—— 同一缓存 key 只允许一个请求回源校验,防击穿 -
proxy_cache_use_stale updating;—— 校验进行中,前台继续返回旧缓存,用户无感 -
proxy_cache_background_update on;—— 异步刷新缓存,不影响实时响应 -
proxy_cache_valid 200 302 1h;—— 明确生命周期,让协商有机会触发
如何验证是否真实生效
不要依赖配置是否存在,要看运行时行为:
- 日志中加入
$upstream_cache_status,看到revalidated表示缓存过期后成功收到 304 - 用
curl -I观察:首次响应含ETag和s-maxage;过期后再次请求,若返回304且无Content-Length,说明协商成功 - 注意区分:浏览器主动发的条件请求会返回 304,但
$upstream_cache_status是HIT或MISS,不是revalidated










