CDN 作为内容分发网络主要是将资源缓存在 CDN 节点上,然后后续访问即可直接通过 CDN 节点将资源返回给客户端,而不再需要回到源站服务器以加快请求速度。那么 CDN 到底对于哪些请求加速呢?其缓存规则和缓存时间是怎么样的呢?怎么样的缓存规则更加合理呢?本文就对 CDN 的缓存规则解读。
CDN 的缓存适用范围
CDN 对于常见的 HTTP 请求均是支持的,具体对不同请求方式的支持情况请参考表一。但是有一点需要注意的是虽然对这些类型的 HTTP 请求均是支持的,但是并不是对所有请求方式都会进行缓存的。 CDN 仅会对于 GET 请求进行缓存,而对于其他的请求均不进行缓存,仅是起到中间代理、转发的功能。因此我们建议添加 CDN 的站点源站最好能够实现动静分离。将动态请求和静态请求的内容独立成两个站点,而 CDN 仅仅加速静态站点中的资源。
表一. CDN 对 HTTP 请求支持情况
请求方式 | 描述 | 是否支持 |
---|---|---|
GET | 从指定的资源请求数据 | 支持 |
POST | 向指定的资源提交要被处理的数据 | 支持 |
HEAD | 与 GET 相同,但只返回 HTTP 报头,不返回文档主体 | 支持 |
PUT | 上传指定的 URI | 支持 |
DELETE | 删除指定资源 | 支持 |
OPTIONS | 返回服务器支持的 HTTP 方法 | 支持 |
CONNECT | 把请求连接转换到透明的 TCP/IP 通道 | 不支持 |
注意:
- CDN 处理 HEAD 请求时会将 HEAD 请求转换成 GET 请求回源,因此源站日志中记录的是 GET 请求。
- CDN 仅支持 POST 和 PUT 方式发送带有请求体(BODY)的 HTTP 请求。
CDN缓存配置
CDN 的缓存配置截图如图 1 所示。缓存配置包括目录和后缀名两种形式,并且可以针对不同的缓存配置设置不同的权重以决定其优先级。其中后缀名即是针对于特定后缀名设置的缓存规则,而目录则是对该目录及其子目录下的所有文件均生效的。当对同一文件同时设置了后缀名和目录的缓存的话会先依据优先级权值先进行选择,在优先级权值相同的情况下会后缀名策略优先。
图 1. CDN 缓存配置示意图
CDN 缓存规则
总体而言,CDN 所有的缓存规则均可以按照图 2 中所表述的内容进行判断。下面我们对图 2 中的详细内容信息解读。
图 2. CDN 缓存规则示意图
- CDN 处理一个资源是否缓存首先是需要看源站针对于该资源配置的缓存设置。因为源站的不缓存策略是用户自身控制的,因此是有最高的优先级的,当源站配置了缓存规则则转 2 。而如果没有进行任何配置的话则转 3 ,而对于浏览器缓存情况转 7 。
- 当源站配置了以下的规则时, CDN 会认为该资源源站不允许 CDN 缓存,并且这种情况下浏览器也是不会做缓存的,因此会每次请求该资源时都回源站,无法进行缓存加速,如果没有则转 4 :
1)有s-maxage=0,no-cache,no-store,private其中一种
2)如果没有s-maxage或者s-maxage=0,并且有max-age=0.
3)带Pragma: no-cache
- 在源站没有配置缓存规则需判断 CDN 控制台是否配置缓存规则,如果配置了缓存规则转 4 ,如果没有配置缓存规则转 5 。
- 需判断 CDN 控制台是否有配置缓存规则,如果配置了缓存规则的话那么
CDN 上的缓存策略将覆盖源站的缓存策略,而控制台缓存配置的优先级为:
1)权重越高的优先级越好;
2)同等优先级后缀名优先级高于目录优先级;
3)相同权重且相同优先级则随机匹配(建议避免第三种场景),如果没有配置缓存规则则转 6 。
- 需根据源站的缓存规则进行缓存,常见的源站缓存规则有 Cache-Control和 Expires 头,根据 HTTP 协议 Cache-Control 的优先级高于 Expires 头,并且 s-maxage 设置高于 max-age 设置。
- 需遵循 CDN 默认缓存规则,默认缓存规则包括:
1)对于 response 头没有包括 Etag 或者 Last-Modified 头的文件默认是不缓存的(一般认为此类文件为动态文件);
2)没有 Last-Modified 头的文件默认但是有 Etag 头的缓存 10 秒;
3)对于有 Last-Modified 头的会按照(当前时间 - Last-Modified 时间) * 0.1,并且将其限制在 [10,3600] 区间内。
- 对于源站设置了不缓存的规则时浏览器是不缓存的;如果 CDN 修改了 Cache-Control 或者 Expires 头时,浏览器会按照该修改头缓存;如果没有修改即会按照源站的策略缓存。
CDN 缓存情况查看
常见通过 HTTP 的响应头查看具体 CDN 的缓存情况,如图 3 即是常见的通过 CDN 访问的响应头,可以根据 X-Cache 查看当前该资源是否有在 CDN的 L1 节点缓存,而查看 L2 节点的缓存情况则需要根据 Via 头中的第一部分查看,如果是 M 即是 MISS,没有命中的状态;而出现 H 即是命中缓存。X-Swift-SaveTime 表示该资源缓存到 CDN 节点上的 GMT 时间(相比于北京时间晚8小时);而 X-Swift-CacheTime 表示该资源在 CDN 节点上缓存多长时间会过期。
图 3. CDN 缓存情况示意图