You need to enable JavaScript to run this app.
导航
Range 回源设置
最近更新时间:2024.09.25 10:31:05首次发布时间:2022.02.09 10:15:37

本文档介绍如何在火山引擎内容分发网络(CDN)中的 "Range 回源设置" 功能。在大文件下载、流媒体播放等场景中,开启 Range 回源能够有效提升文件的分发效率,降低 CDN 的回源流量、减轻源站的压力。

Range 请求

Range 请求指的是那些包含了 Range 请求头的 HTTP 请求。该请求头指定了请求的文件范围,表示请求的是文件的一个分片,而非整个文件。例如,Range:bytes=0-149 表示请求的是文件前 150 字节。如果 Range 请求成功,服务器的响应状态码是 206。

注意事项

  1. 假设 CDN 在收到一个用户请求时就判定请求文件无需缓存。例如,在匹配该用户请求的 缓存规则 中,配置的缓存过期时间是 0 秒。在这个情况下,无论 Range 回源是否开启,CDN 会将用户请求透传到源站,并将源站响应返回给用户。

  2. 如果源站不支持 Range 请求,开启 Range 回源后,回源请求可能会失败。

未开启 Range 回源时的 CDN 行为

未开启 Range 回源时,无论用户请求是否为 Range 请求,CDN 会向源站请求完整的文件。在 CDN 收到源站响应后,有以下两种情况:

  • CDN 基于 缓存规则 判定请求文件无需缓存。在这个情况下,CDN 会额外将用户请求透传到源站,并将源站响应返回给用户。

  • CDN 基于缓存规则判定请求文件需要缓存。在这个情况下,

    • 如果回源请求成功,CDN 将用户请求的文件返回给用户。

    • 如果回源请求失败,CDN 将源站响应返回给用户。

开启 Range 回源后的 CDN 行为

为提升 CDN 缓存的效率,开启 Range 回源后,CDN 在向源站请求一个文件时,会请求文件分片。也就是说,CDN 会向源站发送一个或者多个 Range 请求,每个 Range 请求的分片大小默认是 1 MB。1 MB 就是 1,048,576 字节。

对于 CDN 发送的第一个 Range 请求中的文件范围,有以下情况:

  • 如果用户请求的是完整文件,该 Range 请求中的文件范围是 Range:bytes=0-1048575

  • 如果用户请求的是文件分片,该 Range 请求中的文件范围的起始位置是用户请求中文件范围的起始位置向下取整。例如,用户请求中的文件范围是 Range:bytes=2000000-3000000,则 CDN 发送的第一个 Range 请求中的文件范围是 Range:bytes=1048576-2097151

CDN 会根据源站对第一个 Range 请求的响应状态码来决定后续行为。以下是不同状态码下 CDN 的行为:

  1. 响应状态码是 200。
    在这个情况下,源站响应中包含了完整文件。CDN 将用户请求的文件返回给用户。

  2. 响应状态码是 206。有以下两种情况:

    • 基于缓存规则,CDN 判定请求文件无需缓存。在这个情况下,CDN 会额外将用户请求透传到源站,并将源站响应返回给用户。

    • 基于缓存规则,CDN 判定请求文件需要缓存。在这个情况下,源站响应中包含了完整文件大小的信息。在 CDN 向源站发送最后一个 Range 请求前,CDN 会基于完整文件的大小修正最后一个 Range 请求中文件范围的结束位置,确保文件范围不超过完整文件的大小。
      例如,完整文件的大小是 1.5 MB,用户 Range 请求中的文件范围是 Range:bytes=0-1100000。在这个情况下,CDN 向源站发送的第一个 Range 请求中的文件范围是 Range:bytes=0-1048575。在发送第二个 Range 请求前,CDN 会将该请求中的文件范围修正为 Range:bytes=1048576-1100000

  3. 响应状态码是 416。有以下两种情况:

    • 基于 状态码缓存 规则,CDN 判定该状态码无需缓存。在这个情况下,CDN 会额外将用户请求透传到源站,并将源站响应返回给用户。

    • 基于状态码缓存规则,CDN 判定该状态码需要缓存。在这个情况下,CDN 对用户请求响应 416 状态码。

    说明

    416 状态码表示 Range 请求失败,常见原因如下:

    • 用户 Range 请求中的文件范围未超出完整文件的大小。由于 CDN 向源站发送的第一个 Range 请求是 1 MB,因此文件范围的结束位置超过了完整文件的大小,导致该回源请求失败。
      例如,完整文件的大小是 1.5 MB,用户 Range 请求中的文件范围是 Range:bytes=1400000-1500000。在这个情况下,CDN 向源站发送的第一个 Range 请求的文件范围是 Range:bytes=1048576-2097151。该范围超出了完整文件的大小。
    • 用户 Range 请求中的文件范围超出了完整文件的大小。
      例如,完整文件的大小是 1.5 MB,用户 Range 请求中的文件范围是 Range:bytes=1600000-2000000。该范围超出了完整文件的大小。
  4. 响应状态码不是 200、206、416。
    在这个情况下,CDN 会额外将用户请求透传到源站,并将源站响应返回给用户。

操作步骤

  1. 登录 火山引擎内容分发网络控制台

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

  3. 域名管理 页面,找到需要配置的域名,点击 管理

  4. 在页面右上方,点击 回源配置 页签。

  5. 点击 编辑配置

  6. Range 回源设置 下方,设置 状态 为启用。

  7. 在页面右上方,点击 提交编辑

阿里云 OSS 兼容配置

假设以下场景:

  • 您的源站是阿里云对象存储(OSS)的存储桶。

  • CDN 向源站发送的 Range 请求中的文件范围超过了完整文件的大小。

在这个场景中,OSS 会响应 200 状态码并返回完整文件。这会导致 OSS 的下行流量增大,可能会触发 OSS 限流,影响回源请求的数据传输速度。

因此,如果您的源站是 OSS 中的存储桶,推荐您为您的加速域名设置 回源 HTTP 请求头x-oss-range-behavior:standard。参见 该头部对于 OSS 行为的影响