阿里云CDN缓存命中率偏低是什么原因?缓存规则应该如何设置?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
阿里云CDN缓存命中率低,通常不是节点数量不足,而是资源没有被缓存、缓存时间太短,或者同一个文件被拆成了大量不同的Cache Key。命中率持续偏低会增加回源请求和源站带宽压力,也会削弱CDN的加速效果。排查时建议同时观察“字节命中率”和“请求命中率”;大文件和Range分片场景更应关注字节命中率。
如果图片、CSS、JavaScript、安装包等静态资源只缓存几分钟,缓存刚建立不久就失效,后续访问仍需重新回源。若规则过期时间为0且没有开启重新验证,CDN节点不会缓存文件,每次请求都会访问源站。
还要检查源站响应头是否包含:
Cache-Control: no-cache
Cache-Control: no-store
Cache-Control: max-age=0
Pragma: no-cache
这些响应头可能让资源不缓存或频繁回源。阿里云CDN支持忽略源站的不缓存响应头,但不建议全站直接开启,应先确认这些内容确实属于可公开缓存的静态资源,避免动态页面或用户数据被错误缓存。
默认情况下,下面两个地址可能被识别为不同缓存对象:
https://static.example.com/app.js?t=123456
https://static.example.com/app.js?t=789012
时间戳、随机数、推广参数不断变化,会导致同一文件生成大量Cache Key,每次请求都可能MISS。可以对无业务意义的参数配置“忽略参数”,使这些请求共用一份缓存。
但不能盲目忽略所有参数。以下参数通常需要保留:
page、version等决定返回内容的参数;x-oss-process;忽略这些参数可能导致用户数据串号、分页内容错误或图片处理失效。
如果根目录/统一配置一个很短的缓存时间,图片、字体和视频也会频繁回源;反过来,如果全站统一设置长缓存,又可能把接口、登录页或个性化内容缓存下来。
比较稳妥的方式是进行动静分离,例如:
/static/ 静态资源,长缓存
/images/ 图片,长缓存
/download/ 安装包,长缓存
/api/ 动态接口,不缓存
/user/ 个性化页面,不缓存
阿里云CDN支持按目录和文件后缀配置缓存规则;同一请求匹配多条规则时,以权重较高的规则优先生效,因此具体目录和后缀应设置较高权重,根目录兜底规则设置较低权重。
刷新会让CDN节点上的已有缓存失效,用户再次访问时需要重新回源,所以频繁刷新会在短时间内明显拉低命中率。预热则会提前把资源拉取到CDN节点,可减少用户首次访问时的回源。(阿里云帮助中心)
首次访问某个节点时没有缓存,X-Cache显示MISS属于正常现象。部分访问量很低的资源还可能因为热度不足被提前淘汰,因此低流量域名、海量长尾图片或每次生成全新URL的业务,命中率一般会低于热门静态资源业务。
下面是一套适用于普通网站、社区和下载站的参考配置,具体时间还要结合资源更新周期调整。
| 资源类型 | 匹配规则 | 建议缓存时间 | 说明 |
|---|---|---|---|
| 图片、字体、视频 | jpg,png,gif,webp,svg,woff,woff2,mp4 | 30天以上 | 文件名不变时需配合刷新 |
| 安装包、压缩包 | zip,rar,apk,exe,tar,gz | 30~180天 | 发布前可执行预热 |
| CSS、JavaScript | css,js | 1~30天 | 使用哈希文件名可设置更长 |
| HTML页面 | html,htm | 5分钟~1小时 | 根据页面更新频率决定 |
| API和动态页面 | /api/、php,jsp,aspx | 0秒 | 登录、订单、用户数据不要缓存 |
| 404等异常状态 | 按目录或后缀配置 | 数十秒~数分钟 | 防止不存在资源反复回源 |
阿里云官方建议,不经常更新的图片和下载类资源设置较长缓存时间;动态文件通常设置为0秒。缓存时间并非越长越好,应在更新及时性、访问性能和回源成本之间平衡。(阿里云帮助中心)
CSS、JavaScript和图片更新时,建议不要一直覆盖同名文件:
/app.js
/style.css
可以改成:
/app.a1b2c3.js
/style.20260730.css
这样新旧版本拥有不同的缓存地址,可以放心设置较长的缓存时间,发布新版本时也不必大规模刷新缓存。阿里云官方同样推荐使用带版本号或哈希值的文件名。
缓存规则修改后,已经存在于节点上的旧文件不会立刻采用新规则。规则变更后通常需要刷新旧缓存;新增规则后,可以对核心热门文件执行预热,使新规则尽快生效。
可以使用以下命令验证:
curl -I "https://cdn.example.com/static/app.js"
重点查看:
X-Cache: HIT
X-Swift-CacheTime: 2592000
Cache-Control: max-age=2592000
X-Cache: HIT表示命中CDN缓存,MISS表示本次发生了回源;X-Swift-CacheTime表示该资源在CDN节点配置的缓存总时长。第一次请求为MISS、第二次请求转为HIT通常属于正常现象。(阿里云帮助中心)
整体排查顺序可以归纳为:
检查X-Cache → 检查缓存时长 → 检查源站响应头 → 检查URL参数 → 检查规则权重 → 刷新并预热 → 继续观察命中率与回源流量。