nginx 并不存在 proxy_cache_revalidate 指令,所谓效果实为内置 http 协商缓存行为:后端返回 etag/last-modified → nginx 过期后发条件请求 → 收到 304 复用缓存体。

Nginx 并没有 proxy_cache_revalidate 这个合法指令。它在所有官方文档、源码和稳定版本(包括最新版)中均不存在,属于长期误传的“伪配置项”。你看到的所谓“开启后触发条件请求”的效果,实际来自 Nginx 内置的标准 HTTP 协商缓存逻辑——只要满足条件,它会自动在缓存过期后发起 If-None-Match 或 If-Modified-Since 请求,并处理 304 Not Modified 响应。
所以,问题本质不是“怎么配置 proxy_cache_revalidate”,而是:如何让 Nginx 在缓存过期后真正走条件请求并复用旧内容?
以下是真实、有效、可验证的配置路径:
后端必须输出规范的校验头
这是整个机制生效的前提,Nginx 不会主动“要求”验证,只被动响应后端提供的标识:
- ✅ 必须返回
ETag(推荐)或Last-Modified-
ETag格式必须带英文双引号,如:ETag: "a1b2c3d4" - 最好基于响应体内容生成(如 MD5/SHA256),确保内容变则 ETag 变
-
- ✅ 动态接口(PHP/Node.js/Python)需自行实现:
- 收到
If-None-Match头时,严格比对值 - 匹配则返回纯
304 Not Modified(空响应体、不带Content-Length、不带Transfer-Encoding)
- 收到
- ❌ 避免:固定值、毫秒时间戳、数据库 ID、无引号 ETag、
Cache-Control: no-cache
Nginx 端启用基础缓存并尊重生命周期
# 1. 定义缓存区(必须)
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=main_cache:10m max_size=1g inactive=1h;
server {
location /static/ {
proxy_pass http://backend;
# 2. 启用缓存(必须)
proxy_cache main_cache;
# 3. 明确设置缓存有效期(必须)→ 决定何时进入“可验证”状态
proxy_cache_valid 200 302 10m;
proxy_cache_valid 304 1h; # 304 响应本身也可缓存(可选但推荐)
# 4. 防并发回源(强烈推荐)
proxy_cache_lock on;
proxy_cache_lock_timeout 200ms;
# 5. 允许在后台验证时继续返回旧缓存(用户无感的关键)
proxy_cache_use_stale updating;
proxy_cache_background_update on;
# 6. 可选:添加响应头便于调试
add_header X-Cache-Status $upstream_cache_status;
add_header X-Cache-Age $upstream_http_age;
}
}
如何确认条件请求真的发生了
不要看配置写了没,要看运行时行为:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
-
在
log_format中加入:log_format cache_log '$remote_addr - $upstream_cache_status "$request" $status $upstream_http_etag';
日志中出现
revalidated表示缓存过期后成功收到304并复用了本地内容。 -
用
curl观察:# 第一次请求(应有 ETag 和 Age) curl -I https://example.com/file.js # 等待超过 proxy_cache_valid 时间后再次请求 curl -I https://example.com/file.js # 若返回 304、无 Content-Length、响应头含 Age: 0 → 协商成功
检查后端 access log:
应看到一条带If-None-Match或If-Modified-Since的请求,且响应为304。
不复杂但容易忽略。










