Range回源,指CDN节点在回源的HTTP请求里面携带了Range信息,源站在收到CDN节点的回源请求时,根据HTTP请求头中的Range信息返回指定范围的内容数据给CDN节点。Range回源可有效提高文件分发效率,可以提高缓存命中率,减少回源流量消耗和源站压力,并且提升资源响应速度。
背景信息
Range是HTTP请求头之一,可用来指定需获取的内容的范围。例如,Range: bytes=0-100
表示回源请求该文件的前101个字节的数据内容。
开启Range回源功能后,CDN收到用户的请求时,如果CDN节点上未缓存该资源或资源已过期,CDN节点回源会采用Range请求,从源站分段获取用户需要的部分资源并缓存到CDN节点上。
开启Range回源的工作原理如下图所示:
注意事项
开启Range回源有以下注意事项:
开启Range回源前需确认源站是否支持Range请求,即HTTP请求头中包含Range字段,并且源站能够响应正确的206文件分片。如果源站不支持Range请求,开启Range回源将导致资源无法缓存。
Range回源是可选配置项,CDN控制台默认未开启。
Multipart Ranges特性状态默认关闭,开启Range回源功能也不会同步开启Multipart Ranges特性,请提交工单申请开启Multipart Ranges特性。
操作步骤
登录CDN控制台。
在左侧导航栏,单击域名管理。
在域名管理页面,找到目标域名,单击操作列的管理。
在指定域名的左侧导航栏,单击视频相关。
在Range回源区域,单击修改配置。
选择不使用Range回源,跟随客户端Range请求或开启Range回源(大文件场景推荐配置)Range回源。
参数
描述
示例
Range回源
不使用Range回源
默认为不使用Range回源状态,无论客户端是否使用Range请求CDN节点,CDN节点回源时都会请求整个文件,在大文件场景下的文件分发效率较低。
例如,客户端向CDN节点发起的请求中含有
range:0-100
,则CDN节点向源站发起的请求中不会携带Range参数。源站会响应CDN节点完整文件(假设完整文件大小为10 MB,源站就会响应10 MB的文件给CDN节点),CDN节点收到源站响应的文件后,会将文件缓存下来,同时响应客户端range:0-100
的内容。跟随客户端Range请求
开启跟随客户端Range请求后,当客户端使用Range请求CDN节点时,CDN节点才会采用Range请求回源。CDN节点第一次回源请求会按照用户请求中的Range大小向上取整回用户源站,后面全部按照512 KB分片大小回用户源站。
例如,用户请求了600 KB,CDN节点第一次回源请求会按照1024 KB回源,后面全部按照512 KB分片大小回用户源站。
例如,客户端向CDN节点发起的请求中含有
range:0-100
,则CDN节点会按照512 KB分片大小向源站发起请求,源站响应了这个512 KB分片大小的内容后,CDN节点会缓存该分片,并响应range:0-100
的内容给客户端。开启Range回源(大文件场景推荐配置)
开启Range回源(大文件场景推荐配置)后,无论客户端是否使用Range请求CDN节点,CDN节点都会采用Range请求回源。CDN节点的所有回源Range请求都按照512 KB分片大小回用户源站。
无
规则条件
规则条件能够对用户请求中携带的各种参数信息进行识别,以此来决定某个配置是否对该请求生效。
不使用:不使用规则条件。
选择已配置的规则引擎,新增或修改规则引擎请参见规则引擎。
单击确定,完成配置。
HTTP Range范围超出有效区间的兼容性配置
CDN回源OSS源站获取大文件的场景下,如果OSS响应了cache-control:no-cache不缓存策略,或者客户端请求访问CDN触发Range请求回源OSS时,可能会出现异常,具体表现为:下载异常缓慢甚至超时(30秒左右)、下载至超Range片时触发连接中断(如文件末尾的最后一片)。
未设置兼容策略情况下的行为
如果HTTP Range请求合法,响应返回值为
206
并在响应头中包含Content-Range
。如果HTTP Range请求不合法,或者指定范围不在有效区间,会导致Range不生效,响应返回值为200
,并传送整个Object内容。如下为HTTP Range请求不合法的示例及错误说明。说明此处假设Object资源大小为1000字节,Range有效区间为0~999。为避免指定的Range超出范围,可在Range读取前进行HeadObject请求,获取对象大小。
Range: byte=0-499
:格式错误,byte应为bytes。Range: bytes=0-1000
:末字节1000超出有效区间。Range: bytes=1000-2000
:指定范围超出有效区间。Range: bytes=1000-
:首字节超出有效区间。Range: bytes=-2000
:指定范围超出有效区间。
可以通过如下命令测试Range参数的有效性。
curl -r 0-100 http://xxxx.oss-cn-hangzhou.aliyuncs.com/xx.zip -o /tmp/xx1.zip -v
设置兼容策略以后的行为
使用HTTP Range时,增加请求头
x-oss-range-behavior:standard
,可以改变指定范围不在有效区间时OSS的行为。行为改变的示例如下:说明此处假设Object资源大小为1000字节,Range有效区间为0~999。如通过HTTP Range请求获取大文件的部分内容时,因选取了无效的范围,导致OSS返回InvalidRange错误码,请参见OSS返回416错误进行解决,详细错误信息如下:
The requested range cannot be satisfied
Range: bytes=500-2000
:末字节超出有效区间,返回500~999字节范围内容。Range: bytes=1000-2000
:首字节超出有效区间,返回错误416 (InvalidRange)
。Range: bytes=1000-
:首字节超出有效区间,返回错误416 (InvalidRange)
。Range: bytes=-2000
:指定范围超出有效区间,返回0~999字节,即完整的文件内容。
针对上述内容,本文提供如下HTTP Range请求示例。
说明此处假设Object资源大小为1000字节,Range有效区间为0~999。
请求Object资源0~499字节范围内的内容。
GET /ObjectName Range: bytes=0-499 Host: bucket.oss-cn-hangzhou.aliyuncs.com Date: Fri, 18 Oct 2019 02:51:30 GMT Authorization: Sigature 206 (Partial Content) content-length: 500 content-range: bytes 0-499/1000 connection: keep-alive etag: "CACF99600561A31D494569C979E6FB81" x-oss-request-id: 5DA928B227D52731327DE078 date: Fri, 18 Oct 2019 02:51:30 GMT [500 bytes of object data]
请求Object资源第500字节到文件结尾的内容。
GET /ObjectName Range: bytes=500- Host: bucket.oss-cn-hangzhou.aliyuncs.com Date: Fri, 18 Oct 2019 03:24:39 GMT Authorization: Signature 206 (Partial Content) content-length: 500 content-range: bytes 500-999/1000 etag: "CACF99600561A31D494569C979E6FB81" x-oss-request-id: 5DA9307750EBE33332E3720A date: Fri, 18 Oct 2019 03:24:39 GMT [500 bytes of object data]
建议在大文件(平均单个文件大小在20 MB以上)内容分发场景下,CDN回源OSS的配置中都进行该项配置。
如果在阿里云OSS源站上开启了访问鉴权功能,并且由客户端来实现回源请求的签算,那么客户端在签算的时候需要把回源请求头
x-oss-range-behavior:standard
加入签算(由于阿里云OSS在计算签名的时候,会将所有带x-oss-
前缀的请求头都加入计算,如果客户端签算的时候没有把x-oss-range-behavior:standard
加入签算,会导致阿里云OSS源站签算不一致,拒绝回源请求)。