proxy_cache_valid指令用于在Nginx中主动设定不同HTTP状态码的缓存时长,需配合proxy_cache使用,并可通过proxy_ignore_headers避免响应头干扰。

可以通过 proxy_cache_valid 指令在 Nginx 的 http、server 或 location 块中,为不同 HTTP 状态码或状态码范围分别指定缓存时长。它不依赖后端响应头,而是由 Nginx 主动控制缓存生命周期,对提升稳定性与抗压能力特别实用。
支持的状态码写法要准确
该指令接受三种形式的匹配方式,按书写顺序生效(就近匹配优先):
-
单个状态码:如
404 1m表示 404 响应缓存 1 分钟 -
多个状态码空格分隔:如
200 301 302 10m表示这三类响应统一缓存 10 分钟 -
状态码范围(Nginx 1.11.6+):如
200-399 5m匹配所有成功及重定向响应;500-599 30s缓存所有服务端错误响应半分钟
必须配合 proxy_cache 才能生效
仅配置 proxy_cache_valid 不起作用,需确保对应上下文已启用缓存区域:
- 在
http块中定义缓存区:proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m; - 在
location中启用:proxy_cache my_cache; - 再添加
proxy_cache_valid规则,例如:proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m;
注意响应头与 ignore_headers 的冲突
Nginx 默认会遵循后端返回的 Cache-Control、Expires、Set-Cookie 等头部,可能覆盖 proxy_cache_valid 设置:
- 若后端返回
Cache-Control: no-cache,Nginx 默认不缓存该响应 - 需显式禁用干扰项,例如:
proxy_ignore_headers Cache-Control Expires Set-Cookie; - 也可只忽略特定项,如只需忽略
Set-Cookie(常见于静态资源被错误注入 cookie 的场景)
典型配置示例
一个兼顾可用性与容错的常用组合:
-
proxy_cache_valid 200 301 302 10m;—— 正常响应缓存较久 -
proxy_cache_valid 404 1m;—— 防止高频探测不存在路径打垮后端 -
proxy_cache_valid 500 502 503 504 30s;—— 出错时短暂缓存,避免雪崩 -
proxy_ignore_headers Cache-Control Expires;—— 确保上述规则强制生效


















