最近更新时间:2024.03.21 15:48:44
首次发布时间:2022.02.09 10:16:58
本文档介绍火山引擎内容分发网络的缓存流程以及如何通过缓存规则影响内容分发网络的缓存行为。缓存规则的作用如下:
当收到用户请求时,内容分发网络会根据缓存规则的优先级,由高到低依次将用户请求与缓存规则匹配。在匹配到一条规则后,内容分发网络就停止匹配其余的规则了。匹配的那条规则会有以下某个配置:
不要缓存文件。此时,内容分发网络直接向源站请求该文件。在收到文件后,内容分发网络将该文件响应用户请求,不会缓存该文件。参见 配置说明 中 "过期时间" 配置的说明。
文件需要被缓存。此时,内容分发网络会根据 缓存键值规则 检查请求是否命中了缓存。检查结果可以是:
请求命中了缓存,且缓存的文件未过期。此时,内容分发网络将缓存中的文件响应用户请求。
请求命中了缓存,但是缓存中的文件已过期。此时,内容分发网络会进行 回源校验。
请求未命中缓存。此时,内容分发网络会向源站请求该文件。在收到文件时,内容分发网络将该文件响应用户请求,同时根据该缓存规则的配置缓存该文件。
当收到来自源站的文件时,对于匹配的缓存规则,内容分发网络会根据缓存规则中所配置的缓存策略来缓存该文件。您可以在缓存规则中指定以下缓存行为的配置:
缓存优先策略 | CDN 关联逻辑 | 缓存行为 | 缓存时长 |
---|---|---|---|
CDN缓存 | 强制缓存(开) | 忽略源站响应头指定的不缓存,始终缓存文件。 | 遵循规则中配置的 过期时间。 |
强制缓存(关) | 不忽略源站响应头指定的不缓存。未指定缓存行为时,不缓存文件。 | ||
遵循源站 | 补充缓存(开) | 遵循源站响应头的配置。未配置缓存行为时,缓存文件。 | 遵循响应头指定的缓存时长。未配置缓存行为时,遵循规则中配置的 过期时间。 |
补充缓存(关) | 遵循源站响应头的配置。未配置缓存行为时,不缓存文件。 | 遵循响应头指定的缓存时长。 |
关于详细的缓存行为描述,参见 缓存规则详细描述。
为了满足大部分用户的需求,对于源站响应头包含 Cache-Control: no-cache
的文件,内容分发网络调整了默认缓存行为。
如果您的加速域名收到了这类文件的请求,内容分发网络的默认缓存行为如下:
内容分发网络默认的缓存行为可以被您创建的缓存规则中指定的缓存行为覆盖。
在您添加域名时,內容分发网络会默认为您添加以下缓存规则。您可以修改其配置。
域名创建后,您可以修改或者删除该规则。
域名创建后,缓存规则列表中会额外包含一条规则。该规则对没有匹配其他规则的文件生效。您无法修改或者删除该规则。同时,这条规则的优先级始终是最低的,无法调整。这条规则确保了任何文件都可以匹配到一条规则。
如果您对站点上某些文件有定制化的缓存要求,您可以创建缓存规则。
配置 | 说明 |
---|---|
优先级 | 表示规则的优先级。数字 1 的规则优先级最高。在收到请求时,内容分发网络按规则的优先级,从高到低尝试将请求与规则匹配。如果请求匹配了某一条规则,内容分发网络就停止匹配其余规则。您可以通过拖拽调整规则的优先级。 |
规则类型 | 表示规则对哪个类型的对象生效。该配置有以下选项:
|
规则 | 表示规则的内容,长度不能超过 1,024 个字符,不能包含以下字符:
同时,
|
忽略大小写 | 指定 规则 中的匹配条件是否是大小写敏感的。默认设置是 关闭,表示大小写敏感。 例如:您创建了一个文件后缀规则,匹配条件是 png;txt ,忽略大小写 为 关闭。此时,该规则可以匹配 URL 是 HTTPS://www.EXAMPLE.com/image.png 的请求,但是不能匹配 https://www.example.com/image.PNG 。 |
缓存优先策略 | 指定一个缓存策略。 该配置有以下选项:
实际的缓存行为是在 CDN 关联逻辑 配置中指定的。 |
CDN 关联逻辑 | 指定内容分发网络在 缓存文件时 的行为。 |
过期时间 | 设置文件的缓存时长。您需要指定一个时间单位,然后设置一个值。 |
缓存优先策略 | CDN 关联逻辑 | 缓存行为 | 缓存过期时间 |
---|---|---|---|
CDN缓存 | 强制缓存(开) | 表示内容分发网络始终缓存文件。 | 遵循规则中配置的 过期时间。 |
强制缓存(关) |
| ||
遵循源站 | 补充缓存(开) |
| 如果包含 |
补充缓存(关) |
| 遵循响应头指定的缓存时长。 |
说明
在以下情况下,除非您指定 强制缓存(开),内容分发网络不会缓存指定的文件:
Cache-Control: max-age = 0
头部或者包含的 Expires
头部所指定的时间早于当前时间。在以下情况下,无论缓存规则如何配置,内容分发网络都不会对源站响应的文件进行缓存:
源站响应中 Content-Length 头的值为 0。
用户请求所使用的方法既不是 GET 也不是 HEAD。
源站的响应状态码不是 2xx,并且您未配置 状态码缓存。
对于 HEAD 请求,源站响应中包含 Transfer-Encoding:chunked
响应头。
在收到一个请求时,假设该请求匹配的规则指示请求的文件需要被缓存,并且该请求命中了缓存。此时,内容分发网络遵循以下步骤判断缓存的文件是否已过期:
计算该文件已缓存的时长,精确到秒。计算方式是:已缓存时长 = 请求时间戳 - 该文件被缓存的时间戳
。
根据匹配规则的配置获取该文件的缓存 TTL。
如果 已缓存时长 > TTL,则表示缓存的文件已过期。如果 已缓存时长 <= TTL,则表示缓存的文件未过期。
假设内容分发网络缓存中的某个文件还未过期,但是在源站上该文件已经有了更新。您需要用户获取该文件的最新版本。
此时,您可以在内容分发网络里对该文件进行 刷新 操作。刷新操作强制将该文件标记为已过期。之后,如果用户请求该文件,内容分发网络会进行 回源校验。获取到更新文件后,内容分发网络将更新的文件响应用户请求并缓存该更新文件。
当一个缓存文件过期后,如果收到了该文件的请求,内容分发网络会向源站校验该文件是否有更新。回源校验的流程如下:
如果该文件的源站响应包含 Last-Modified
字段或者 ETag
头部,内容分发网络会在回源请求中包含用于文件校验的头部。ETag
的优先级高于 Last-Modified
。
如果源站响应包含 ETag
,回源校验请求中会包含 If-None-Match
头部。该头部的值就是 ETag
的值。
如果 ETag
不存在但是 Last-Modified
存在,回源校验请求中会包含 If-Modified-Since
头部。该头部的值就是 Last-Modified
的值。
如果缓存文件的源站响应中既没有包含 Last-Modified
,也没有包含 ETag
头部,内容分发网络就直接向源站请求该文件。在收到文件后,内容分发网络会将文件响应用户请求并缓存该文件。
关于源站的响应状态码:
如果状态码是 304,表示该文件在源站没有更新。此时,内容分发网络将缓存的文件响应用户请求。如果之后再次收到了该文件的一个请求,内容分发网络会重复执行回源校验流程。
如果状态码是 200,表示该文件在源站有更新并且响应正文中包含了最新的文件。此时,内容分发网络会将更新的文件响应用户请求并在缓存中替换已有的文件。