可通过Content-Type与Content-Length联合匹配,结合map指令定义$cache_key变量,仅当响应为图片且大小≥100KB时启用proxy_cache,实现只缓存大图、跳过小文本的精准控制。

可以通过 按响应内容类型(Content-Type)和响应大小(Content-Length)联合匹配,结合 proxy_cache_bypass、proxy_no_cache 和 map 指令实现“只缓存大图、跳过小文本”的精准控制。
用 map 区分图片与文本资源
先根据请求路径或 MIME 类型识别是否为图片,并估算是否属于“大图”:
- 利用
$sent_http_content_type获取响应头中的类型(如image/jpeg、text/html) - 配合
$sent_http_content_length判断响应体大小(注意:需启用underscores_in_headers on;并确保后端返回真实 Content-Length) - 定义一个缓存开关变量,例如
$cache_key,仅当满足“是图片且体积 ≥ 100KB”时设为非空值
示例配置片段:
map "$sent_http_content_type $sent_http_content_length" $cache_key {
~^image/.*\s[0-9]{6,} "$host$request_uri"; # 图片且 Content-Length ≥ 100000 字节(即 ≥100KB)
default ""; # 其他情况不缓存
}配置 proxy_cache 只对符合条件的响应生效
将 proxy_cache 绑定到该变量,同时禁用默认缓存行为:
- 在 location 块中设置
proxy_cache_valid 200 302 1h;(仅对命中 $cache_key 的响应生效) - 添加
proxy_cache_bypass $cache_key;和proxy_no_cache $cache_key;—— 实际上这里只需proxy_cache $cache_key;,因为变量为空时 Nginx 不会启用缓存 - 务必设置
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;提升大图加载容错性
绕过小文本缓存的补充手段
对已知的小文本类资源(如 API JSON、HTML 页面、JS/CSS),可主动排除:
- 在对应 location 或 if 块中显式关闭缓存:
proxy_cache off; - 或用
add_header X-Cache-Status "$upstream_cache_status";方便调试哪些请求被缓存了 - 避免依赖
if判断$sent_http_content_length—— 因为该变量在 rewrite 阶段不可用,必须用 map 在日志/代理阶段处理
验证与调优要点
上线前需确认几个关键点:
- 后端必须返回准确的
Content-Length(静态文件服务通常支持;动态接口如 PHP/Node.js 需开启输出缓冲并禁用 chunked encoding) - 使用
curl -I查看响应头,确认Content-Type和Content-Length是否符合预期 - 检查
/var/cache/nginx/目录下是否有新增缓存文件,并比对X-Cache-Status响应头(HIT/MISS) - 对 PNG/GIF/WebP 等图片类型,建议统一用
~^image/.*匹配,而非枚举后缀


















