CDN 缓存命中率为零通常意味着请求直接回源,最常见的原因是源站响应头禁止缓存、CDN 缓存规则配置错误,或域名备案及鉴权配置拦截了正常请求。
先说结论:命中率为零通常是配置拦截了缓存或统计口径问题,需优先检查源站响应头和 CDN 缓存规则。
- 先确认:源站是否返回了禁止缓存的 Header(如 no-cache)。
- 先处理:CDN 控制台的缓存过期时间和缓存键配置。
- 再验证:请求响应头中的缓存命中状态及控制台流量数据。
快速诊断:curl 命令实战
使用 curl 命令直接查看响应头,快速判断源站是否允许缓存。重点观察 Cache-Control、Pragma 以及 CDN 特有的命中标识(如 X-Cache)。
curl -I https://your-domain.com/static/app.js场景一:源站禁止缓存(导致未命中)
若返回头中包含 no-cache 或 no-store,CDN 将不会存储该资源。
HTTP/1.1 200 OK
Date: Mon, 01 Jan 2024 00:00:00 GMT
Content-Type: application/javascript
Cache-Control: no-cache
Pragma: no-cache
X-Cache: MISS
场景二:缓存生效(正常命中)
若返回头中包含 max-age 且 CDN 标识为 HIT,说明缓存正常。
HTTP/1.1 200 OK
Date: Mon, 01 Jan 2024 00:00:00 GMT
Content-Type: application/javascript
Cache-Control: max-age=86400
X-Cache: HIT
源站配置修正(Nginx 示例)
若确认源站禁止了缓存,需修改 Web 服务器配置。以下是 Nginx 允许静态资源缓存的典型配置:
server {
listen 80;
server_name your-domain.com;
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires 1d;
add_header Cache-Control "public";
add_header X-Cache-Status $upstream_cache_status;
}
}修改配置后,记得重载 Nginx:nginx -s reload。
CDN 控制台配置指引
- 检查缓存过期时间
登录 CDN 控制台,进入「域名管理」->「缓存配置」。确认是否对特定文件后缀(如 .js, .css, .png)设置了缓存过期时间(TTL)。若设置为 0 秒或未配置,需调整为合理时长(如静态资源设置 1 天以上)。
- 检查缓存键规则
若业务 URL 带有无关参数(如
?v=123),在「缓存键配置」中选择“忽略参数”或“保留指定参数”,避免参数变化导致缓存分散。 - 检查基础配置与鉴权
确认域名已完成备案(国内 CDN 必需)。检查防盗链黑白名单是否误拦截正常 Referer。若开启鉴权,确认客户端请求携带了正确的鉴权参数。
- 检查回源配置
若控制台显示回源流量大于总下行流量,检查是否开启了“分片回源”而源站不支持 Range 请求。如有冲突,建议源站支持 Range 或关闭 CDN 分片回源功能。
验证与常见坑
- 响应头验证:再次请求资源,查看响应头中是否出现
X-Cache: HIT或类似命中标识(不同厂商标识不同)。 - 控制台数据:在 CDN 控制台查看“流量命中率”监控图表,观察数值是否回升。注意数据可能有几分钟延迟。
- 多次请求测试:对同一 URL 发起多次请求,第一次通常为 MISS,后续请求应变为 HIT。
- HEAD 请求不缓存:部分 CDN 默认不缓存 HEAD 请求,即使预热也可能显示未命中。
- 频繁刷新缓存:提交刷新任务后,已缓存内容会被强制过期,短时间内命中率会下降。
- 动态内容过多:若加速域名下多为 PHP、JSP 等动态页面,默认不回源缓存,需区分静态资源目录进行加速。