应为静态资源单独配置proxy_cache_min_uses=2并置于location块中,配合proxy_cache_lock防并发穿透、clean cache_key剔除干扰参数、inactive与max_size控制生命周期。

要避免偶发请求污染静态热点缓存,关键不是阻止它们访问,而是不让它们的响应写进缓存——proxy_cache_min_uses 的作用正是设一道“热度门槛”,只让真正被重复访问的静态资源落盘,把爬虫试探、调试拼错、单次点击这类噪声挡在缓存门外。
静态资源路径单独配置 min_uses=2
不要在 http 或 server 块里全局设置,而是在匹配静态资源的 location 中精准控制:
- 用正则明确覆盖常见后缀:
location ~* \.(js|css|png|jpg|gif|woff2?|ttf|svg)$ - 内部启用缓存并设阈值:
proxy_cache_min_uses 2; - 这样首次请求仍会回源、查缓存(若已有副本可能 HIT),但响应体不写入磁盘;第二次相同 key 请求才正式缓存
必须搭配 proxy_cache_lock 防并发穿透
只设 min_uses=2 不够——两个相同 URI 请求几乎同时到达时,都可能绕过缓存直接回源。加锁才能确保“一次回源、多次服务”:
-
proxy_cache_lock on;:首个请求触发回源并加锁 -
proxy_cache_lock_timeout 5s;:避免等待过久,略大于后端平均响应时间即可 - 第二个请求会阻塞等待,锁释放后自动拿到刚写入的缓存,自然满足“第 2 次”,后续全为 HIT
清理 cache_key 中的干扰参数
如果静态资源带随机参数(如 /logo.png?v=abc123),默认 cache_key 会把整个 URI 当新条目,min_uses 计数无法累积。需主动剔除:
- 在对应 location 中定义干净的 key:
proxy_cache_key "$scheme$request_method$host$uri"; - 或更稳妥地排除所有查询参数:
proxy_cache_key "$scheme$request_method$host$uri$is_args"; - 这样不同 v 参数都指向同一 key,计数可复用,min_uses 才真正生效
配合 inactive 和 max_size 控制缓存生命周期
即使少量长尾请求误入缓存,也要防止它们长期滞留:
-
inactive=1h;:1 小时内无访问即自动淘汰,避免冷数据堆积 -
max_size=500m;:限制磁盘总用量,配合 LRU 自动清理低频项 - 再加一行
proxy_cache_use_stale updating;,后台更新时仍可返回旧缓存,进一步降低写入压力











