Nginx proxy_cache需系统配置:一、http块定义cache_path;二、location中精准启用并设valid与bypass;三、显式定义干净cache_key;四、用X-Cache-Status验证命中。

Nginx proxy_cache 不是开个开关就能见效的“魔法按钮”,而是需要理解缓存区域、命中逻辑、生命周期和可观测性四者协同的系统工程。掌握基础,关键在做对三件事:定义好缓存区、精准启用缓存、能验证是否真在缓存。
一、缓存区必须在 http 块里提前声明
所有缓存配置的前提是:缓存路径和内存索引区(keys_zone)必须写在 http 块顶层,不能放在 server 或 location 里。
典型写法:
proxy_cache_path /var/cache/nginx/static levels=1:2 keys_zone=static_cache:128m max_size=20g inactive=3d use_temp_path=off;
- /var/cache/nginx/static 需手动创建,并确保 nginx 进程(如 www-data)有读写权限
- levels=1:2 表示两级子目录结构,避免单目录文件爆炸,建议保留
- keys_zone=static_cache:128m 中的 128MB 内存可支撑约百万级缓存 key;静态资源多时不要低于 64m
- use_temp_path=off 是关键优化,跳过临时中转,减少磁盘 IO
二、在 location 中精准启用,不全局乱套
缓存不是越广越好,要按资源类型窄匹配、按状态码分策略、按参数控绕过。
- 只对明确静态后缀启用:
location ~* \.(js|css|png|jpg|webp|woff2|ttf)$ - 绑定缓存区:
proxy_cache static_cache;(名称必须与 keys_zone 一致) - 分级设置有效期:
proxy_cache_valid 200 301 302 1d;、proxy_cache_valid 404 1m; - 允许客户端跳过缓存:
proxy_cache_bypass $http_cache_control;(支持 no-cache 请求) - 后端异常仍可用旧缓存:
proxy_cache_use_stale error timeout updating http_500;
三、缓存键(cache_key)要干净且稳定
默认 key 容易因 URL 参数(如 utm_source、sid)或请求头(如 User-Agent)导致重复缓存或漏命中。
- 推荐显式定义:
proxy_cache_key "$scheme$request_method$host$uri$is_args$args"; - 若含干扰参数(如 ?v=123 或 &utm_medium=email),应过滤:
proxy_cache_key "$scheme$request_method$host$uri$is_args$arg_foo$arg_bar"; - 多域名共用同一缓存区时,
$host必须保留,否则不同站资源会相互覆盖 - 避免包含
$cookie_*、$http_user_agent等高变字段,防止缓存碎片化
四、上线前必须验证命中状态
配置写完不等于生效。加一个响应头,立刻看清缓存是否真正起作用:
- 在 location 中添加:
add_header X-Cache-Status $upstream_cache_status; - 返回值含义:HIT(命中)、MISS(未命中)、BYPASS(被绕过)
- 用 curl 测试:
curl -I https://example.com/style.css,观察响应头中X-Cache-Status字段 - 搭配
access_log记录缓存状态,便于批量分析命中率



















