如果您发现加速域名的缓存命中率突然下降,可以检查是否存在以下某个情况:
最近执行了缓存刷新操作。缓存刷新后,短期内回源请求会增加,导致命中率下降。
带宽突增。带宽突增可能的原因是 CDN 短期内收到了大量的请求,但是请求的文件未被缓存或在缓存中已过期,导致回源请求增加,缓存命中率下降。常见的场景是您的站点在短时间内添加了大量热点页面。
CDN 节点向源站请求大量的文件:由于回源请求较多,导致命中率下降。常见的场景是您的站点首次接入 CDN 或者您站点上添加了大量的文件。
最近调整了域名配置:缓存键值、缓存规则、Range 回源 等功能的配置调整都可能会影响缓存命中率。
源站响应未包含缓存相关的头部,导致文件未被 CDN 缓存。
背景
內容分发网络是由遍布全国各省份、覆盖各运营商的海量缓存节点组成。通过将站点内容分发至靠近用户的缓存节点,使得用户可就近快速获取所需内容,从而有效地解决公网拥塞、网络延迟等问题,优化用户访问体验。因此,如果节点缓存的內容越多,加速域名的内容分发性能就越好,同时还可以减轻源站的压力。
您可以通过 CDN 的 命中率指标 来查看加速域名下命中缓存的请求比例。
缓存命中率包括请求命中率和流量命中率:
请求命中率 = 命中缓存的请求数 ÷ CDN 收到的总请求数
流量命中率 = CDN 对命中缓存的请求所响应的字节数 ÷ CDN 对所有请求所响应的字节数
提升缓存命中率的方法
业务场景 | 问题原因 | 解决方式 | 配置方法 |
---|---|---|---|
短时间内,大量请求并发访问相同的静态资源。如新闻热点,大型运营活动,新版本安装包发布等。 | 由于资源未被 CDN 缓存,触发了大量的回源请求,导致缓存命中率下降。 | 在活动开始前,先将资源预热到 CDN 的缓存节点。在活动开始后,缓存节点就能直接响应用户请求,从而提高缓存命中率,减少回源请求。 | 文件预热 |
源站上的静态资源在 CDN 缓存中很快就过期失效了。 | 可能存在以下某个原因:
缓存过期后,相同资源的请求就会触发回源请求,导致缓存命中率下降。 | 对于更新频率低的静态文件,例如图片和应用安装包,建议将缓存时长设置为 1 个月以上。 | |
请求 URL 中的查询参数不同,但是请求的资源相同。 | 默认情况下,查询参数是区分缓存文件的因素之一。如果某个查询参数本身不是用来区分文件的,例如是用来鉴权的,那么包含该查询参数的请求就会频繁触发回源请求,导致缓存命中率下降。 | 配置缓存键值,指定在缓存时需要去除的查询参数。 | 配置缓存键值 |
用户下载一个应用安装包或者观看某个视频,在中途取消了下载或者在中途取消了视频的播放。 | 默认情况下,CDN 向源站请求的是完整文件,即使用户只是请求文件的某个分片。由于 CDN 节点从源站下载的文件大小大于用户请求的分片大小,导致缓存命中率下降。 | 如果您加速域名的业务类型是下载或点播,建议您启用 Range 回源。 | 配置 Range 回源 |
不同加速域名的源站配置是相同的,分发的资源也是相同的。 | 默认情况下,缓存中的文件是对加速域名而区分的,一个缓存文件仅归属于一个加速域名。在多个加速域名对接相同源站的场景下,对于相同的文件,每个加速域名下该文件的请求都会触发一个回源请求。这增加了源站的压力。 | 对源站配置相同的加速域名设置共享缓存。建议将共享缓存的目标域名设置为访问量较大的那个加速域名。 | 要启用共享缓存,请 提交工单。 |
源站响应未包含 Cache-Control 或 Expires 头部。虽然配置了缓存规则,但是 CDN 依然不缓存请求的文件。 | 缓存规则中默认的缓存策略是 "遵循源站"。也就是说,如果源站响应未包含 Cache-Control 或 Expires 头部,CDN 不缓存请求的文件,始终从源站获取,导致缓存命中率下降。 | 在缓存规则中将缓存策略修改为 "遵循源站-补充缓存(开)" 或 "CDN 缓存-强制缓存"。 | 配置缓存规则 |
其他 | 除了以上几种常见的命中率优化措施,我们还提供了其他措施,例如合并回源,边缘预热等,可以为您的业务场景进行配置。 | 请 提交工单。 |
CDN 中预设的缓存策略
预设缓存策略为 "遵循源站",对所有文件生效,优先级最低,并且删除。"遵循源站" 指示在以下情况下,CDN 不缓存请求的文件:
源站响应不包含 Cache-Control
或 Expires
头部。
源站响应头 Cache-Control
是以下任意值:
max-age = 0
no-store
no-cache
private
源站响应头 Expires
所指示的时间早于当前时间
预设缓存策略确保了任何请求都能匹配到一个缓存策略。
如果预设缓存策略无法满足您的要求,您可以配置其他缓存策略,说明如下:
缓存优先策略 | CDN 关联逻辑 | 缓存行为 | 缓存时长 |
---|---|---|---|
CDN缓存 | 强制缓存(开) | 忽略源站响应头的不缓存指示,始终缓存文件。 | 遵循规则中配置的 过期时间。 |
强制缓存(关) | 不忽略源站响应头的不缓存指示。未指示缓存行为时,不缓存文件。 | ||
遵循源站 | 补充缓存(开) | 遵循源站响应头的指示。未指示缓存行为时,缓存文件。 | 遵循响应头指示的缓存时长。未指示缓存行为时,遵循规则中配置的 过期时间。 |
补充缓存(关) | 遵循源站响应头的指示。未指示缓存行为时,不缓存文件。 | 遵循响应头指示的缓存时长。 |
关于详细的缓存行为描述,参见 缓存规则详细描述。
默认情况下不会。CDN 的缓存策略仅对源站响应码为 2xx 的文件生效。但是您可以配置 状态码缓存 来对 4xx 和 5xx 的状态码进行缓存。
不支持。您能设置的最长缓存过期时间为 365 天。CDN 节点会定期删除访问量较少的缓存资源。
在 CDN 的响应中,X-Response-Cache
头部指示请求是否命中了缓存。
edge_hit
:表示命中缓存。
miss
:表示未命中缓存。
您也可以通过 配置 HTTP 响应头 来获取 cdn_cache_status
变量的值。该变量指示了请求是否命中了缓存。
对于时效性要求不高的文件,您可以采用以下方法:
如果文件的更新频率高,您可以设置一个较短的缓存时间。
如果文件的更新频率低,您可以设置一个较长的缓存时间。这样可以尽可能保障缓存中文件的新鲜度,减少回源请求的次数。
对于时效性要求高的文件,您可以采用以下方法:
如果源站返回 301/302 状态码,默认情况下,CDN 会将该状态码发送给客户端,让客户端去处理。如果重定向后的文件是静态的,建议您 启用回源重定向跟随。启用后,当源站返回 301/302 时,CDN 会尝试获取重定向后的文件。如果获得了目标文件,CDN 根据缓存规则来缓存该文件,并将该文件返回给客户端。这样可以有效提升在源站返回 301/302 时的用户体验。
先检查加速域名的 回源 HOST 配置是否正确。如果源站上存在多个站点,您需要通过回源 HOST 指定回源请求需要访问的实际站点。默认情况下,回源 HOST 与加速域名相同。
如果 "回源 Host" 的配置正确但问题依旧存在,请 提交工单。
示例说明
源站为 www.test.com。该源站上提供服务的实际站点是 img.test.com。在这个情况下,如果您未将 回源 Host 设置为 img.test.com,源站的请求就会收到 404 响应。
支持。CDN 的源站类型可以是 火山引擎 TOS,也可以是以下任意第三方对象存储服务:
阿里云
腾讯云
Amazon AWS
参见 新增源站。
回源重试发生时的源站选择逻辑
当 CDN 无法连接某个源站时,会基于以下规则来选择切换到的源站:
主源站的优先级高于备源站。
只有当所有主源站的 IP 地址都在 "不可用源站" 列表中时,CDN 才会选择备源站。
源站是基于权重来选择的。权重高的源站优先被选择。如果两个源站的权重相同,内容分发网络使用轮询方式选择源站。
"不可用源站" 列表
如果连续 10 次都无法与某个源站建立 TCP 连接,CDN 会将该源站的 IP 地址添加到 "不可用源站" 列表中。
在尝试与某个源站建立 TCP 连接前,CDN 会检查 "不可用源站" 列表。如果该源站的 IP 地址在列表中,CDN 会同时进行以下操作:
放弃连接该源站,然后根据 回源重试发生时的源站选择逻辑,选择一个其他源站。
对该源站进行异步探测。如果可以与该源站建立 TCP 连接,内容分发网络会将该源站的 IP 地址从"不可用源站"列表中删除。每次探测的最小间隔时间是 5 秒。
推荐您使用 火山引擎的证书链补齐工具 尝试补齐证书链。
您也可以根据以下 HTTPS 证书的要求检查待上传的证书。
证书格式:
公钥文件的扩展名必须是 .crt 或 .pem,私钥文件的扩展名必须是 .key 或 .pem。
公钥內容以 -----BEGIN CERTIFICATE-----
开头,以 -----END CERTIFICATE-----
结尾。
私钥內容以 -----BEGIN RSA PRIVATE KEY-----
开头,以 -----END RSA PRIVATE KEY-----
结尾。
每行必须包含 64 个字符,最后一行可以少于 64 个字符。
证书链完整:
中间机构颁发的证书文件包含多份证书。在配置 HTTPS 时,您需要将所有证书拼接在一起组成一份完整的证书后再上传。也就是说,证书文件的内容要包含完整的证书链。
证书链中每份证书的上下级签发关系需要正确。在拼接后的证书文件中,根证书在最后,服务器证书在最前。
在您配置泛域名证书的时候,泛域名与证书必须是同级匹配,例如:
如果您的加速域名为 a.b.test.com 和 *.b.test.com,泛域名证书必须是签发给 *.b.test.com,不能是*.test.com 或 *.a.b.test.com。
如果您的加速域名为 a.test.com 和 *.test.com,则泛域名证书必须为 *.test.com,不能是 *.b.test.com。
配置参考:
问题描述
在以下场景中,当站点 B 接入 CDN 后,您在 TOS 存储中桶中更新了 CORS 配置。但是该配置没有生效。
问题原因
当用户第一次访问站点 B 上的某个文件时,CDN 向 TOS 存储桶请求并缓存该文件。与文件一起被缓存的还有源站的响应头。然后 CDN 将该文件与源站响应头一起发送给用户。如果存储桶上有 CORS 配置,源站响应头会包含 Access-Control-Allow-Origin
头部。
如果您更新了源站上的 CORS 配置,新配置不会更新到 CDN 的缓存。用户再次请求该文件时,CDN 发送给用户的是缓存的文件以及缓存的源站响应头,不是源站最新的响应头。如果缓存中的文件过期了但是回源校验的结果是源站上该文件未过期,那么 CDN 发送给用户的内容中依然不包含源站最新的响应头。
解决方案
在 CDN 中,通过 HTTP 响应头部配置 设置与源站相同的 CORS 配置。具体配置如下:
响应头部操作:设置
响应头部名称: Access-Control-Allow-Origin
取值方式:常量
响应头部取值:指定允许跨域访问的 URL,例如 https://www.test.com。
如果您需要配置多个 URL,并且希望 Access-Control-Allow-Origin
响应头仅包含用户请求中 Origin 头部中的 URL,您可以设置 跨域校验 为 开启。