<p>Nginx proxy_cache 仅缓存指定后缀静态资源需在匹配后缀的 location 块中启用,且必须含 proxy_pass;先定义 proxy_cache_path,再用正则 location ~* .(js|css|png|...)$ 精确匹配,配合 upstream 伪代理和 cache 策略。</p>

要让 Nginx 的 proxy_cache 仅缓存指定后缀的静态资源(如 .js、.css、.png),关键不是“全局开启再过滤”,而是**在匹配这些后缀的 location 块中精准启用缓存**,同时确保其他 location 不参与、不干扰。配置必须满足三个前提:缓存区已定义、location 精确匹配、且该 location 必须含 proxy_pass(proxy_cache 无法与 root/alias 直出共存)。
一、先在 http 块中定义缓存区
这是所有缓存功能的基础,必须放在 http{...} 内,不能写在 server 或 location 里:
proxy_cache_path /var/cache/nginx/static_cache levels=1:2 keys_zone=static_cache:10m max_size=1g inactive=7d use_temp_path=off;- keys_zone 名称(如
static_cache)后续 location 中必须完全一致 -
use_temp_path=off是性能关键项,避免多一次磁盘拷贝 - 路径
/var/cache/nginx/static_cache需确保 Nginx worker 进程有读写权限
二、用正则 location 精确匹配目标后缀
只对明确属于静态资源的请求启用缓存,避免误缓存 HTML、API 等动态内容:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
- 推荐写法:
location ~* \.(js|css|png|jpg|gif|webp|woff2|ttf|svg|eot)$ -
~*表示大小写不敏感匹配,覆盖.JS或.Png等变体 - 不要写成
location /static/这类前缀匹配——它可能把/static/api.json也卷进来 - 若需排除带参数的资源(如
logo.png?v=2),加proxy_cache_bypass $args;
三、该 location 必须走 proxy_pass,不能用 root/alias
Nginx 要求 proxy_cache 只能在含 proxy_pass 的 location 中生效。所以即使文件就在本地,也要“伪代理”一次:
- 方案 A(推荐):用内部命名 location 模拟本地服务
location ~* \.(js|css|png|jpg|gif)$ {<br> proxy_pass http://_local_static_;<br> proxy_cache static_cache;<br> proxy_cache_valid 200 302 1y;<br> add_header X-Cache-Status $upstream_cache_status;<br>}
再在 http 块中定义:upstream _local_static_ { server 127.0.0.1:8080; },并配一个监听 8080 的 server 块,用root /data/www;提供文件 - 方案 B:直接 proxy_pass 到本机另一个端口(如 8080),该端口 server 块只负责静态文件服务
- ⚠️ 错误做法:
location ... { root /data/www; proxy_cache ...; }—— 此配置下proxy_cache会被忽略
四、设置缓存策略与验证头
在上述匹配 location 中补充以下指令,控制行为并便于调试:
-
proxy_cache_valid 200 302 1y;—— 成功响应缓存 1 年(静态资源适合长周期) -
proxy_cache_valid 404 1m;—— 缓存 404 1 分钟,防恶意探测刷量 -
proxy_ignore_headers Set-Cookie Expires Cache-Control;—— 忽略后端可能错误返回的干扰头 -
proxy_cache_key "$scheme$host$request_uri";—— 去掉$args和$cookie,避免缓存碎片 -
add_header X-Cache-Status $upstream_cache_status;—— 用curl -I查看是否返回HIT

















