proxy_cache_min_uses 的核心作用是延迟缓存写入,仅在请求达到指定次数(如2次)后才将响应写入磁盘,从而过滤调试、爬虫、随机参数等低价值访问;需配合 proxy_cache_lock 和精简的 proxy_cache_key 才能生效。
的核心作用,是让 Nginx 对“偶发性访问”保持克制——不急着落盘,只在确认有真实复用价值后才写入缓存。它不拦截请求、不跳过回源,但能有效防止单次调试、爬虫试探、参数随机的埋点等低价值请求,把磁盘空间和 keys_zone 内存留给真正高频的内容。
静态资源路径设为 2~3,过滤一次性抓取
这类资源(
、
、
、
等)天然具备复用性,但大量偶发访问来自:
构建工具预览时的单次加载
爬虫或监控系统的一轮扫描
前端开发者本地调试的临时请求
设
后:
第 1 次访问仍回源,响应不写盘
第 2 次同 URI 请求触发写入,后续全部 HIT
实测可减少 40%~60% 的无效小文件生成
配置示例:
动态接口按语义分层,避免一刀切
不是所有动态路径都适合统一设高值,需结合业务逻辑判断是否“真有复用可能”:
、
这类公共入口:保持
,首次即缓存更合理
或
:设为
或
,匹配用户真实回访节奏
这类带毫秒时间戳的上报:
不依赖 min_uses
,直接用
或
跳出缓存流程
必须启用
proxy
_cache_lock,否则前几次请求仍会并发刷盘
仅设
不够——若无锁机制,第 1 次和第 2 次请求可能同时回源、各自尝试写缓存(哪怕只有一次成功),IO 消耗翻倍。加锁后:
第 1 次请求回源 + 加锁
第 2 次请求等待锁释放,不重复发起后端请求
锁释放时统一写入一次,自然满足
条件
务必同步配置:
精简 cache_key 是前提,否则 min_uses 形同虚设
如果
包含
或
,那么
和
就是两个 key,永远达不到计数门槛。应显式剔除干扰字段:
对无法精简的路径(如含大量 utm 参数),可用
预处理:
上线后看效果,别只信配置
加了
不代表就起效,要验证是否真在过滤偶发访问:
在 response header 中暴露状态:
查日志中某类路径是否长期
却从不转为
统计缓存目录新建小文件数:
,对比调参前后变化
观察
下,大量缓存是否几秒内就被淘汰——那是典型的“写了一次就丢”
不复杂但容易忽略
proxy_cache_min_uses.js.css.png.woff2proxy_cache_min_uses 2location ~* \.(js|css|png|jpg|gif|webp|woff2?)$ {
proxy_cache static_cache;
proxy_cache_valid 200 1d;
proxy_cache_min_uses 2;
proxy_cache_lock on;
proxy_cache_lock_timeout 5s;
}/api/config/min_uses 1/api/article?id=123/user/profile?uid=45623/log?r=abc&t=1746216840proxy_no_cache 1proxy_cache_bypass $arg_r $arg_tmin_uses 2min_uses=2proxy_cache_lock on;
proxy_cache_lock_timeout 5s;proxy_cache_key$args$request_uri/log?t=1746216840&r=a/log?t=1746216841&r=bproxy_cache_key "$scheme$host$uri$is_args$arg_id$arg_type";mapmap $args $skip_cache {
~utm_source= 1;
~r=[a-zA-Z0-9]+ 1;
default 0;
}
proxy_cache_bypass $skip_cache;
proxy_no_cache $skip_cache;min_usesadd_header X-Cache-Status $upstream_cache_status;MISSHITfind /var/cache/nginx -type f -mmin -30 | wc -linactive=60m