nginx缓存未命中导致频繁回源,核心是验证请求是否真正进入缓存,需同步检查日志中$upstream_cache_status状态、响应头cache-control/set-cookie等禁用字段、缓存目录文件生成情况及proxy_cache_key是否含动态参数。

缓存未命中导致频繁回源,是带宽飙升最常见也最容易被忽视的原因。核心不是“有没有配缓存”,而是“请求是否真进了缓存、为什么没命中、谁在绕过它”。排查要从日志、响应头、缓存文件、请求特征四方面同步验证。
看日志里的 $upstream_cache_status
这是最直接的证据,不能只靠 curl 或主观判断:
- 在 Nginx 的 http 块中定义日志格式:log_format cache '$remote_addr - $upstream_cache_status $time_local "$request" $status $body_bytes_sent';
- 在对应 location 的 access_log 中启用该格式,重启 Nginx
- 观察日志中该字段值:HIT 表示命中,MISS 表示首次未命中,EXPIRED 表示缓存存在但已过期,BYPASS 表示被主动跳过(如含 Cookie、no-cache 头等)
- 如果大量出现 BYPASS 或 EXPIRED,说明不是没缓存,而是被规则绕过或过期太快
检查响应头是否允许缓存
后端返回的响应头会直接覆盖 Nginx 缓存策略:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 用 curl -I 请求目标 URL,重点看:Cache-Control、Expires、Set-Cookie、Vary
- 只要出现 Cache-Control: no-store / private / no-cache 或任意 Set-Cookie:,Nginx 默认不缓存(除非显式配置 proxy_ignore_headers Set-Cookie)
- 若后端无法修改,可在 Nginx 层覆盖:加 proxy_cache_valid 200 302 10m;(优先级高于响应头),并隐藏干扰头:proxy_hide_header Set-Cookie;
确认缓存文件是否真实生成
配置再对,没写入磁盘等于没缓存:
- 进入 proxy_cache_path 指定目录(如 /var/cache/nginx/),执行:find . -type f | head -10
- 若无任何文件,检查:proxy_cache_path 目录权限(Nginx 进程用户是否可写)、proxy_temp_path 是否同文件系统且可写、磁盘空间是否充足
- 若有文件,用 stat 查看修改时间,对比请求时间——若频繁刷新,说明 key 不稳定或 inactive 设置过短
分析缓存 key 是否被干扰
key 设计不合理,会让同一资源生成无数个缓存副本:
- 默认 proxy_cache_key $scheme$host$request_uri; 很危险:带 ?t=123456、?utm_source=xxx 就算不同 key
- 用 map 清洗 query 参数,例如剥离时间戳:if ($args ~ "(t|timestamp|_)=\w+") { set $clean_uri $uri; },再用 $clean_uri 构建 key
- 避免把易变字段写进 key:如 $cookie_sessionid、$http_user_agent;静态资源建议统一用 $uri










