跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

如何配置 proxy_cache_min_uses 避免偶发性访问占用缓存空间

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

相关文章