proxy_cache_min_uses 通过控制缓存写入时机过滤偶发请求,设为2时首次不缓存、二次才写入,配合proxy_cache_lock可避免并发回源,有效减少缓存污染。

直接用 proxy_cache_min_uses 无法“识别”请求,但它能有效过滤偶发性静态资源回源带来的缓存污染——关键在于不让这些只访问一次的请求把响应写进缓存。
它不拦截请求,只控制缓存写入时机
偶发性请求(比如爬虫抓错一张图、前端调试时拼错路径、用户误点一个不存在的 favicon)仍会正常回源,Nginx 不会丢弃或跳过它们。但 proxy_cache_min_uses 可以确保:
- 设为 2:第一次请求不缓存,第二次相同 URI 才写入;
- 设为 3:前两次都不缓存,第三次起才落盘;
- 默认值 1 则会让所有首次请求都立即占用缓存空间,造成大量“一次写、零命中”的垃圾条目。
针对静态资源的合理取值建议
静态资源(.jpg/.png/.css/.js 等)天然具备复用潜力,但真实流量中混杂大量试探性访问。推荐按场景分层设置:
- 通用静态资源目录(如 /static/ 或 /assets/):设为 2 —— 过滤掉单次爬虫、404 路径、调试请求,保留真实用户二次加载行为;
- 强公共资源(如 /favicon.ico、/robots.txt、CDN 同步的 JS 包):保持 1 —— 它们本就高频且稳定,无需预热;
- 带随机参数的资源(如 /logo.png?v=123abc):先用 proxy_cache_key 剔除 $args,再设 2,否则每个参数变体都被视为新 URI,min_uses 失效。
配合 proxy_cache_lock 防止重复回源
仅设 min_uses 2 不够——若两个相同请求并发到达,可能都绕过缓存并同时回源。必须搭配:
- proxy_cache_lock on;:首个请求触发回源并加锁;
- 后续同 URI 请求等待锁释放,不重复回源;
- 锁释放后响应写入缓存,此时自然满足“第 2 次”,后续请求直接 HIT。
这样就把“偶发回源”真正转化为“一次回源、多次服务”,既省后端压力,又避免磁盘写入噪声。
验证是否生效的实操方法
在对应 location 块中加入两行,便于观测行为:
- add_header X-Cache-Status $upstream_cache_status;
- 日志中记录 $upstream_cache_status 字段(如 log_format main ... $upstream_cache_status)
观察返回头:
- MISS:未命中,且本次也未写入缓存(说明未达 min_uses);
- HIT:已从缓存返回,说明该 URI 已成功“达标入缓”;
- 若长期只有 MISS 无 HIT,需检查是否因 cache_key 不一致(如参数未剔除)或路径匹配未覆盖到目标资源。


















