proxy_cache_revalidate不是真实指令,而是长期误传的伪指令;nginx在缓存过期后自动基于etag或last-modified发起if-none-match/if-modified-since条件请求,收到304即复用缓存体以节省带宽。

proxy_cache_revalidate 不是“执行缓存过期检查”的开关,它本身不判断是否过期,也不触发检查动作——缓存是否过期,完全由 proxy_cache_valid 和响应头中的 Cache-Control(尤其是 s-maxage 或 max-age)共同决定。revalidate 的作用发生在“已过期”之后:它让 Nginx 在必须回源时,改用条件请求代替全量请求。
它只在缓存真正过期后才介入
当一个缓存条目到达其有效期终点(比如 proxy_cache_valid 200 10m 设置的 10 分钟),Nginx 就认为它“过期”了。此时:
- 若未启用
proxy_cache_revalidate,Nginx 直接发起标准 GET 请求回源,拿到完整响应后更新缓存; - 若启用了
proxy_cache_revalidate on,Nginx 自动在请求头中加入If-None-Match(有 ETag 时)或If-Modified-Since(有 Last-Modified 时),再发给后端; - 后端根据这些头比对内容,返回
304 Not Modified→ Nginx 复用旧缓存体,并重置其过期时间;返回200 OK→ 替换缓存并返回新内容。
它不改变过期逻辑,只优化过期后的回源方式
以下行为与 revalidate 无关,由其他配置控制:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 缓存何时开始计时?→ 取决于响应中
Cache-Control: s-maxage=3600或Expires头, fallback 到proxy_cache_valid; - 缓存是否被跳过?→ 由
proxy_cache_bypass、proxy_no_cache或响应头如Cache-Control: private决定; - 过期前能否返回旧缓存?→ 靠
proxy_cache_use_stale(例如updating、error等状态); - 并发请求是否重复校验?→ 由
proxy_cache_lock on控制,避免多个过期请求同时打向后端。
验证它是否生效的关键信号
不能只看配置开了没开,要观察实际行为:
- 响应头中出现
X-Cache: REVALIDATED(需自定义日志或 add_header 输出$upstream_cache_status); - Nginx access log 中对应请求的
$status是304,且$upstream_http_content_length为空或为 0; - 后端 access log 显示收到带
If-None-Match或If-Modified-Since的请求,并返回了 304; - 对比开启前后,相同资源的回源响应体字节数明显下降(例如从 50KB 降到几百字节)。
常见误解澄清
以下说法不准确:
- “revalidate 让缓存更智能地判断是否更新” → 实际判断权始终在后端,Nginx 只转发和响应;
- “开启 revalidate 就能减少回源次数” → 它不减少次数,只减少每次回源的传输量(304 无 body);
- “它和 proxy_cache_background_update 是同一类机制” → background_update 是异步刷新,revalidate 是同步条件校验,二者可共存但目的不同。










