proxy_cache_min_uses 控制同一缓存 key 第几次响应才写入磁盘和共享内存;设为2时首次不落盘,第二次才缓存,需配合精简cache_key、proxy_cache_lock及分层配置策略。

proxy_cache_min_uses 不是“拦截器”,也不是“过滤器”,它只控制:同一个缓存 key 第几次响应才真正写入磁盘和共享内存。设为 2,意味着首次访问仍会回源、仍可能命中已有缓存(如果存在且未过期),但这次响应不会落盘;只有第二次相同 key 的请求,Nginx 才把响应体存下来。
按路径语义分层配置,别全局一刀切
静态资源、首页、API、用户路径、埋点接口,复用规律完全不同,必须分开配:
-
静态资源(JS/CSS/图片/字体):location 匹配后缀,设为
proxy_cache_min_uses 2。可过滤爬虫抓取、CI 构建、前端调试等单次试探请求,保留真实用户二次加载行为。 -
首页和公共 API(如 /、/api/status):天然高频稳定,保持
proxy_cache_min_uses 1,避免延迟生效影响首屏体验。 - 带用户标识的路径(如 /user/profile):按业务回访率设为 2~3,兼顾个性化与复用性。
-
含随机参数的接口(如 /log?t=1744624800&r=abc):直接用
proxy_no_cache绕过缓存,min_uses 对它无效——因为每次 key 都不同,计数永远归零。
精简 cache_key 是前提,否则 min_uses 形同虚设
如果 proxy_cache_key 包含 $args 或 $request_uri,那 /logo.png?v=a 和 /logo.png?v=b 就是两个 key,各自只被访问一次,永远达不到 min_uses 门槛。
正确做法是提取稳定部分,例如:
-
proxy_cache_key "$scheme$host$uri";—— 去掉查询参数,让带版本号的静态资源也能复用 - 对必须区分参数的接口,用白名单方式构造 key,比如只保留
id和type参数:proxy_cache_key "$scheme$host$uri?$arg_id:$arg_type";
必须配合 proxy_cache_lock,防重复回源
设了 min_uses=2 后,第一次请求不写盘,但多个并发请求可能同时触发回源。若不加锁,后端会被打爆。
务必在对应 location 中启用:
proxy_cache_lock on;-
proxy_cache_lock_timeout 5s;(略大于后端 P95 响应时间)
这样首个请求去回源,其余等待;等响应返回并落盘(第二次请求时)后,后续请求才能 HIT。
验证是否生效,看日志和响应头
配置完别急着上线,先确认效果:
- 在 location 中加:
add_header X-Cache-Status $upstream_cache_status;,观察响应头是MISS还是HIT,特别注意那些 URI 是否长期卡在 MISS 不转 HIT - 统计 access.log 中 URI 出现频次:
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -20,确认长尾(大量只出现 1~2 次的 URI)是否减少 - 检查缓存目录下小文件(KB 级)数量增长是否明显放缓,
find /var/cache/nginx -size -4k | wc -l











