配置Range回源

更新时间:
复制 MD 格式

Range回源,指CDN节点在回源的HTTP请求里面携带了Range信息,源站在收到CDN节点的回源请求时,根据HTTP请求头中的Range信息返回指定范围的内容数据给CDN节点。Range回源可有效提高文件分发效率,减少回源流量消耗和源站压力,并且提升资源响应速度。

背景信息

RangeHTTP请求头之一,可用来指定需获取的内容的范围。例如,Range: bytes=0-100表示回源请求该文件的前101个字节的数据内容。

开启Range回源功能后,CDN收到用户的请求时,如果CDN节点上未缓存该资源或资源已过期,CDN节点回源会采用Range请求,从源站分段获取用户需要的部分资源并缓存到CDN节点上。

开启Range回源的工作原理如下图所示:

image

注意事项

开启Range回源有以下注意事项:

  • 开启Range回源前需确认源站是否支持Range请求,即HTTP请求头中包含Range字段,并且源站能够响应正确的206文件分片。如果源站不支持Range请求,开启Range回源可能导致缓存异常或客户端请求失败。

  • Range回源是可选配置项,控制台默认未开启。

  • Multipart Ranges特性状态默认关闭,开启Range回源功能也不会同步开启Multipart Ranges特性,请提交工单申请开启Multipart Ranges特性。

  • 开启Range回源功能以后,会导致回源的QPS升高,如果源站设置了频次控制功能,需要注意避免触发源站的限流;规避办法是通过DescribeL2VipsByDomain查询回源节点的IP地址 ,并且将回源节点的IP加入源站的访问IP白名单。

大文件传输场景

CDN 支持对 MP4 等大文件进行边下边播(流式传输),但具体的传输行为取决于源站是否支持 HTTP Range 请求以及 CDN 控制台中的回源模式配置。以下是三种典型场景:

  • 场景一:源站支持 Range + 控制台开启了「跟随客户端 Range 请求」或「开启 Range 回源」

    当客户端发送 Range 请求(如播放 MP4 视频时请求特定时间段的视频数据),且 CDN 控制台中的 Range 回源模式设置为「跟随客户端 Range 请求」或「开启 Range 回源」时,CDN 节点会按需向源站请求对应范围的数据片段并返回给客户端,无需等待完整文件下载完成。此时可实现边下边播。

  • 场景二:客户端未发送 Range 请求

    若客户端请求完整文件(无 Range 头),CDN 节点会向源站请求完整文件并流式转发给客户端(边收边发,无需等待下载完成)。播放器可在接收数据的同时开始播放(前提是 MP4 的 moov atom 位于文件头部),但无法跳转到未下载的位置。此场景下 Range 回源配置不影响客户端侧的传输行为。

  • 场景三:源站不支持 Range 请求

    即使客户端发送了 Range 请求且 CDN 控制台已开启 Range 回源,若源站不支持 HTTP Range 请求(即无法响应 206 状态码返回指定范围的内容),Range 回源将无法生效,CDN 节点会回源获取完整文件。因此,开启 Range 回源前需确认源站支持 Range 请求。

说明

MP4 等视频格式本身支持流式传输,但前提是底层 HTTP 传输支持 Range 请求。建议在使用 CDN 分发大文件时,确认源站支持 HTTP Range 请求,并根据实际业务需求在 CDN 控制台选择合适的 Range 回源模式。

操作步骤

  1. 登录CDN控制台

  2. 在左侧导航栏,单击域名管理

  3. 域名管理页面,找到目标域名,单击操作列的管理

  4. 在指定域名的左侧导航栏,单击视频相关

  5. Range回源区域,单击修改配置

  6. 根据下方的参数介绍,选择不使用Range回源跟随客户端Range请求开启Range回源(大文件场景推荐配置)

    当选择跟随客户端Range请求或者开启Range回源(大文件场景推荐配置)时,可以设置分片大小。分片大小默认为512 KB。

    参数

    选项

    描述

    示例

    Range回源

    不使用Range回源

    默认为不使用Range回源,无论客户端是否使用Range请求CDN节点,CDN节点回源时都会请求整个文件,在大文件场景下的文件分发效率较低。

    例如,客户端向CDN节点发起的请求中含有Range: bytes=0-100,则CDN节点向源站发起的请求中不会携带Range参数。源站会响应CDN节点完整文件(假设完整文件大小为10 MB,源站就会响应10 MB的文件给CDN节点),CDN节点收到源站响应的文件后,会将文件缓存下来,同时响应客户端Range: bytes=0-100的内容。

    跟随客户端Range请求

    开启跟随客户端Range请求后,当客户端使用Range请求CDN节点时,CDN节点才会采用Range请求回源。CDN节点第一次回源请求会按照用户请求中的Range大小向上取整来请求用户源站(此处的向上取整为分片大小的整数倍),后面全部按照用户指定的分片大小来请求用户源站。

    例如,当分片大小为 512 KB 时,如果客户端向 CDN 节点发起的请求中含有 Range:bytes=0-614399(即 600 KB),CDN 节点上如果没有缓存文件,则第一次回源请求会按照 1024KB 的分片大小回源(600 KB 向上取整为1024KB),后续客户端访问此文件的其他未缓存的分片,CDN节点将按照512KB的分片大小访问源站。

    开启Range回源(大文件场景推荐配置)

    开启Range回源(大文件场景推荐配置)后,无论客户端是否使用Range请求CDN节点,CDN节点都会采用Range请求回源。CDN节点的所有回源Range请求都按照用户指定的分片大小来请求用户源站。

    分片大小

    • 512 KB

    • 1 MB

    • 2 MB

    • 4 MB

    回源模式为跟随客户端Range请求开启Range回源(大文件场景推荐配置)的情况下可以设置Range分片大小,默认按512 KB生效。

    1 MB

    规则条件

    规则条件能够对用户请求中携带的各种参数信息进行识别,以此来决定某个配置是否对该请求生效。

    重要

    引用规则条件时,按所关联规则条件的优先级匹配,而非按功能自身的配置顺序匹配。

    • 不使用:不使用规则条件。

    • 若需新增或编辑规则条件,请在规则引擎中进行管理。

    规则条件能够对用户请求中携带的各种参数信息进行识别,以此来决定某个配置是否对该请求生效。

    不使用

  7. 单击确定,完成配置。

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]
    • 请求Object资源最后500字节的内容。

      GET /ObjectName
      Range: bytes=-500
      Host: bucket.oss-cn-hangzhou.aliyuncs.com
      Date: Fri, 18 Oct 2019 03:23:22 GMT
      Authorization: Signature
      
      206 (Partial Content)
      content-length: 500
      content-range: bytes 500-999/1000
      etag: "CACF99600561A31D494569C979E6FB81"
      x-oss-request-id: 5DA9302A6646AC37397F7039
      date: Fri, 18 Oct 2019 03:23:22 GMT
      [500 bytes of object data]
说明
  • 建议在大文件(平均单个文件大小在20 MB以上)内容分发场景下,CDN回源OSS的配置中都进行该项配置。

  • 如果在阿里云OSS源站上开启了访问鉴权功能,并且由客户端来实现回源请求的签算,那么客户端在签算的时候需要把回源请求头x-oss-range-behavior:standard加入签算。阿里云OSS计算签名时会包含所有x-oss-前缀的请求头。若客户端签算未包含x-oss-range-behavior请求头将导致签名不一致而被拒绝。