直接用 proxy_cache 实现反向代理缓存需三步:1. 配置 proxy_cache_path 定义缓存区路径、分层、内存索引及清理策略;2. 在 location 中启用 proxy_cache、设置 proxy_cache_key 和 proxy_cache_valid 等指令控制缓存逻辑;3. 注意后端响应头影响,必要时用 proxy_ignore_headers 覆盖或规范后端缓存头,并通过 x-proxy-cache 响应头和缓存目录验证命中状态。

直接用 proxy_cache 实现反向代理缓存,核心是三步:定义缓存区、启用缓存策略、控制缓存行为。不依赖额外模块,Nginx 开源版原生支持,关键是配置逻辑要对得上请求路径、响应头和缓存生命周期。
1. 先配好缓存存储区(proxy_cache_path)
缓存文件不能随便往磁盘一扔,得提前规划路径、分层结构和内存索引区。例如:
-
路径与分层:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mycache:100m inactive=30m max_size=2g;
→ 缓存文件存在/var/cache/nginx,按 MD5 key 自动建两级子目录(如a/1f),避免单目录文件过多; -
keys_zone 是内存里的“缓存目录表”,100M 大小约可存 80 万个缓存条目,名称
mycache后续在 server 或 location 中引用; - inactive=30m 表示某资源 30 分钟内没被再次命中,就自动清理;max_size=2g 是磁盘上限,超了会按 LRU 清旧数据。
2. 在 location 中开启并绑定缓存
光有缓存区还不够,得告诉 Nginx 哪些请求该缓存、怎么算“可缓存”。典型配置如下:
-
启用缓存:
proxy_cache mycache;—— 必须和keys_zone名称一致; -
设置缓存键:
proxy_cache_key "$scheme$request_method$host$request_uri";—— 默认已够用,如需忽略某些参数(如 utm_source),可手动拼接; -
定义缓存条件:
proxy_cache_valid 200 302 10m;—— 只对 200/302 响应缓存 10 分钟;也可加404 1m单独设错误页缓存时间; -
跳过缓存的请求:比如带 Cookie 或认证头的请求通常不该缓存,可用
proxy_cache_bypass $http_cookie $arg_nocache;控制。
3. 注意后端响应头对缓存的实际影响
Nginx 默认尊重后端返回的 Cache-Control 和 Expires。如果后端返回 Cache-Control: no-cache,即使你写了 proxy_cache_valid,Nginx 也不会缓存。解决办法有两个:
- 强制覆盖:
proxy_ignore_headers Cache-Control Expires Set-Cookie;—— 忽略后端指令,完全由 Nginx 规则决定; - 或更稳妥地,让后端统一返回合理缓存头,比如静态资源返回
Cache-Control: public, max-age=3600,Nginx 会自动按此时间缓存(前提是没设proxy_ignore_headers)。
4. 验证与调试缓存是否生效
最直接的方式是看响应头:
- 命中缓存时,Nginx 会加一个
X-Proxy-Cache: HIT(需自己加add_header X-Proxy-Cache $upstream_cache_status;); - 未命中是
MISS,绕过是BYPASS,正在更新是REVALIDATED; - 同时检查
/var/cache/nginx下是否有生成的文件(注意权限,Nginx 工作用户需有写入权限)。
缓存不是开个开关就完事,它和后端协议、响应头、URL 结构强相关。调通的关键在于先确认缓存区创建成功、再验证 key 是否唯一、最后盯住 upstream_cache_status 状态码。理清这三层,基本就能稳住反向代理的缓存效果。











