nginx proxy_cache实现代理缓存需三步协同:一是在http块中用proxy_cache_path定义缓存路径、levels、keys_zone、max_size、inactive等参数;二是在location中用proxy_cache、proxy_cache_key、proxy_cache_valid启用并精细控制缓存;三是通过proxy_no_cache、proxy_cache_bypass等处理绕过逻辑,缺一不可。

配置 Nginx 的 proxy_cache 实现代理缓存,核心是三步:定义缓存存储区、在 location 中启用缓存、设置缓存策略。它不是开个开关就生效,必须各环节协同,否则容易“看起来配了,实际不缓存”。
定义缓存路径与共享内存区(必须在 http 块)
这是整个缓存系统的地基,只能写在 http{...} 里,不能放在 server 或 location 内。
-
proxy_cache_path指定磁盘位置、目录结构、内存索引区和清理规则 - 常用参数:
/var/cache/nginx是缓存文件存放路径levels=1:2表示两级子目录(如ab/cdef123...),避免单目录文件过多keys_zone=my_cache:10m创建名为my_cache的共享内存区,10MB 用于快速查找缓存键(必填)max_size=10g磁盘总容量上限,超限时自动淘汰旧缓存inactive=60m60 分钟内未被访问的缓存条目会被清理use_temp_path=off关闭临时路径,提升写入效率(推荐)
示例:
在 location 中启用并控制缓存行为
缓存真正起效发生在请求匹配的 location 块中,需明确指定使用哪个缓存区,并定义缓存键和有效期。
-
proxy_cache my_cache启用缓存,名称必须与keys_zone一致 -
proxy_cache_key决定“什么算同一个请求”,默认值较简单,建议显式定义以避免误命中。常见组合:"$scheme$request_method$host$request_uri"(忽略 Cookie 和参数差异)"$scheme$request_method$host$request_uri$is_args$args"(区分带参请求)"$scheme$request_method$host$request_uri$http_cookie"(按用户 Cookie 区分,适合个性化内容) -
proxy_cache_valid按响应状态码设置不同缓存时间:proxy_cache_valid 200 301 302 10m;proxy_cache_valid 404 1m;proxy_cache_valid any 5m;(兜底规则)
处理缓存绕过与特殊场景
不是所有请求都该进缓存,比如带认证、调试参数或用户私有接口。
-
proxy_no_cache和proxy_cache_bypass都用于跳过缓存,但逻辑不同:proxy_no_cache $cookie_nocache $arg_nocache $http_pragma;—— 满足任一条件,**不存缓存**(响应仍发给客户端)proxy_cache_bypass $cookie_nocache $arg_nocache $http_pragma;—— 满足任一条件,**不读缓存,直接回源**(同时也不存) - 对敏感路径禁用缓存,例如用户中心:
location /api/user/ { proxy_pass http://backend; proxy_cache_bypass 1; } - 允许使用过期缓存应对后端故障:
proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
验证缓存是否生效
光看配置不够,要确认运行效果:
- 检查响应头是否含
X-Cache: HIT或MISS(需在 location 中加:add_header X-Cache $upstream_cache_status;) - 查看缓存目录是否有生成的文件:
ls -R /var/cache/nginx/ - 用
curl -I多次请求同一 URL,观察响应时间变化和X-Cache值切换 - 注意:后端响应头中的
Cache-Control: no-cache、Set-Cookie或状态码为 200 以外的某些类型,默认会阻止缓存,可配合proxy_ignore_headers覆盖











