CDN作为内容分发网络主要是将资源缓存在CDN节点上,然后后续访问即可直接通过CDN节点将资源返回给客户端,而不再需要回到源站服务器以加快请求速度。那么怎样设置CDN的缓存规则更加合理呢?

CDN是什么

CDN可以理解为分布在每个县城的火车票代售点,用户在浏览网站的时候,CDN会选择一个离用户最近的CDN边缘节点来响应用户的请求,这样海南移动用户的请求就不会千里迢迢跑到北京电信机房的服务器(假设源站部署在北京电信机房)上了。

网站开启了CDN以后,可以有效地解决跨运营商和跨地域访问的问题,使各个区域的用户访问网站的延时降低;同时将网站内容缓存在CDN节点上,能够减轻源站的负载。

CDN缓存

要理解CDN缓存其实很简单:当网站没有开启CDN,用户在浏览网站的时候,浏览器能够在本地保存网站中的图片或者其他文件的副本,这样用户再次访问该网站的时候,浏览器就不用再下载全部的文件,减少了下载量意味着提高了页面加载的速度。

当网站开启CDN时,客户端浏览器先检查是否有本地缓存是否过期,如果过期,则向CDN边缘节点发起请求,CDN边缘节点会检测用户请求数据的缓存是否过期,如果没有过期,则直接响应用户请求,此时一个完成http请求结束;如果数据已经过期,那么CDN还需要向源站发出回源请求(back to the source request),来拉取最新的数据。

CDN缓存时间

一般CDN提供商默认的缓存时间为30天,如果你的网站内容更新或修改比较频繁,最好将部分资源设置较短的缓存时间,比如1天或者1个小时,或者干脆不缓存(不推荐);如果网站内容更新周期是天级更新,最好将CDN缓存时间设置为1天,当网站内容更新后CDN节点会更快的刷新缓存。当然,如果网站内容更新后cdn节点迟迟没有刷新缓存,可以登录CDN提供商控制台,来手动刷新缓存。

推荐配置:

  1. .jpg;.jpeg;.png;.bmp;.gif;.webp;.ico 图片类型缓存1天。
  2. .js;.css;.txt;.xml;.shtml;.html;.php;.asp;.aspx;.jsp;.htm;.csv;.bat 文本类型缓存1天。
  3. .m3u8 m3u8类型缓存1小时。
  4. .avi;.mkv;.mp4;.mov;.flv;.rm;.rmvb;.swf;.mp3;.wav;.wmv;.rmi;.aac 音视频类型缓存7天。
  5. .exe;.deb;.ipa;.apk;.sis;.psd;.dat 大文件类型缓存7天。

CDN缓存时间配置不当的后果

CDN的分流作用不仅减少了用户的访问延时,也减少的源站的负载。但CDN缓存时间配置不当的后果也很严重:

当网站更新时,如果CDN节点上数据没有及时更新,即便用户再浏览器使用Ctrl +F5(清空缓存强制刷新)的方式使浏览器端的缓存失效,也会因为CDN边缘节点没有同步最新数据而导致用户访问异常。

如何查看CDN缓存是否命中

访问网站,打开控制台(F12),找到Network选项卡,点击首页或者其他页面,查看“Response Headers”,是否有“X-Cache:HIT TCP_MEM_HIT”等字样,如果后面是"Hit"则代表缓存命中,如果是"Miss"则代表未命中。

查看CDN是否命中缓存

常见CDN消息头

X-Swift-SaveTime:X-Swift-SaveTime 代表开始在cdn上缓存的时间,如果字段值是2018-07-11 14:33:49,由于时间是GMT时间,折算成北京时间加8小时,也就是代表该资源在2018-07-11 22:33:49开始在CDN缓存。

X-Swift-CacheTime:X-Swift-CacheTime 是cdn默认缓存时间,以秒为单位,过了这个时间该缓存就失效了。比如86400意思是缓存24小时,超过了这个时间,该缓存就丢弃了,需要重新回源获取。

Age:Age 代表在cdn上已经缓存的时间,以秒为单位。如果值是200,那么就代表该资源已经在cdn缓存了200s。

参考资料:
从HTTP响应头看各家CDN缓存技术