nginx可通过map指令基于content-type响应头动态设置差异化缓存策略:将$upstream_http_content_type映射为$cache_ttl变量,再在proxy_cache_valid中按类型设定不同缓存时长,并配合proxy_cache_bypass和proxy_no_cache实现精准控制。

在 Nginx 边缘缓存场景中,对不同 MIME 类型设置差异化回源策略,是提升缓存命中率、降低源站压力、保障内容时效性的关键。核心思路是:不统一用 proxy_cache_valid 一刀切,而是结合 Content-Type 响应头,动态控制缓存时间、是否允许缓存、是否跳过缓存等行为。
按 MIME 类型匹配并分类处理
Nginx 本身不直接支持基于响应头(如 Content-Type)做缓存策略分支,但可通过 map 指令将响应头映射为变量,再在 proxy_cache_valid 或 proxy_no_cache 中引用该变量。常用做法是:
- 在
http块中定义map,提取$upstream_http_content_type并归类为文本、图片、JSON、HTML 等逻辑类型 - 使用
proxy_cache_valid的多参数语法,按变量值分别设定缓存有效期 - 配合
proxy_cache_bypass和proxy_no_cache实现“API 不缓存”“调试请求强制回源”等控制
典型 MIME 分组与缓存建议
以下为常见分组示例(写在 http 块内):
map $upstream_http_content_type $cache_ttl {
default "10m";
~*^text/html "5m";
~*^application/json "30s";
~*^application/javascript "1h";
~*^text/css "1h";
~*^image/ "7d";
~*^font/ "1y";
~*^application/wasm "1h";
}
说明:
-
~*表示忽略大小写的正则匹配;^text/html匹配以text/html开头的类型(兼容text/html; charset=utf-8) -
default是兜底策略,避免未匹配时变量为空导致缓存失效 - 静态资源(JS/CSS/图片/字体/WASM)设长缓存,HTML 设短缓存或配合 ETag 强校验,API(JSON)设极短缓存甚至禁用
配合缓存绕过与条件刷新
仅靠 cache_ttl 不够,还需控制“什么情况下不走缓存”:
- 对带
Cookie或Authorization的请求,默认跳过缓存:proxy_cache_bypass $cookie_nocache $arg_nocache $http_pragma $http_authorization; - 对 JSON 接口,可进一步禁止缓存:
proxy_no_cache $upstream_http_content_type;配合 map 将 JSON 映射为 1,其余为 0 - 在
location中引用:proxy_cache_valid 200 302 $cache_ttl;—— 注意必须写状态码,否则无效
验证与调试技巧
上线前务必验证实际生效的缓存行为:
- 用
curl -I查看响应头:X-Cache: HIT或MISS、Age、Cache-Control是否符合预期 - 检查 Nginx error log 中是否有
cache miss due to cache bypass类提示 - 临时加
add_header X-Content-Type $upstream_http_content_type;和X-Cache-TTL $cache_ttl;辅助定位匹配逻辑 - 注意:
$upstream_http_*变量只在 proxy_pass 后可用,不能在 map 外直接 echo











