proxy_cache_min_uses 控制缓存写入门槛,需同一 cache key 连续访问指定次数且响应可缓存才落盘,设为3可减少长尾请求对SSD的无效写入。

这个配置本身不用于“拦截”请求,而是控制缓存准入门槛——proxy_cache_min_uses 的作用是:只有当某个 URL 被相同客户端(或满足 proxy_cache_key 规则)连续访问达到指定次数后,Nginx 才将其响应写入磁盘缓存。它不能直接拦截请求,但合理设置可显著减少低频长尾请求对 SSD 的无效写入。
理解 min_uses 的缓存触发逻辑
Nginx 默认对每个请求都尝试缓存(除非被 proxy_no_cache 或 proxy_cache_bypass 排除),但若设置了 proxy_cache_min_uses 1(默认值),意味着首次命中就写缓存;设为 3,则需同一缓存 key 连续 3 次未命中上游、且响应可缓存(状态码 200/301/302 等 + 合法 Cache-Control/Expires),第 3 次响应才会落盘。
关键点:
- 计数基于 proxy_cache_key 定义的键(如 $scheme$host$request_uri),不是原始 URL,注意含参数、Cookie、Header 的组合是否导致 key 过度发散
- 计数在 worker 进程内存中维持,不跨进程持久化,重启后清零
- 仅对“可缓存响应”生效;若响应头含 Cache-Control: private/no-store,即使满足次数也不缓存
针对 SSD 损耗的典型配置策略
SSD 写放大和擦写寿命主要受小文件高频随机写影响。长尾请求往往对应唯一性高、复用率极低的 URL(如带时间戳、UUID、用户 ID 的 API),它们生成大量只写一次、永不读取的缓存文件,徒增 write IOPS 和磨损。
推荐做法:
- 将 proxy_cache_min_uses 设为 2~5(如 3),避免单次请求即落盘;多数长尾请求无法达到该阈值,自然被跳过缓存写入
- 配合 proxy_cache_lock on,防止同一 key 的并发请求多次穿透上游并重复尝试写缓存
- 启用 proxy_cache_use_stale updating,让后续请求在后台更新时仍可返回旧缓存,进一步降低新缓存写入压力
必须同步优化的配套项
单靠 min_uses 不足以保护 SSD,还需约束缓存生命周期与存储结构:
- 严格设置 proxy_cache_valid:例如 proxy_cache_valid 200 302 10m;避免长尾内容长期滞留,占用空间并增加淘汰开销
- 限制单个缓存文件大小:用 proxy_cache_max_range_offset 或 upstream 响应头控制大文件分片缓存;对 >1MB 的响应建议禁用缓存(via proxy_no_cache)
- 启用缓存路径哈希分级:proxy_cache_path ... levels=1:2 ...;避免单目录下文件过多引发 inode 查找延迟和元数据写放大
- 监控 cache_miss / cache_hit 比率:若 miss_rate 长期 >95%,说明 min_uses 可能仍偏低,或 cache_key 设计不合理(如误含动态参数)
验证是否生效的简单方法
通过日志确认低频请求是否真正绕过写入:
- 在 log_format 中加入 $upstream_cache_status 字段(如 HIT/MISS/EXPIRED/BYPASS/MISS_WITHOUT_CACHE)
- 观察连续两次相同请求:第一次应为 MISS,第二次若仍为 MISS(非 BYPASS),说明未达 min_uses,未写盘;第三次起才可能变为 HIT
- 检查缓存目录(如 /var/cache/nginx/proxy/)下文件增长速率;开启 min_uses=3 后,文件新建数量应明显下降











