Nginx代理缓存真正生效需同时满足:一是在http块中用proxy_cache_path定义缓存区(含keys_zone),二是在location中用proxy_cache绑定该zone、proxy_cache_valid设有效期、proxy_buffering开启,缺一不可。

在 Nginx 中,代理缓存的开关由 proxy_cache 指令控制,它本身不直接“开/关”缓存功能,而是决定是否启用某个已定义的缓存区(zone)。真正启用缓存,必须同时满足两个条件:一是 proxy_cache 指向一个合法的 keys_zone 名称;二是该 zone 已通过 proxy_cache_path 正确声明。
开启代理缓存的关键步骤
要让缓存生效,不能只写 proxy_cache my_cache;,还需前置配置:
- 在
http块中用proxy_cache_path定义缓存存储路径与 zone,例如:proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off; - 在
location或server块中启用该 zone:proxy_cache my_cache; - 设置缓存有效期,否则默认不缓存(即使状态码匹配):
proxy_cache_valid 200 304 12h;或proxy_cache_valid any 10m; - 确保
proxy_buffering on;(默认即为 on),因为 proxy_cache 仅在缓冲开启时才起作用
关闭代理缓存的几种方式
关闭缓存不是简单删掉指令,而要明确阻断缓存链路:
- 最直接有效的方式是:在对应 location 中写
proxy_cache off;—— 这会覆盖上级继承的缓存配置 - 若想全局禁用,可在
http块顶部设proxy_cache off;,但注意这会被子块中的proxy_cache zone_name;覆盖 - 也可移除或注释掉
proxy_cache行,但需确认没有其他层级(如 server)意外继承了缓存指令 - 额外建议同步关闭关联行为:
–proxy_cache_valid不再生效
–add_header Nginx-Cache "$upstream_cache_status";将始终显示BYPASS或空值
验证缓存是否真正生效
光看配置不够,得观察运行时行为:
- 在响应头中添加
add_header X-Cache-Status $upstream_cache_status;,命中返回HIT,未命中首次为MIS,绕过为BYPASS - 检查
/var/cache/nginx(或你指定的路径)下是否有按levels结构生成的子目录和文件 - 注意:POST、PUT 等非安全方法默认不缓存;带 Cookie、Authorization 或 vary 头的响应也常被跳过,需用
proxy_cache_bypass和proxy_no_cache显式干预
缓存开关本身很简单,但是否真起作用,取决于路径、权限、响应特征和配套指令的协同。别只改一行,要通盘检查。











