启用动态压缩

动态压缩会自动压缩 Media CDN 传送的响应。 通常,通过网络发送的数据大小会减少 60% 到 85% 。

数据大小的减少会加快样式表 (CSS)、脚本 (JavaScript) 和视频清单 (HLS/DASH) 等重要资源的下载速度,从而显著缩短网页加载和视频启动时间。

大型实时视频播放列表(清单)包含大量重复数据和提取,这包括每个片段的主机和路径前缀,以及 HLS 或 DASH 播放列表元数据。加载播放列表或下载播放列表更新的速度越快,客户端等待解析和开始下载引用的视频片段的时间就越少。HLS 和 DASH 播放列表的总大小通常会减少 90% 以上。

如需详细了解压缩响应所能带来的益处,请参阅 网站开发基础 指南。

动态压缩的运作方式

启用动态压缩后,如果 客户端接受其中一种受支持的压缩算法(br 或 gzip),则在传送来自源站的可压缩内容 之前,系统可以对其进行压缩。

Media CDN 会向所有符合压缩条件的响应添加 Vary: Accept-Encoding 标头。如需了解相关信息,请参阅 不可压缩的内容。

此外,如果请求的 Accept-Encoding 标头通过指定 br 或 gzip(并可以选择性地包含非零 q 参数)来表明偏好压缩内容,则 Media CDN 会执行以下操作:

  • 从响应中移除 Content-Length 标头;这是必要的,因为在整个响应被压缩之前,完整的内容长度是未知的,因此需要尽快传送响应。 对于 HTTP/1.1 及更早版本,Media CDN 不使用 Content-Length 时会在响应中使用 Transfer-Encoding: chunked。

    响应被压缩和缓存后,Media CDN 可以在后续响应中包括 Content-Length 标头,并将该值设置为压缩后的正文内容的长度。

  • 将 Accept-Ranges 设置为 none。这会通知客户端,系统会忽略对此资源发出的范围请求。

  • 根据 RFC 9110 第 8.8.3节的要求,弱化任何强 ETag 响应标头。例如, ETag: "xyzzy" 会被替换为 ETag: W/"xyzzy"。

  • 将 Content-Encoding 标头设置为 br 或 gzip,这表示所选的压缩算法。

    Media CDN 会根据响应的预期压缩比以及压缩速度或吞吐量选择最佳压缩算法。

    • 如果客户端支持 Brotli 压缩,即使其他压缩算法在 Accept-Encoding 标头中具有更高的 q 值,系统也会使用 Brotli 压缩。

    • HLS 清单仅使用 gzip 进行压缩。

    Media CDN 会确定合适的压缩级别,以在客户端的下载总量和 CPU 费用之间进行平衡。并不总是压缩级别越高性能便越好,尤其是在功耗较低的移动设备上。

配置动态压缩

您可以在传送请求的路由上启用动态压缩。

准备工作

执行以下操作:

为路由规则启用动态压缩

默认情况下,路由规则的压缩模式处于停用状态。

将模式设置为“自动”可为每个符合条件的响应启用动态压缩。此外,它还会指示 Media CDN 自动选择最佳压缩算法。

如需启用动态压缩,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中,前往 Media CDN 页面。

    转到“媒体 CDN”

  2. 如需打开要为其配置路由规则的服务的详情 页面,请点击服务名称。

  3. 如需切换到修改模式,请点击修改 按钮。

  4. 如需前往路由 部分,请点击下一步 。

  5. 如需修改主机规则,请点击箭头将其展开。

  6. 如需修改路由规则,请点击相应行中的 “修改”图标。

  7. 在修改路由规则 窗格中,点击高级配置 。

  8. 可选:对于路由操作 ,添加CDN 政策 项。

    借助 CDN 政策,Media CDN 可以将内容压缩一次并传送多次,从而节省带宽并加快传送速度。

  9. 在动态压缩 部分中,选择启用压缩 。

  10. 如需保存路由规则,请点击保存 。

  11. 如需将更改保存到服务,请点击更新服务 。

gcloud 和 YAML

  1. 将 Media CDN 配置 导出到 YAML 文件。使用 gcloud edge-cache services export 命令。

    gcloud edge-cache services export SERVICE_NAME \
        --destination=FILENAME.yaml
    

    替换以下内容:

    • SERVICE_NAME:服务的名称
    • FILENAME:YAML 文件的名称
  2. 在 YAML 文件中的路由定义内,在 routeAction 下,将 compressionMode 设置为 AUTOMATIC,如以下示例所示:

    routing:
    hostRules:
    - hosts:
      - media.example.com
      pathMatcher: routes
    pathMatchers:
    - name: routes
      routeRules:
        - priority: 2
    origin: origin1
    matchRules:
    - pathTemplateMatch: "/**.m3u8" # HLS playlists
    - pathTemplateMatch: "/**.mpd" # DASH manifests
    routeAction:
      cdnPolicy:
        defaultTtl: 5s
      compressionMode: AUTOMATIC
    
  3. 如需更新服务,请从 YAML 文件 导入 Media CDN 配置。使用 gcloud edge-cache services import 命令。

    gcloud edge-cache services import SERVICE_NAME \
        --source=FILENAME.yaml
    

Terraform

以下 Terraform 代码段显示了已启用动态压缩的路由规则。

route_rule {
  description = "a route rule with dynamic compression, priority=2 (high)"
  priority    = 2
  match_rule {
    path_template_match = "/**.m3u8" # HLS playlists
  }
  match_rule {
    path_template_match = "/**.mpd" # DASH manifests
  }
  origin = google_network_services_edge_cache_origin.default.name
  route_action {
    cdn_policy {
      cache_mode = "FORCE_CACHE_ALL"
      client_ttl = "300s"
    }
    compression_mode = "AUTOMATIC"
  }
  header_action {
    response_header_to_add {
      header_name  = "x-cache-status"
      header_value = "{cdn_cache_status}"
    }
  }
}

您的配置很快就会传播到所有边缘位置。

为路由启用动态压缩且新配置在生产机器中生效后,即使存在未压缩的缓存版本,Media CDN 也会开始压缩符合条件的响应。在 Media CDN 提取和压缩新内容时,您源站的流量可能会暂时出现峰值。

为路由规则停用动态压缩

如需停用动态压缩,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中,前往 Media CDN 页面。

    转到“媒体 CDN”

  2. 如需打开要为其配置路由规则的服务的详情 页面,请点击服务名称。

  3. 如需切换到修改模式,请点击修改 按钮。

  4. 如需前往路由 部分,请点击下一步 。

  5. 如需修改主机规则,请点击箭头将其展开。

  6. 如需修改路由规则,请点击相应行中的 “修改”图标。

  7. 在修改路由规则 窗格中,点击高级配置 。

  8. 在动态压缩 部分中,取消选择启用压缩 。

  9. 如需保存路由规则,请点击保存 。

  10. 如需将更改保存到服务,请点击更新服务 。

gcloud 和 YAML

  1. 将 Media CDN 配置 导出到 YAML 文件。使用 gcloud edge-cache services export 命令。

    gcloud edge-cache services export SERVICE_NAME \
        --destination=FILENAME.yaml
    

    替换以下内容:

    • SERVICE_NAME:服务的名称
    • FILENAME:YAML 文件的名称
  2. 在 YAML 文件中的路由定义内,将 compressionMode 设置为 DISABLED。

  3. 如需更新服务,请从 YAML 文件 导入 Media CDN 配置。使用 gcloud edge-cache services import 命令。

    gcloud edge-cache services import SERVICE_NAME \
        --source=FILENAME.yaml
    

如果您在特定路由的动态压缩方面遇到问题,例如与某些客户端(例如智能电视或流媒体设备)的兼容性问题,如需阻止 Media CDN 在该路由上传送压缩内容,请停用动态压缩。

为路由停用动态压缩会导致 Media CDN 停止从缓存传送压缩内容。所有之前缓存的压缩响应都会失效,CDN 会从您的源站提取未压缩的版本。

可压缩内容类型

根据 Content-Type HTTP 响应标头,动态压缩会应用于以下 MIME 类型。没有 Content-Type 标头的响应不会被压缩。

常见的内容类型及其 MIME 类型如下:

  • HTML 内容:text/html
  • 样式表:text/css
  • JavaScript:application/javascript
  • JSON:application/json
  • HLS 播放列表:application/x-mpegURL 或 application/vnd.apple.mpegURL
  • DASH 清单:application/dash+xml

下表汇总了 MIME 类型对可压缩性的影响。

  可压缩的 MIME 类型
完全匹配 application/csv
application/javascript
application/json
application/json+protobuf
application/signed-exchange
application/wasm
application/x-javascript
application/x-nacl
application/x-plist
application/x-pnacl
application/x-protobuf
application/x-protobuffer
application/x-sdch-dictionary
application/xml
audio/mpeg网址
font/eot
font/otf
font/ttf
image/pwg-raster
image/svg+xml
image/vnd.microsoft.icon
image/x-icon
video/vnd.mpeg.dash.mpd
模式匹配 application/*+json
application/*+xml
application/*mpeg网址
text/*

图片和视频格式(例如 image/jpeg、image/png 和 video/mpeg4)几乎总是处于已压缩状态。因此 Media CDN 不会对其进行压缩。重新压缩已压缩过的响应通常不会再进一步减小该文件的大小,反而可能会导致客户端在收到此类响应时出现意外行为。

不可压缩的响应

Media CDN 不会压缩具有以下一个或多个特征的响应:

  • 响应没有与Content-Type标头匹配的 可压缩内容类型。
  • 响应没有 Content-Length 标头。
  • 响应具有 Content-Encoding 标头。这意味着源站已压缩响应。因此,Media CDN 不得进行任何额外的动态压缩。
  • 响应小于 1 KiB。

    在这种情况下,压缩和解压缩所花费的时间通常会抵消该操作所能带来的益处; 而且由于压缩内容极小,这也会导致压缩效率和压缩比降低。

  • 响应大于 1 MiB。

    Media CDN 会压缩响应,直到达到允许缓存对象而不进行字节范围缓存的大小。

  • 响应具有 Cache-Control: no-transform 标头。

日志记录和监控

启用压缩后,edgecache.googleapis.com/EdgeCacheRouteRule 下的现有 https/response_bytes_count 指标会报告压缩后的响应大小。预计可压缩内容的响应字节总数和出站数据传输吞吐量会下降。

Media CDN 日志在 jsonPayload 中包含一个 compressionAlgorithmApplied 字段,该字段指示响应是否已被负载均衡器压缩以及相应的压缩类型。

{
  insertId: "1c02hw9g3gjay67"
  jsonPayload: {
    @type: "type.googleapis.com/google.cloud.edgecache.v1.EdgeCacheLogEntry",
    cacheId: "IAD-862d661f",
    cacheStatus": "hit,stale",
    compressionAlgorithmApplied: "br"
  },
}

结算

如果通过 Media CDN 压缩响应,相关的出站缓存或互联网数据传输费用将根据发送到客户端的最终压缩字节数计算。

如果您传送大量可压缩响应,这会降低每月出站数据传输费用,并为最终用户提高性能。

后续步骤