nginx 中不存在 proxy_cache_revalidate 指令,它是误传的伪配置项;真实机制依赖后端返回规范 etag 或 last-modified、cache-control: public, s-maxage,配合 proxy_cache_valid、proxy_cache_lock、proxy_cache_use_stale updating 和 proxy_cache_background_update 等原生参数实现自动条件请求与智能缓存更新。

Nginx 中没有 proxy_cache_revalidate 这个指令——它不是官方支持的配置项,在所有稳定版 Nginx 源码、文档及发行版本中均不存在。所谓“优化缓存刷新机制”的说法,源于对 HTTP 协商缓存原理的误解,也容易让人误配、掩盖真实问题。
真正起作用的是标准 HTTP 协商缓存机制,配合 Nginx 原生参数协同工作。下面从实际生效的角度讲清楚怎么做:
缓存过期后如何安全验证内容是否变更
Nginx 在缓存过期后,会自动向上游发起条件请求(带 If-None-Match 或 If-Modified-Since),但前提是:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 后端响应必须包含规范的
ETag(带英文双引号,如"abc123")或Last-Modified - 响应头需明确声明缓存策略,推荐使用
Cache-Control: public, s-maxage=3600 - Nginx 已启用基础缓存:定义了
proxy_cache_path、设置了proxy_cache和合理proxy_cache_valid
让协商验证真正稳定运行的关键配置
不需要虚构指令,靠以下真实参数组合保障体验与可靠性:
-
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 Not Modified且无Content-Length,说明协商成功 - 注意区分:浏览器自己发的条件请求也会返回 304,但这和 Nginx 的缓存刷新无关
不复杂但容易忽略










