静态资源缓存命中率低的根本原因是请求未进入缓存池,需先检查x-cache-status响应头确认hit/miss/bypass状态,再排查proxy_cache_path配置、cache_key设计及upstream响应规则是否阻断缓存。

静态资源缓存命中率低,根本原因往往不是“没配缓存”,而是请求压根没进缓存池——多数问题出在缓存未真正生效,而非后端扛不住。排查要从请求是否落地缓存开始,而不是一上来就加机器或调后端。
看 X-Cache-Status 响应头确认真实状态
这是最直接的判断依据。在响应头中检查 X-Cache-Status(或 X-Proxy-Cache)字段:
- HIT:缓存命中,内容来自本地缓存
- MISS:请求未命中,且未写入缓存(关键!说明缓存流程中断)
- EXPIRED:缓存存在但已过期,会回源并刷新
-
BYPASS:被显式绕过(如含 Cookie、
$arg_nocache=1、Authorization头等)
用 curl -I 验证:curl -I https://your-domain/static/logo.png,反复观察不同请求的返回值。如果大量是 MISS 或 BYPASS,说明缓存根本没启用成功,不是命中率问题,而是配置失效问题。
查 proxy_cache_path 是否就位且可写
缓存目录没建好、权限不对、参数错位,会导致所有请求静默 fallback 到后端:
- 确认
proxy_cache_path写在http块顶层,不在server或location里 - 手动创建目录并赋权:
sudo mkdir -p /var/cache/nginx/static_cache && sudo chown nginx:nginx /var/cache/nginx/static_cache - 检查磁盘空间和 inodes:
df -h /var/cache/nginx和df -i /var/cache/nginx - 验证
proxy_temp_path是否与缓存路径同文件系统;否则写缓存失败,日志报Permission denied或ERR_CONTENT_LENGTH_MISMATCH
审 cache_key 和 bypass 规则是否污染缓存键
缓存键决定了“什么请求算同一个资源”。若忽略协议、主机、参数差异,极易造成缓存污染或重复缓存:
- 常见错误:仅用
$request_uri,未包含$scheme、$host—— 导致 HTTPS 请求命中 HTTP 缓存 - 静态资源建议精简 key:
proxy_cache_key "$scheme$host$request_uri";(去掉$args和$cookie_*) - 检查是否有隐式 bypass:如 location 中写了
proxy_no_cache $cookie_user_id,但静态资源本不该带 Cookie;或响应头含Set-Cookie、Vary: *,导致默认被跳过 - 若需支持多版本(如 CDN 场景),应在 key 中显式加入
$http_x_forwarded_proto等可信变量
验 upstream 响应是否被缓存规则拒之门外
即使路径对、目录对,上游返回的内容也可能被 Nginx 主动跳过缓存:
- 用
curl -I查真实状态码——常见陷阱是后端返回201、206、304,但proxy_cache_valid只写了200 - 显式声明需缓存的状态码:
proxy_cache_valid 200 201 206 301 302 304 404 1d; - 检查响应头是否含
Cache-Control: no-cache、max-age=0或Set-Cookie;默认会被跳过,加proxy_ignore_headers Cache-Control Expires Set-Cookie;强制接管(仅限可信后端) - 静态资源建议设长时效:
proxy_cache_valid 200 304 1y;











