nginx缓存特定url路径需三要素:http块定义proxy_cache_path、location中启用proxy_cache并匹配目标路径、配合proxy_pass反向代理;必须校验缓存区名称一致性、权限、响应头及缓存键设置。

要在 Nginx 中缓存特定 URL 路径(比如 /api/v1/user 或 /status),必须使用反向代理缓存机制,不能靠浏览器缓存指令(如 expires 或 add_header Cache-Control)。核心是三要素缺一不可:定义缓存区(proxy_cache_path)、启用缓存(proxy_cache)、设置缓存规则(proxy_cache_valid),且必须配合 proxy_pass 才生效。
必须在 http 块顶层配置 proxy_cache_path
proxy_cache_path 只能在 http 上下文中使用,若误写在 server 或 location 块内,Nginx 会静默忽略,导致后续所有缓存配置失效。
- 示例(正确位置):
http {
proxy_cache_path /var/cache/nginx/my_cache levels=1:2 keys_zone=my_cache:100m max_size=10g inactive=1d use_temp_path=off;
...
}
-
keys_zone=my_cache:100m中的my_cache是缓存区名称,后续proxy_cache my_cache必须与之完全一致(注意大小写和下划线); -
use_temp_path=off推荐开启,避免跨文件系统复制开销; - 确保
/var/cache/nginx/目录存在且 Nginx 进程有读写权限(如chown -R nginx:nginx /var/cache/nginx)。
用 location 精确匹配目标路径并启用缓存
仅靠 location = /path 不够健壮,推荐用正则匹配加锚定,避免路径前缀误命中。
- 例如只缓存
/api/v1/user和/status(不带子路径):
location ~ ^/(api/v1/user|status)$ {
proxy_cache my_cache;
proxy_cache_valid 200 301 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout updating;
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
- 结尾的
$防止匹配到/api/v1/user/profile; -
proxy_pass必须指向一个上游服务器(如http://backend),不能是本地root或alias—— 否则缓存不触发; - 若后端响应含
Set-Cookie、Cache-Control: no-cache或非 200/301/302 状态码,默认不缓存,可加proxy_ignore_headers Set-Cookie Cache-Control Expires;覆盖。
优化缓存键,避免查询参数导致缓存碎片
默认 proxy_cache_key 包含 $args,导致 /api/v1/user?ts=123 和 ?ts=456 被视为不同缓存项。对只读接口,应主动剔除参数干扰。
- 在对应
location块中显式设置:
proxy_cache_key "$scheme$request_method$host$uri";
-
$uri不含查询字符串,比$request_uri更干净; - 如需按用户登录态区分缓存(如带
Cookie),可加入:proxy_cache_key "$scheme$request_method$host$uri$cookie_sessionid";; - 建议开启
proxy_cache_lock on;,防止缓存未命中时多个并发请求同时穿透到后端。
验证缓存是否生效
加一句头信息便于调试:
add_header X-Cache-Status $upstream_cache_status;
- 首次访问返回
X-Cache-Status: MISS; - 再次访问相同路径(无参数或参数被
$uri忽略)返回HIT; - 检查磁盘缓存目录:
ls /var/cache/nginx/my_cache/应出现哈希命名的文件; - 若始终是
MISS,重点排查:proxy_cache_path位置、keys_zone名称一致性、proxy_pass是否存在、后端响应头是否被拒绝缓存。











