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

让静态文件复用 304 的关键前提
要让 JS/CSS/图片等静态资源在缓存过期后仍能走 304,必须满足:
- 源站(如 Nginx 自身或上游 Web 服务器)为这些文件返回合法 ETag(带英文双引号,如
ETag: "a1b2c3")或 Last-Modified(格式为 RFC 1123 时间) - 静态文件服务未显式关闭协商缓存(例如 Apache 的
FileETag None或 Nginx 的etag off;需禁用) - 响应头中包含可缓存声明,例如
Cache-Control: public, max-age=3600;若使用s-maxage,优先级更高
Nginx 端必须启用的基础缓存配置
没有虚构指令,靠真实参数构建可靠缓存链路:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 定义缓存区:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=static_cache:10m inactive=1h max_size=1g; - 在 location 中启用并设有效期:
proxy_cache static_cache; proxy_cache_valid 200 302 1h; - 防并发击穿:
proxy_cache_lock on; proxy_cache_lock_timeout 200ms; - 提升用户体验:
proxy_cache_use_stale updating; proxy_cache_background_update on;
验证是否真走了 304 复用
不能只看配置,要看运行时行为:
- 日志中加入
$upstream_cache_status,出现 revalidated 表示缓存已过期且成功收到 304 - 用
curl -I观察:首次响应含ETag和Cache-Control;缓存过期后再请求,若返回304 Not Modified且无Content-Length,说明协商生效 - 注意区分:浏览器主动刷新(F5)也会发条件请求并返回 304,但此时
$upstream_cache_status是HIT或MISS,不是revalidated
比 revalidate 更有效的带宽节省手段
对静态文件而言,依赖“过期后验证”是兜底策略;真正大幅降开销靠的是避免过期:
-
版本化 URL:如
/js/app.a1b2c3.js,后端返回Cache-Control: public, immutable, max-age=31536000,Nginx 几乎永不回源 -
分离缓存层级:浏览器用短
max-age(如 60s),Nginx 用长s-maxage(如 3600s),兼顾更新及时性与带宽效率 - 统一缓存键:消除大小写、空格、参数顺序差异导致的重复缓存,提升命中率










