CDN(Content Delivery Network)即内容分发网络,通过在网络各处放置节点服务器,构成在现有的互联网基础之上的一层智能虚拟网络。
CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上,用于确保快速可靠地分发静态内容,这些内容可以缓存,最适合在网速庞大的网络中存储和分发。
适用范围
CDN 对于常见的 HTTP 请求方式(GET POST HEAD PUT DELETE OPTIONS)均是支持的,但是并不是对所有请求方式都会进行缓存的。
CDN 仅会对于 GET 请求进行缓存,而对于其他的请求均不进行缓存,仅是起到中间代理、转发的功能。
CDN 的站点源站最好能够 将动态请求和静态请求的内容独立成两个站点,实现动静分离, CDN 仅加速静态站点中的资源。
注意:
CDN 处理 HEAD 请求时会将 HEAD 请求转换成 GET 请求回源,因此源站日志中记录的是 GET 请求。
CDN 仅支持 POST 和 PUT 方式发送带有请求体(BODY)的 HTTP 请求。
缓存规则
CDN 判断一个资源是否进行缓存时,首先会根据源站对该资源是否设置了不进行缓存的配置,具有最高优先级:
源站配置了缓存规则转 2;
源站没有任何配置转 3 ;
浏览器缓存转 7 。
源站配置了以下规则时, CDN 不会进行缓存,且浏览器也不会缓存,每次请求该资源都将访问源站,无法进行缓存加速,如果没有则转 4 :
Cache-Control 有s-maxage=0,no-cache,no-store,private其中一种
Cache-Control 没有s-maxage或者s-maxage=0,但有max-age=0
有单独 no-cache 参数
源站没有配置缓存规则时,CDN 将根据CDN服务控制后台缓存规则配置进行缓存,如果代理商后台配置了缓存规转 4 ,没有转 5 。
CDN 服务控制后台配置了缓存规则时,将使用CDN 缓存策略覆盖源站缓存策略,CDN缓存配置的优先级为:
权重越高的优先级越高;
同等优先级后缀名优先级高于目录优先级;
相同权重且相同优先级则随机匹配(建议避免第三种场景)
CDN 服务控制后台没有配置缓存规则,则根据源站缓存规则进行缓存,常见的源站缓存规则有 Cache-Control和 Expires 头,根据 HTTP 协议 Cache-Control 的优先级高于 Expires 头,并且 s-maxage 设置高于 max-age 设置。
CDN 和源站都没有配置缓存规则,则遵循 CDN 默认缓存规则,默认缓存规则包括:
response 头没有 Etag 和 Last-Modified ,默认是不缓存的(一般认为此类文件为动态文件);
没有 Last-Modified ,有 Etag 的文件,默认缓存 10 秒;
有 Last-Modified 按照 (当前时间 - Last-Modified) * 0.1,且将其限制在 [10,3600] 区间内。
源站设置了不缓存的规则时,浏览器是不缓存的;如果 CDN 修改了 Cache-Control 或者 Expires 头时,浏览器会按照该修改头缓存;如果没有修改即会按照源站的策略缓存。
注意:更新静态文件时,在文件末尾增加版本号能使CDN立即生效,如bugall.js --> bugall.js?time=1402394823
缓存更新
缓存刷新方式有 URL 刷新、目录刷新和 URL 预热。
URL 刷新是以文件为单位进行缓存刷新。
目录刷新是以目录为单位,将目录下的所有文件进行缓存刷新。
URL 预热是以文件为单位进行资源预热。
刷新后,会删除该资源在全网 CDN 节点上的缓存。当用户请求到达节点时,节点会回源站拉取对应资源,返回给用户并缓存到节点,保证用户获取到最新资源。
预热后,该资源会提前缓存到全网 CDN 节点。当用户请求到达节点时,可以直接在节点获取到资源。
您在源站上更新资源后,如果希望用户访问不再获取旧资源,直接获取新资源,您可以使用 URL 刷新 或 目录刷新 功能。
如果希望 CDN 预先将资源由源站主动缓存至 CDN 节点,则可以使用 URL 预热 功能。