proxy_cache_revalidate on 用于缓存过期时自动发起条件请求验证资源有效性,需配合proxy_cache、proxy_cache_valid等指令及后端支持etag/last-modified方可生效。

proxy_cache_revalidate on 是 Nginx 的一个缓存控制指令,用于在缓存条目过期时,自动向后端发起 条件性请求(Conditional Request)(如带 If-Modified-Since 或 If-None-Match 头),以验证资源是否仍有效。若后端返回 304 Not Modified,Nginx 会刷新缓存有效期并直接返回本地缓存内容;否则,更新缓存并返回新响应。
要正确启用并让其生效,需满足多个前提条件,不能仅靠开启该指令。
必须配置的配套指令
proxy_cache_revalidate 不是独立开关,它依赖以下缓存和代理相关配置协同工作:
-
proxy_cache:必须启用共享内存缓存区域(如proxy_cache my_cache)。 -
proxy_cache_valid:必须为响应状态码设置缓存时间(如proxy_cache_valid 200 302 10m),否则无“过期”概念,无法触发 revalidate。 -
proxy_cache_lock(推荐开启):避免缓存失效瞬间大量并发请求击穿后端(proxy_cache_lock on)。 - 后端需正确支持条件请求:返回
Last-Modified和/或ETag响应头,并能正确处理If-Modified-Since/If-None-Match。
示例最小可用配置片段:
proxy_cache_path /var/cache/nginx/my_cache levels=1:2 keys_zone=my_cache:10m max_size=1g;
server {
location / {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_revalidate on;
proxy_cache_lock on;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
add_header X-Cache-Status $upstream_cache_status;
}
}
验证是否真正生效
启用后,可通过以下方式确认行为:
-
查看响应头中的
X-Cache-Status:-
HIT:缓存命中(未过期) -
STALE+updating:缓存已过期,但正在后台校验(proxy_cache_lock生效时) -
REVALIDATED:收到304,成功刷新缓存有效期 -
MISS:未命中或校验后获取新内容
-
使用 curl 观察后端访问日志:当缓存过期后首次请求应看到一条带
If-Modified-Since或If-None-Match的请求;若后端返回304,且 Nginx 日志中upstream_http_content_length为 0,说明 revalidate 成功。
常见失效原因
- 后端未返回
Last-Modified或ETag:Nginx 无法生成条件请求头,revalidate 自动跳过。 - 缓存未真正“过期”:
proxy_cache_valid时间未到,不会触发校验。 -
proxy_cache_bypass或proxy_no_cache被设为真(例如通过变量),导致跳过缓存逻辑。 - 使用了
proxy_cache_disable匹配当前请求,使缓存整体失效。 - 后端返回了
Cache-Control: no-cache、must-revalidate等强约束头,可能干扰 Nginx 默认行为(可配合proxy_ignore_headers调整)。
可选增强配置
若希望更精细控制 revalidate 行为,可补充:
-
proxy_cache_lock_age 5s:限制锁最长持有时间,防阻塞。 -
proxy_cache_lock_timeout 3s:设置获取锁的超时,超时后降级为普通请求。 -
proxy_ignore_headers Expires Cache-Control Set-Cookie:必要时忽略后端的缓存控制头,由 Nginx 全权管理。
不复杂但容易忽略











