1.HTTP缓存机制及原理
已存在缓存数据时,仅基于强制缓存,请求数据的流程如下
已存在缓存数据时,仅基于对比缓存,请求数据的流程如下
对缓存机制不太了解的同学可能会问,基于对比缓存的流程下,不管是否使用缓存,都需要向服务器发送请求,那么还用缓存干什么?
我们可以看到两类缓存规则的不同,强制缓存如果生效,不需要再和服务器发生交互,而对比缓存不管是否生效,都需要与服务端发生交互。
两类缓存规则可以同时存在,强制缓存优先级高于对比缓存,也就是说,当执行强制缓存的规则时,如果缓存生效,直接使用缓存,不再执行对比缓存规则。
强制缓存
从上文我们得知,强制缓存,在缓存数据未失效的情况下,可以直接使用缓存数据,那么浏览器是如何判断缓存数据是否失效呢?
我们知道,在没有缓存数据的时候,浏览器向服务器请求数据时,服务器会将数据和缓存规则一并返回,缓存规则信息包含在响应header中。
对于强制缓存来说,响应header中会有两个字段来标明失效规则(Expires/Cache-Control)
使用chrome的开发者工具,可以很明显的看到对于强制缓存生效时,网络请求的情况
Expires
Expires的值为服务端返回的到期时间,即下一次请求时,请求时间小于服务端返回的到期时间,直接使用缓存数据。不过Expires 是HTTP 1.0的东西,现在默认浏览器均默认使用HTTP 1.1,所以它的作用基本忽略。另一个问题是,到期时间是由服务端生成的,但是客户端时间可能跟服务端时间有误差,这就会导致缓存命中的误差。所以HTTP 1.1 的版本,使用Cache-Control替代。
Cache-Control
Cache-Control 是最重要的规则。常见的取值有private、public、no-cache、max-age,no-store,默认为private。
private: 客户端可以缓存,public: 客户端和代理服务器都可缓存(前端的同学,可以认为public和private是一样的)
max-age=xxx: 缓存的内容将在 xxx 秒后失效
no-cache: 需要使用对比缓存来验证缓存数据(后面介绍)
no-store: 所有内容都不会缓存,强制缓存,对比缓存都不会触发.
Last-Modified / If-Modified-Since
Last-Modified:
服务器在响应请求时,告诉浏览器资源的最后修改时间。
If-Modified-Since:
再次请求服务器时,通过此字段通知服务器上次请求时,服务器返回的资源最后修改时间。
服务器收到请求后发现有头If-Modified-Since 则与被请求资源的最后修改时间进行比对。
若资源的最后修改时间大于If-Modified-Since,说明资源又被改动过,则响应整片资源内容,返回状态码200;
若资源的最后修改时间小于或等于If-Modified-Since,说明资源无新修改,则响应HTTP 304,告知浏览器继续使用所保存的cache。
Etag / If-None-Match(优先级高于Last-Modified / If-Modified-Since)
Etag:
服务器响应请求时,告诉浏览器当前资源在服务器的唯一标识(生成规则由服务器决定)。
If-None-Match:
再次请求服务器时,通过此字段通知服务器客户段缓存数据的唯一标识。
服务器收到请求后发现有头If-None-Match 则与被请求资源的唯一标识进行比对,
不同,说明资源又被改动过,则响应整片资源内容,返回状态码200;
相同,说明资源无新修改,则响应HTTP 304,告知浏览器继续使用所保存的cache。
总结
对于强制缓存,服务器通知浏览器一个缓存时间,在缓存时间内,下次请求,直接用缓存,不在时间内,执行比较缓存策略。
对于比较缓存,将缓存信息中的Etag和Last-Modified通过请求发送给服务器,由服务器校验,返回304状态码时,浏览器直接使用缓存。
浏览器第一次请求:
浏览器再次请求时:
1.浏览器在请求某一资源时,会先获取该资源缓存的header信息,判断是否命中强缓存(cache-control和expires信息),若命中直接从缓存中获取资源信息,包括缓存header信息;本次请求根本就不会与服务器进行通信;在firebug下可以查看某个具有强缓存资源返回的信息,例如本地firebug查看的一个强缓存js文件
2.如果没有命中强缓存,浏览器会发送请求到服务器,请求会携带第一次请求返回的有关缓存的header字段信息(Last-Modified/If-Modified-Since和Etag/If-None-Match),由服务器根据请求中的相关header信息来比对结果是否协商缓存命中;若命中,则服务器返回新的响应header信息更新缓存中的对应header信息,但是并不返回资源内容,它会告知浏览器可以直接从缓存获取;否则返回最新的资源内容
强缓存与协商缓存的区别,可以用下表来进行描述:
获取资源形式状态码发送请求到服务器
强缓存 从缓存取 200(from cache)否,直接从缓存取
协商缓存 从缓存取 304(not modified)是,正如其名,通过服务器来告知缓存是否可用
强缓存相关的header字段
强缓存上面已经介绍了,直接从缓存中获取资源而不经过服务器;与强缓存相关的header字段有两个:
expires,这是http1.0时的规范;它的值为一个绝对时间的GMT格式的时间字符串,如Mon, 10 Jun 2015 21:31:12 GMT,如果发送请求的时间在expires之前,那么本地缓存始终有效,否则就会发送请求到服务器来获取资源
cache-control:max-age=number,这是http1.1时出现的header信息,主要是利用该字段的max-age值来进行判断,它是一个相对值;资源第一次的请求时间和Cache-Control设定的有效期,计算出一个资源过期时间,再拿这个过期时间跟当前的请求时间比较,如果请求时间在过期时间之前,就能命中缓存,否则就不行;cache-control除了该字段外,还有下面几个比较常用的设置值:
no-cache:不使用本地缓存。需要使用缓存协商,先与服务器确认返回的响应是否被更改,如果之前的响应中存在ETag,那么请求的时候会与服务端验证,如果资源未被更改,则可以避免重新下载。
no-store:直接禁止游览器缓存数据,每次用户请求该资源,都会向服务器发送一个请求,每次都会下载完整的资源。
public:可以被所有的用户缓存,包括终端用户和CDN等中间代理服务器。
private:只能被终端用户的浏览器缓存,不允许CDN等中继缓存服务器对其缓存。
注意:如果cache-control与expires同时存在的话,cache-control的优先级高于expires
3、协商缓存相关的header字段
协商缓存都是由服务器来确定缓存资源是否可用的,所以客户端与服务器端要通过某种标识来进行通信,从而让服务器判断请求资源是否可以缓存访问,这主要涉及到下面两组header字段,这两组搭档都是成对出现的,即第一次请求的响应头带上某个字段(Last-Modified或者Etag),则后续请求则会带上对应的请求字段(If-Modified-Since或者If-None-Match),若响应头没有Last-Modified或者Etag字段,则请求头也不会有对应的字段。
Last-Modified/If-Modified-Since
二者的值都是GMT格式的时间字符串,具体过程:
浏览器第一次跟服务器请求一个资源,服务器在返回这个资源的同时,在respone的header加上Last-Modified的header,这个header表示这个资源在服务器上的最后修改时间
浏览器再次跟服务器请求这个资源时,在request的header上加上If-Modified-Since的header,这个header的值就是上一次请求时返回的Last-Modified的值
服务器再次收到资源请求时,根据浏览器传过来If-Modified-Since和资源在服务器上的最后修改时间判断资源是否有变化,如果没有变化则返回304 Not Modified,但是不会返回资源内容;如果有变化,就正常返回资源内容。当服务器返回304 Not Modified的响应时,response header中不会再添加Last-Modified的header,因为既然资源没有变化,那么Last-Modified也就不会改变,这是服务器返回304时的response header
浏览器收到304的响应后,就会从缓存中加载资源
如果协商缓存没有命中,浏览器直接从服务器加载资源时,Last-Modified的Header在重新加载的时候会被更新,下次请求时,If-Modified-Since会启用上次返回的Last-Modified值
Etag/If-None-Match
这两个值是由服务器生成的每个资源的唯一标识字符串,只要资源有变化就这个值就会改变;其判断过程与Last-Modified/If-Modified-Since类似,与Last-Modified不一样的是,当服务器返回304 Not Modified的响应时,由于ETag重新生成过,response header中还会把这个ETag返回,即使这个ETag跟之前的没有变化。
配置回源SNI
如果您的源站IP绑定了多个域名,当全站加速节点以HT T PS协议访问您的源站时,您可以设置回源SNI,指
明具体访问的域名。
背景信息
服务器名称指示SNI(Server Name Indication)是一个扩展的传输层安全性协议TLS(Transport Layer
Security)。在该协议下,握手过程开始时,客户端会返回正在连接的那台服务器即将要连接的主机名称,
以允许该服务器在相同的IP地址和TCP端口号上呈现多个证书,即一台服务器可以为多个域名提供服务。因
此,同一个IP地址上提供的多个安全的HT T PS网站(或其他任何基于T LS的服务),不需要使用相同的证
书。如果您的源站服务器使用单个IP提供多个域名的HT T PS服务,且您已经为您的全站加速设置了443端口回源
(CDN节点以HT T PS协议访问您的服务器),您就需要设置回源SNI,指明所请求的具体域名。这样全站加
速节点以HT T PS协议回源访问您的服务器时,服务器才会正确地返回对应的证书。
回源SNI的工作原理如下图所示。
1. 全站加速节点以HTTPS协议访问源站时,在SNI中指定访问的域名。
2. 源站接收到请求后,根据SNI中记录的域名,返回对应域名的证书。
3. 全站加速节点收到证书,与服务器端建立安全连接。
配置Range回源
Range回源是指客户端通知源站服务器只返回指定范围内的部分内容,有利于较大文件的分发加速。开启
Range回源功能,可以减少回源流量消耗,并且提升资源响应时间。通过本文您可以了解开启Range回源的
背景信息:配置Range回源时,需要源站支持Range请求,即HTTP请求头中包含Range字段,源站能够响应正确的
206文件分片。
HTTP/2也被称为HTTP 2.0,相对于HTTP 1.1的新增多路复用、压缩HTTP头、划分请求优先级、服务端推
送等特性,解决了在HTTP 1.1中一直存在的问题,优化了请求性能,同时兼容了HTTP 1.1的语义。目
前,Chrome、 IE11、Safari和Firefox等浏览器已经支持HTTP/2协议。
HTTP/2的优势:
二进制协议:相比于HTTP 1.x基于文本的解析,HTTP/2将所有的传输信息分割为更小的消息和帧,并对
它们采用二进制格式编码。基于二进制可以使协议有更多的扩展性,例如,引入帧来传输数据和指令。
内容安全:HT T P/2基于HT T PS,具有安全特性。使用HT T P/2特性可以避免单纯使用HT T PS引起的性能
下降问题。
多路复用(MultiPlexing):通过该功能,在一条连接上,您的浏览器可以同时发起无数个请求,并且响
应可以同时返回。另外,多路复用中支持了流的优先级(Stream dependencies)设置,允许客户端告
知服务器最优资源,可以优先传输。
Header压缩(Header compression):HTTP请求头带有大量信息,而且每次都要重复发送。HTTP/2
采用HPACK格式进行压缩传输,通讯双方各自缓存一份头域索引表,相同的消息头只发送索引号,从而提
高效率和速度。
HSTS
通过开启HSTS(HTTP Strict Transport Security)功能,您可以强制客户端(如浏览器)使用HTTPS与服
务器创建连接,降低第一次访问被劫持的风险。
前提条件
执行该操作前,请您确保已成功配置HT T PS证书,操作方法请参见配置HT T PS证书。背景信息
当您的网站全站使用HT T PS后,需要将所有HT T P请求的301和302重定向到HT T PS。如果您在浏览器输入或
直接单击HT T P链接,则服务器会将该HT T P请求的301和302重定向到HT T PS。该操作过程可能被劫持,导
致重定向后的请求未发送到服务器,该问题可以通过HST S来解决。
配置Referer防盗链
您可以通过配置访问的Referer黑名单和白名单来实现对访客身份的识别和过滤,从而限制访问全站加速资
源的用户,提升全站加速的安全性。通过本文您可以了解Referer防盗链的配置方法。
背景信息
防盗链功能基于HTTP协议支持的Referer机制,通过Referer跟踪来源,对来源进行识别和判断。
目前防盗链功能支持黑名单或白名单机制,您对资源发起请求后,请求到达全站加速节点,全站加速节点
会根据您预设的防盗链黑名单或白名单,对访客的身份进行过滤。符合规则的用户可以顺利请求到资源,
不符合规则的用户,请求会返回403响应码。
什么是盗链
客户端向服务器请求资源时,为了减少网络带宽,提升响应时间,服务器一般不会一次将所有 资源完整地传回给客户端。比如在请求一个网页时,首先会传回该网页的文本内容,当客户端 浏览器在解析文本的过程中发现有图片存在时,会再次向服务器发起对该图片资源的请求,服务器将存储的图片资源再发送给客户端。在这个过程中,如果该服务器上只包含了网页的文本 内容,并没有存储相关的图片资源,而是将图片资源链接到其他站点的服务器上,就形成了盗 链行为
referer
HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器藉此可以获得一些信息用于处理。通过该头域的值,我们可以检测到访问目标资源的源地址
对象存储中防盗链
对于私有的bucket,因为访问控制的原因,基本不存在大规模盗链的可能性,对于公开空间,因为没有访问权限控制,需要进行防盗链设置
友商防盗链做法
七牛
七牛对于公开空间的防盗链做法主要是通过设置白名单、黑名单和空referer是否可以访问来实现的
设置选项(白名单和黑名单不会同时生效)有:白名单、黑名单、关闭三个选项
七牛防盗链.png
七牛采用三个参数来实现防盗链:
<RefererType>: 防盗链类型:黑名单(black)|白名单(white)
<RefererValue>: 防盗链黑白名单列表:以逗号(,)分割
<NullReferer>:是否允许空referer
AWS
AWS也是通过bucket的访问控制来实现防盗链的
AWS通过bucket Policy中的condition来先设置不同请求的权限
上面的例子就是说,允许匹配的域名和ip拥有bucket:mybucket GetObject的权限
作者:zhllsr
链接://www.greatytc.com/p/c02064db8b5b
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
配置URL鉴权
URL鉴权功能主要用于保护用户站点的内容资源不被非法站点下载盗用。通过防盗链方法添加Referer黑名
单和白名单的方式可以解决一部分盗链问题,由于Referer内容可以伪造,所以Referer防盗链方式无法彻底
保护站点资源。因此,您可以采用URL鉴权方式保护源站资源更为安全有效。
背景信息
URL鉴权功能通过阿里云全站加速节点与客户资源站点配合,形成了更为安全可靠的源站资源防盗方法。
全站加速客户站点提供加密URL,URL中包含权限验证信息。
用户使用加密后的URL向加速节点发起请求。
加速节点对加密URL中的权限信息进行验证,判断请求的合法性。正常响应合法请求,拒绝非法请求。
配置IP黑白名单
您可以通过配置IP黑名单和白名单来实现对访客身份的识别和过滤,从而限制访问全站加速资源的用户,提
升全站加速的安全性。通过本文您可以了解IP黑名单和白名单的配置方法。
背景信息
配置IP黑名单和白名单功能说明如下:
IP黑名单:黑名单内的IP均无法访问当前资源。
如果您的IP被加入黑名单,该IP的请求仍可访问到全站加速节点,但是会被全站加速节点拒绝并返回
403,全站加速日志中仍会记录这些黑名单中的IP请求记录。
IP白名单:只有白名单内的IP能访问当前资源,白名单以外的IP均无法访问当前资源。
配置User-Agent黑白名单
您可以通过配置User-Agent黑名单和白名单来实现对访客身份的识别和过滤,从而限制访问全站加速资源
的用户,提升全站加速的安全性。通过本文您可以了解User-Agent黑/白名单的配置方法。
当您需要根据请求的User-Agent字段进行访问控制时,请配置User-Agent黑/白名单功能
User-Agent黑名单:黑名单内的User-Agent字段均无法访问当前资源。
如果您的User-Agent字段被加入黑名单,该带有User-Agent字段的请求仍可访问到全站加速节点,但是
会被全站加速节点拒绝并返回403,全站加速日志中仍会记录这些黑名单中的User-Agent字段记录。
User-Agent白名单:只有白名单内的User-Agent字段才能访问当前资源,白名单以外的User-Agent字
段均无法访问当前资源。
性能优化
1.页面优化
当您开启页面优化功能时,全站加速自动清除HT ML页面冗余的注释和重复的空白符,缩小文件体积,提升
页面可阅读性。本文为您详细介绍开启页面优化功能的方法。
开启页面优化功能后,全站加速自动删除当前域名下所有HT ML页面中冗余的注释和重复的空白符,这样可
以有效地去除页面的冗余信息,减小文件体积,提高加速分发效率。
如果源站文件配置了MD5校验机制,则请勿开启该功能。当全站加速进行页面优化时,该文件的MD5值会被
更改,导致优化后文件的MD5值和源站文件的MD5值不一致。
2.智能优化
当您开启智能压缩功能时,全站加速自动对静态文件进行Gzip压缩。通过智能Gzip压缩方式,可以有效减小传输文件大小,提升加速效率。本文为您详细介绍开启智能压缩功能的方法。
目前智能压缩支持的内容格式: text/html 、 text/xml 、 text/plain 、 text/css 、 application/jav
ascript 、 application/x-javascript 、 application/rss+xml 、 text/javascript 、 image/tiff 、 ima
ge/svg+xml 、 application/json 、 application/xmltext 。
客户端请求携带请求头 Accept-Encoding: gzip :客户端希望获取对应资源的gzip压缩响应。
服务端响应携带响应头 Content-Encoding: gzip :服务端响应的内容为gzip压缩的资源 。
3.过滤参数
如果您的URL请求中携带大量参数,需要忽略参数浏览文件时,则可以开启过滤参数,过滤携带参数的URL
返回源站,提高缓存命中率。本文为您详细介绍配置过滤参数的方法。
背景信息
开启过滤参数。
开启过滤参数后,请求URL到全站加速节点后,会截取到没有该参数请求的URL,且全站加速节点仅保留
一份副本。如果您的URL请求中携带大量问号( ? )参数,例如: http://alibaba.com/content?a ,但是这些参
数内容优先级不高,可以忽略参数浏览文件时,建议您开启过滤参数。开启过滤参数的作用是忽略URL
请求中 ? 之后的参数,提高全站加速缓存的命中率。
例如:第一次访问 http://www.****.com/1.jpg ,全站加速没有缓存,直接回源访问数据;第二次访问http://www.****.com/1.jpg?test1 ,由于开启了过滤参数,所以 ? 后的参数无需匹配,即可命中CDN
缓存 http://www.****.com/1.jpg 。
4.拖拽播放
当您播放视音频时,需要随意拖拽播放进度,而不影响视音频的播放效果,可以开启拖拽播放。通过本文您
可以了解配置拖拽播放功能的操作方法。
背景信息
拖拽播放功能是指在视音频点播场景中,如果您拖拽播放进度,则客户端会向服务器端发送URL请求,例
如: http://www.aliyun.com/test.flv?start=10 ,服务端会向客户端响应从第10字节的前一个关键帧(如
果start=10不是关键帧所在位置)的数据内容。
配置拖拽播放功能之前,需要确认源站支持Range请求。如果HTTP请求头中包含Range字段,则源站需
要响应正确的206文件分片。
拖拽播放功能支持的文件和URL格式如下表所示。
4. Websocket
通过本文您可以了解Websocket的概念、优势和使用场景。
什么是Websocket
Websocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信,
即允许服务器主动发送信息给客户端。因此,在Websocket中,浏览器和服务器只需要完成一次握手,两
者之间就直接可以创建持久性的连接,并进行双向数据传输,客户端和服务器之间的数据交换。
Websocket的优势
现在,很多网站为了实现推送技术,所用的技术都是Ajax轮询。轮询是在特定的时间间隔(如每1秒),由
浏览器对服务器发出HT T P请求,然后由服务器返回最新的数据给客户端的浏览器。
这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求。然而HT T P请求可能包含较长
的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。HT ML5定义的
Websocket协议优势如下:
小Header:互相沟通的Header非常小,只有2Bytes左右。
服务器不再被动接收到浏览器的请求之后才返回数据,而是在有新数据时就主动推送给浏览器。
Websocket协议能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。
常见服务器鉴权技术
1)判断引用地址,通过HTTP头的Referer字段来获取浏览器的页面地址,方法通常用于防止图片,MP3,嵌入其它网站。
2)使用合法性验证信息,存储在HTTP请求的cookie字段,用于进行快速查询。
3)使用cookie携带动态验证信息,对使用cookie是否有正确的值进行判断。
4)使用POST下载,若是POST请求,则读取目标资源并写入响应对象
5)使用图像验证码
6)使用动态密钥,一定时间内有效的密钥值
7)在内容中插入随机数据,整个文件的散列值会发生变化。
8)打包下载
CDN访问异常篇之502/503/504错误
一. 源站不通或源站域名无法解析
CDN 都是公网上的节点,CDN配置的源站必须要公网可达。如果配置的源站IP公网不可达、端口不通或者源站域名没有解析,则会导致CDN回源请求源站失败,报错5xx。
常见的几种异常情况如下:
(1)源站网络不通,测试无法ping通源站IP。ping测试命令:ping 源站IP
(2)源站端口不通或源站直接响应5xx错误。例如以下案例,telnet端口报错Connection timed out
i)如果源站端口配置的是80,则测试80端口是否通:telnet 源站IP 80
ii)如果源站端口配置的是443,则测试443端口是否通。如果源站端口配置的是自定义端口,则测试自定义端口是否通。
iii)可以在CDN控制台获取配置的源站地址和端口,然后本地host绑定到源站,固定源站做七层测试,查看是否是源站直接无响应或源站直接响应5xx,具体可以参考
二.CDN配置了HTTPS回源,但源站不支持HTTPS
(1)源站端口配置成443,但源站不支持HTTPS
在CDN控制台的源站配置界面,如果源站端口配置成443,则CDN回源的时候是HTTPS回源到源站的443端口。源站需要开放443端口,且配置HTTPS证书。如果源站不支持HTTPS访问,则CDN回源失败,报错5xx。对于这种情况,可以把回源端口改成80;如果业务需要443回源的话,那么需要在源站配置HTTPS证书。
(2)CDN配置了协议跟随回源,但是源站不支持HTTPS访问。
协议跟随回源如果设置成“HTTPS”,则CDN是以HTTPS回源;协议跟随回源如果设置成“跟随”,则当客户端是HTTPS访问的时候,CDN是HTTPS回源。源站不支持HTTPS的情况下,会出现访问失败。对于这种情况,需要关闭协议跟随回源功能,或设置为HTTP回源。
三.源站开启了SNI校验,但是CDN没有开启“回源SNI”
CDN回源默认是不带SNI信息的,如果您的源站IP绑定了多个域名,当CDN节点以HTTPS协议访问您的源站时,由于没有带SNI信息,会导致源站无法正确响应HTTPS证书,导致回源失败。因为这个问题导致的错误,一般是503 Service Temporarily Unavailable错误,而且很快就会返回这个错误。您可以在CDN控制台设置开启回源SNI,指明具体访问域名。具体SNI的介绍以及配置方法参考这里。
四.源站存在安全防护规则
源站的相关安全防护规则导致的CDN回源异常,通常会在10秒以内就返回5xx错误,大部分情况会返回503 Service Temporarily Unavailable的错误,具体的排查方法和解决方案可以参考文档源站安全策略导致5xx。
(1)源站服务器开启了安全组限制,限制了CDN节点的访问
(2)源站服务器配置了单IP访问次数限制,把CDN的回源IP当成了异常IP
(3)源站存在云锁、安全狗、防火墙等安全策略,拦截了CDN的回源IP
(4)源站Web服务异常或服务器超载
五. 源站超时无响应导致CDN回源超时
CDN 回源有严格的超时时间,四层 TCP 是 10 秒超时,七层HTTP / HTTPS是 30 秒超时,当超过该时间时即使后续源站响应正常也是会返回 5xx错误,通常因CDN回源超时导致的问题,会响应504Gateway Time-out错误。可以绑定源站去测试源站的响应速度,如果超过30秒,需要检查源站服务,优化源站的响应速度,确保源站返回请求时间控制在一个较短的时间内,另外也可以申请延长CDN域名的默认超时时长,详细请参考配置回源请求超时时间。
六. 跨境回源或源站侧网络异常
回源存在跨境链路导致的CDN回源超时,响应5xx错误。例如源站在境外,中国大陆的用户访问的时候,是先访问到中国大陆的CDN节点,然后中国大陆的CDN节点走跨境链路,回源到境外的源站;亦或者源站在中国大陆,境外用户访问的时候先请求到境外的CDN节点,境外的CDN节点走跨境链路,回源到中国大陆的源站。由于CDN回源走的都是公网,这种情况涉及到跨境链路,需要走国际互联网出口以及境外运营商的链路,本身就存在一定的不稳定因素。还有一种情况是源站侧机房的网络差,或源站侧网络不稳定。
CDN缓存相关问题及命中率优化
提升缓存命中率的意义
CDN在静态资源加速场景的应用,是将静态资源缓存在距离客户端最近的CDN节点上。用户访问该资源时,直接从缓存中获取资源,避免通过较长的链路回源。如果CDN缓存命中率低,则会导致源站压力大,静态资源访问效率低。因此,CDN缓存命中率的高低直接影响用户体验,而保证较高的缓存命中率也成为了CDN的核心课题。可以针对导致CDN缓存命中率低的具体原因,选择对应的优化策略,来优化CDN的缓存命中率。CDN缓存命中率包括字节缓存命中率和请求缓存命中率。
字节缓存命中率 = CDN缓存命中响应的字节数 / CDN所有请求响应的字节数
请求缓存命中率 = CDN缓存命中的请求数 / CDN所有的请求数
如何判断缓存是否成功
我们可以通过打开浏览器审查元素来分析CDN返回的Response Header,其中X-Cache字段来判断是否命中缓存,具体可以参见如何通过浏览器的审查元素判断CDN缓存是否成功。
在 Response Headers 字段内,可以查看详细的请求和返回的报文信息。
Age:为CDN返回的头部字段,表示该文件在CDN节- 点上缓存的时间,单位为秒。只有文件存在于节点上Age字段才会出现,当文件被刷新后或者文件被清除的首次访问,在此前文件并未缓存,无Age头部字段,需要注意当Age为0时,表示节点已有文件的缓存,但由于缓存已过期,本次无法直接使用该缓存,需回源校验。
X-Swift-SaveTime:CDN节点上的缓存RS(swift)的时间,即该文件是在什么时间缓存到CDN节点上。
X-Swift-CacheTime:CDN节点上的允许缓存时间,即该文件可以在CDN节点上缓存多久,是指文件在CDN节点缓存的总时间。计算还有多久需要回源刷新= ’X-Swift-CacheTime’ – ‘Age’。
X-Cache:"HIT"表示已缓存,"MISS"表示节点上无该文件的缓存,回源请求。
为什么无法命中缓存
(1)客户端请求是动态请求
如果请求是动态请求,则无法命中CDN缓存。当客户端访问这些动态内容时,每次都需要访问用户的服务器,由服务器动态生成实时的数据并返回给客户端。
(2)源站返回强制不缓存的HTTP头
当源站配置了以下响应头时,即使配置了缓存规则,CDN也不会对该资源进行缓存,因为这些响应头在CDN缓存规则中的优先级较高。
1:有s-maxage=0、max-age=0、no-cache、no-store、private中的任一种。
2:有s-maxage或s-maxage=0。
3:有Pragma: no-cache。
(3)未返回响应头Etag和Last-modified
当CDN未配置缓存规则时,如果静态文件未返回响应头Etag和Last-modified,则该静态文件不能缓存在CDN节点上。解决方案就是源站配置返回Etag和Last-modified或者直接在CDN上配置缓存规则。
(4)全站加速未配置静态加速
全站加速默认走了动态加速,动态加速是每次回源的。如果需要走缓存的话,需要配置静态加速。目前配置静态加速支持按照文件类型、URI以及路径方式配置。如果全站加速没有配置静态加速的情况,则都是走动态加速的,全站加速节点响应的HTTP头没有X-Cache、X-Swift-CacheTime等字段的,类似如下图
影响CDN缓存命中率下降的因素:
(1)刷新缓存,可能导致短时间内命中率下降。
(2)带宽突增,会导致CDN节点回源较多,命中率会表现有下降趋势。
(3)CDN节点访问新内容,导致CDN节点回源较多,命中率会表现有下降趋势。
(4)缓存规则调整,可能会影响命中率。
缓存命中率低分析及优化
CDN控制台统计的缓存命中率仅仅是CDN L1层的命中率,实际情况L2层的缓存数据也是从CDN节点获取,并不会从源站获取数据,所以真实的CDN命中率是略高于CDN控制台显示的命中率。
另外查看CDN加速域名流量情况,在加速域名流量不高的情况下,即便MISS状态的URL不多,但是对命中率的统计计算影响很大。例如,某CDN加速域名一共对外提供了10个可以访问的URL,其中有一个URL源站上设置了no-cache,导致不缓存,在其他URL访问都命中的情况下,命中率也仅有90%。
在之前检查正常的情况下,有如下几种可能导致命中率低的情况,请逐一进行排查:
(1)源站上缓存Header设置不当,或者缺少必要的Header,如果CDN的缓存规则是不缓存,那么每次访问都是MISS状态,影响命中率,具体请参考前文“为什么无法命中缓存”的描述。
(2)CDN控制台设置了不缓存的规则,即某目录或者某种后缀的文件设置的缓存时间为0秒,相关信息可以在CDN控制台查看。
(3)源站动态内容较多,目前CDN主要是加速静态资源,例如CSS、JS、HTML、图片、txt、视频等资源,针对动态资源PHP、JSP、包含内部逻辑处理甚至Cookie等资源都会回源数据。
(4)CDN的加速URL中带有可变参数。例如URL地址为http://XXX.XXX.cn/1.txt?timestamp=14378923 ,其中timestamp值为时间戳,每次访问此值均不同。CDN针对第一次访问的URL,即之前未预热的URL,无论该URL是否符合CDN的缓存规则,由于节点上还没有这个文件,第一次访问肯定都是MISS状态。但是timestamp参数会变化,所以每次访问都是一个全新的URL,则每次都返回MISS状态,从而影响命中率。
(5)检查是否存在频繁刷新缓存的操作。
(6)文件热度不够。不经常被用户访问到的URL,即使符合所有缓存规则,但是经常有被节点去除缓存的风险。CDN节点上缓存的文件,可以理解为按照热度属性采取末尾淘汰制,热度就是该文件在该节点上被访问的频率,文件热度不够,其实一定程度上跟这个域名本身的流量不高有关系。
针对以上情况,可以考虑通过"预热URL"、"配置资源缓存规则"、"过滤URL中可变参数"来优化缓存命中率,具体操作请参见优化CDN缓存命中率。