命中率概念
首先我们先了解命中率的概念,CDN缓存命中率包括字节命中率和请求命中率:
- 字节命中率=CDN缓存命中响应的字节数÷CDN所有请求响应的字节数
- 请求命中率=CDN缓存命中的请求数÷CDN所有的请求数
命中率间接反应了回源的流量的大小,命中率越低,回源的次数和流量越多,对源站的负载压力也就越大。因此提高CDN的命中率对降低源站访问压力很有必要。
提高命中率
我们可根据业务场景、网站资源文件的类型来定制不同的策略提高命中率。
1、合理配置缓存过期时间
缓存过期时间决定了CDN回源的频率,设置时间越长回源频率越低。在设置完CDN域名后一定要进行这个配置,若未配置缓存策略,则所有的用户请求都会回源站请求资源。
- 进入到CDN管理控制台
- 点击【域名管理】选择需要设置的域名
- 点击【缓存配置】即可进行相关配置
在控制台,我们可以根据实际的业务情况选择是按照目录还是文件后缀名进行规则配置。
1)更新频率低的文件
可将不常更新的资源文件比如网站的一些图片、模版示例文件、或者一些类似于插件一样的js、css文件的过期时间设置的长一些,建议设置1个月以上。比如:电商网站的一些产品图片、网站固定引用的js、css 等,通常这些资源的更新频率会很小,通常我会将这类资源设置在6个月,并将权重设置为最大的99。
2)频繁更新的文件
这类文件主要集中在js、css这类前端项目的文件中,对于这类文件我们可根据实际项目的迭代更新频率进行设置,比如如果您是两周一迭代,那么可将这类文件的缓存时长设置为14天左右。如果有突发版本低于两周发布的情况,我们也可以使用CDN提供的刷新预热功能进行处理。
3)动态文件
在一些前后端混合的项目中,对于后端动态文件比如:PHP、ASP、JSP等,这类文件建议不做缓存,可设置为 0s 权重 99。或者也可以在代码中设置返回头。以PHP为例:
header("Pragma:no-cache");
2、预热资源
适用于在大型活动发布前,先将发布的内容使用CDN刷新预热功能提前从源站获取资源到CDN以提高缓存命中率。这里要注意的是预热功能有一定的限制,所以需要用户提前规划好资源分配:
3、去除URL中问号后的参数缓存
为了方便理解,我们将OSS的资源使用CDN缓存,OSS的读写权限设置为私有,那么在访问文件时会产生不同的带有加密串的URL链接,若不做忽略参数处理,那么当加密串过期时,虽然访问的是同一个资源,但是对CDN来讲都会按照新资源去源站请求资源。
- 进入到CDN管理控制台,选择对应的域名,进入到域名管理详情
- 左侧导航栏,单击性能优化
- 点击忽略参数模块的 修改配置,配置内容如下
开启忽略参数功能,用户请求回源时会去除URL中?之后的参数。保留回源参数意思会将URL中的参数带去源站访问资源。这里会涉及两个概念:缓存key和回源URL。举个例子,将上面两者结合起来,用户访问链接:https://example.com/a.jpg?key=1&sign=abc
以开头我们举的OSS的例子,第一次我们使用不带任何加密串的URL访问 a.jpg,此时会被告知没有权限访问,因为OSS为私有,访问时CDN去OSS回源拿数据时也必须有加密签名才可以拿到资源。
接着我们使用带有签名串的URL访问,此时访问成功,接着将? 后的所有参数删除或者随意修改,再次访问,访问成功。因为该资源已经缓存到CDN,CDN根据去除?后参数的缓存key直接命中缓存返回了资源。
⚠️ 这里我在实际操作的过程中,在缓存后去除链接访问发现还是返回的没有权限的结果,是因为CDN资源未更新完导致此时可以进行CDN刷新预热进行处理。
这里还有一种情况在做参数忽略操作前,我们判断资源是否最新可以通过?后添加参数的方式检查,开启忽略参数后,这个方式便不可用了,也就是如果你的站点在发布时存在同名资源做内容改动时,发布后需要做下CDN刷新预热才行。
4、大文件设置分片回源策略
主要场景为文件下载或者视频观看。用户在访问时可能会中断操作,但CDN向源站请求的是整个完整的资源,这时回源资源内容大于响应给用户的内容,导致缓存命中率低。
进入到要管理的域名详情,参考下图即可开通CDN Range 回源:
开启后第一次回源请求会按照用户请求中的Range大小向上取整回用户源站,后面全部按照512 KB分片大小回用户源站。这里需要注意的是如果源站不支持Range请求,开启Range回源将导致资源无法缓存。
查看缓存缓存命中率
进入到 监控查询 > 资源监控 ,选择命中率一栏,即可查看命中率的情况: