CDN是整个阿里云产品框架中是一个很重要的一环,因为它主要是在产品最外层,保证真实的客户在访问服务器端资源的时候能够有一个较好的体验。
那么CDN底层主要是通过什么样的手段去实现的呢?其实它就相当于在客户的就近的地区,布置了对应的节点,并且把对应的一些静态资源,比如说图片、视频等这些资源预先先缓存到对应的节点上。以后,在客户访问的时候,我们就可以直接通过节点去拉起对应的资源并返回给客户,就不需要再回源了。这样的操作就缩短了客户端到服务器端的一个链路,提升了整个站点的ISP、地域兼容性。
CDN主要涉及的两个核心点是主要缓存的是静态资源和主要针对的是客户端请求的静态资源的缓存。
静态资源的请求主要指的是http的get请求。对于http协议里其他请求比如说put以及POST等动态回源的一些请求,CDN可能就不会去做任何缓存的处理,而是直接透传给源站,然后由源站进行对应的处理后返回给客户端。
阿里云CDN缓存规则配置
在CDN中,我们可以设置一些缓存规则来匹配一些实际业务场景的需求
CDN配置主要提供了包括目录、文件的后缀两种缓存配置方式。我们可以在针对于我们实际需要缓存的一些静态文件的目录或者一些静态文件的一些后缀名来配置对应的缓存规则,然后实现一些动态可调整的一些缓存配置。
同时,这里的缓存配置可以设置不同权重,这样我们可以针对于不同的文件设置多种缓存配置,那在实际的业务场景,我会按照高优先级的缓存配置来对它进行缓存。
阿里云CDN缓存策略解读
配置完成后,CDN是按照什么样的一个缓存规则来对资源进行缓存的呢?那接下来我们就来详细的解读一下这些缓存配置。
浏览器缓存
整个的缓存体系会包括浏览器缓存和CDN节点本身的缓存。对于浏览器缓存来说,浏览器主要是根据http头里Cache-Control和Expires等信息来决定我浏览器的缓存行为,这些信息同时包括强缓存、验证性缓存等。
针对Cache-Control和Expires信息,用户是可以在源站配置对应的信息,直接返给给客户端。如果在CDN上没有配置对应的http响应头的话,CDN会将源站配置的response头直接返给给浏览器。浏览器就会按照源站的配置直接按对应的缓存规则进行缓存处理。
如果在CDN上配置了HTTP头,我会覆盖源站的Cache-Control及Expires头信息。浏览器真实的缓存规则会按照CDN返回的response信息进行缓存。
CDN缓存策略
以上就是浏览器的缓存策略,那么CDN的缓存策略是什么呢。
CDN的缓存规则会首先依赖于源站返回给CDN的Cache-Control和Expires头信息。如果如果源站设置了no-cache或private或max-age=0这些信息,就相当于源站是不允许CDN对这个资源进行缓存的。这种情况下,CDN会存遵从于源站的设置,会对对应的资源不做任何的缓存而直接返回给浏览器。下一次在访问的时候,CDN同样会到源站去拉取对应的资源。对于这一类资源,用户主要是想让他时时的回到源站,不想返回历史的旧数据。
那在源站没有设置不允许CDN缓存的response头的情况下,CDN就会按照下图的逻辑进行缓存。
如果客户在控制台上配置对应的缓存规则的,CDN的缓存规则会优于源站的缓存规则,然后按照CDN的缓存规则进行缓存处理。如果CDN没有配置对应的缓存规则的话,CDN会完全按照源站的Cache-Control和Expires头进行缓存。
对于远站没有设置对应的缓存规则的话,CDN会按照上图中4和5的策略去缓存。第四点,CDN会按照CDN控制台上配置的缓存规则进行缓存,而第五点就是在既没有配置任何的缓存规则,而客户的源站也没有配置任何的缓存规则的情况,CDN会有一套自己的默认的缓存规则。
针对于默认的缓存规则,CDN针对的是源站对应的静态文件。通过源站返回的response头是否含有etag或者last-modified信息判断。如果返回的response包含这两个信息的任何一个,那CDN会认为这个文件是一个静态文件。如果返回的response头里面有last-modified信息,那么CDN会根据当前访问的时间戳减去last-modified乘以0.1,得到的值会被作为CDN的缓存时间,这个时间会在10~3600秒的区间范围内。如果只返回etag,CDN会默认缓存十秒的时间。
对于这种场景,其实客户的缓存规则是不可控的。因此我们建议不管是在源站还是在CDN控制台上,我们都能配置符合业务场景的缓存规则。
CDN返回response头解读
以上就是CDN缓存规则的解读,那我们在实际使用的过程中,我们又如何查看当前这个文件到底有没有在CDN节点上缓存或者它缓存的时间是多少呢?
资源在经过CDN节点以后,一定会在对应的http的response头里加若干的字段。其中的X-Swift-CacheTime就表示了这个资源在CDN节点上的缓存时间。对应的X-Swift-SaveTime表示对应的资源在时间节点上缓存配置了多长时间。
另外就是这个VIA字段,包含有四段信息,其中第一段和第三段会有一个M或者H的标识。M表示对应的资源没有在对应的CDN节点上缓存。H就表示对应的资源有在CDN节点上缓存。
第一段说明L2节点的缓存情况,第三段指的是L1节点的缓存情况,这两个其中有一个包含H,就表示对应的资源已经在CDN节点上进行了缓存。那这一次访问就不需要再回到源站拉取对应的资源了。
原文链接:https://aliyunnew.com/a/How-does-the-caching-strategy-of-Aliyun-CDN-work.html