启用动态压缩

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

这种大小上的缩减也会缩短下载内容所需花费的时间。对于样式表 (CSS)、脚本 (JavaScript) 和视频清单 (HLS/DASH) 等重要资源,这样可以缩短网页加载和视频启动时间。

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

您可以在后端服务或后端存储桶上启用压缩。

实际使用示例

动态压缩直接减小了从 Cloud CDN 边缘发送到客户端的数据的大小。这将直接带来以下益处:

  • 减小 CSS 和 JavaScript 内容的大小,帮助网页更快地呈现,并缩短首次内容渲染(一个重要的网页性能指标)的时间。
  • 缓存 REST API 响应(例如 JSON 载荷)时优势明显。由于存在重复的键、空格和大括号,因此这些载荷能够很好地进行压缩。将公共 API 缓存 5 到 10 秒是现在的一种流行做法,可以在减少来源负载的同时保持数据新鲜度。

    即使没有进行这样的缓存,通过压缩这些响应也可以将发送的总字节数减少高达 90%。

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

须知事项

确保您满足以下要求:

  • 配置了启用 Cloud CDN 的后端。如果您尚未配置 Cloud CDN,则可遵循相应的设置指南进行配置。
  • 您的后端具有可供传送的可压缩内容,例如介于 1 KiB 到 10 MiB(含边界值)之间的 Web 资源或视频清单。
  • 客户端不依赖于使用范围请求强 ETag 提取部分内容。动态压缩不支持这些特性。
  • 客户端可以处理没有 Content-Length 标头的响应。例如,Cloud CDN 压缩的缓存未命中没有 Content-Length 标头。
  • 您拥有更改后端配置所需的 IAM Compute Load Balancer Admin 角色 (roles/compute.loadBalancerAdmin)。

在后端服务或后端存储桶上启用压缩

如需启用压缩,请按以下步骤操作。

控制台

添加新来源

如需添加和设置新的来源,请按照设置概览中针对相应后端类型的说明操作。创建源时,请使用高级选项部分,在压缩模式列表中选择自动以配置动态压缩。

修改现有来源

如需修改现有 Cloud CDN 来源,请执行以下操作:

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

    前往“来源”页面

  2. 点击要修改的来源名称,然后点击修改

  3. 来源基础信息部分中,点击下一步

  4. 主机和路径规则部分,点击下一步

  5. 缓存性能部分中,转到高级选项

  6. 压缩模式列表中,选择自动

  7. 如需应用更改,请点击完成

gcloud

对于后端服务,请使用带有 --compression-mode 标志的 gcloud compute backend-services create 命令gcloud compute backend-services update 命令

对于后端存储桶,请将 gcloud compute backend-buckets create 命令gcloud compute backend-buckets update 命令--compression-mode 标志结合使用。

对于新的后端服务,请使用 create 命令:

gcloud compute backend-services create BACKEND_SERVICE_NAME \
    --compression-mode=AUTOMATIC

对于现有后端服务,请使用 update 命令:

gcloud compute backend-services update BACKEND_SERVICE_NAME \
    --compression-mode=AUTOMATIC

对于新的后端存储桶,请使用 create 命令:

gcloud compute backend-buckets create BACKEND_BUCKET_NAME
    --compression-mode=AUTOMATIC

对于现有后端存储桶,请使用 update 命令:

gcloud compute backend-buckets update BACKEND_BUCKET_NAME
    --compression-mode=AUTOMATIC

compression-mode 可以是下列选项之一:

  • AUTOMATIC:根据客户端发送的 Accept-Encoding 标头自动使用最佳压缩。在大多数情况下,优先采用 Brotli 压缩。
  • DISABLED(默认):停用压缩。

API

对于后端服务,请使用 backendServices.insert 方法backendServices.update 方法

对于后端存储桶,请使用 backendBuckets.insert 方法backendBuckets.update 方法

请使用以下命令之一:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices
PUT https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets
PUT https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets/BACKEND_BUCKET

将以下代码段添加到 JSON 请求正文:

"compressionMode": AUTOMATIC

compression-mode 可以是下列选项之一:

  • AUTOMATIC(推荐):根据客户端发送的 Accept-Encoding 标头自动使用最佳压缩。在大多数情况下,优先采用 Brotli 压缩。
  • DISABLED(默认):停用压缩。

您的配置会在几分钟内传播到所有边缘位置。从后端传送的可压缩内容在传送给客户端之前会被压缩。

压缩模式

默认压缩模式为 DISABLED

AUTOMATIC 模式允许 Cloud CDN 根据以下内容选择最佳压缩方法:

  • 客户端接受的编码
  • 响应的预期压缩比
  • Cloud CDN 的压缩速度(吞吐量)

与 gzip 相比,Brotli 可将大多数内容类型的下载大小再减少 10% 到 20%,并且具有类似的解压缩性能,如果考虑客户端上的下载时间和压缩速度,那么 Brotli 的整体速度较快

Cloud CDN 在响应的 Content-Encoding 标头中指示所选压缩方法为 gzipbrotli

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

当 Cloud CDN 最初压缩内容时,它会从响应中移除 Content-Length 标头;这对于尽快传送响应是必要的,因为在完整响应被压缩之前,完整的内容长度是未知的。响应被压缩和缓存后,Cloud CDN 可能会在后续响应中包括 Content-Length 标头。(对于 HTTP/1.1 及更早版本,Cloud CDN 不使用 Content-Length 时会在响应中使用 Transfer-Encoding: chunked。)

响应何时会被压缩?

如果请求的 Accept-Encoding 标头明确列出了对 gzip 或 Brotli 算法的支持,则从后端(源)传送的未压缩响应(具有与可压缩内容类型匹配的 Content-Type 标头)将相应地使用 gzip 或 Brotli 进行压缩。如果请求没有 Accept-Encoding 标头,或者具有 Accept-Encoding: *,则响应不会被压缩。

例如,如果客户端请求中有 Accept-Encoding 标头,则会根据下表中的信息压缩(或不压缩)响应:

Accept-Encoding 请求标头 响应编码
gzip, compress, br Brotli (br)
deflate 不压缩
deflate, gzip gzip
identity 不压缩
* 不压缩

可压缩内容类型

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

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

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

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

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

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

响应何时不会被压缩?

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

  • 响应没有与可压缩内容类型匹配的 Content-Type 标头。
  • 没有 Content-Length 标头。
  • 该响应具有 Content-Encoding 标头。
  • 小于 1 KiB。

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

  • 大于 10 MiB。

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

  • 该响应具有 Vary: Accept-Encoding 标头。

范围请求

当 Cloud CDN 压缩响应时,Cloud CDN 会添加 Accept-Ranges: none 标头,并替换任何现有 Accept-Ranges 标头。此类响应的缓存命中会忽略 Range 标头。

这样便可以防止向客户端传送不正确的部分内容,因为没有办法确定客户端到底是希望收到经过压缩还是未经压缩的资源的某一字节范围。

ETag

根据 RFC 7232 第 2.3 节的要求,在动态压缩对响应进行压缩时,任何强 ETag 标头都会被弱化。例如,ETag: "xyzzy" 已替换为 ETag: W/"xyzzy"

Vary 标头

在传送有压缩可能的响应时(具体取决于请求),Cloud CDN 会将 Vary: Accept-Encoding 标头添加到响应中。

回答变更摘要

下表总结了 Cloud CDN 在发生压缩时对响应标头所做的更改:

响应标头 压缩后的标头值
Content-Encoding 设置为 gzipbrotli
ETag 所有强实体标记都会替换为弱版本,以 W/ 前缀表示。
Accept-Ranges 设置为值 none
Content-Length 可能会完全移除,如果存在,则设置为压缩后的正文内容的长度。
Transfer-Encoding 对于 HTTP/1.1 及更早协议,如果 Cloud CDN 移除了 Content-Length,则会添加此标头(将其值设置为 chunked),并对响应的正文进行分块。

日志记录

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

{
  insertId: "1c02hw9g3gjay67"
  jsonPayload: {
    @type: "type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry"
    statusDetails: "response_sent_by_backend"
    cacheId: "IAD-862d661f"
    compressionStatus: "br"
  }
}

结算

如果通过 Cloud CDN 或 Cloud Load Balancing 压缩响应,相关的出站缓存数据传输或出站互联网数据传输会分别根据发送到客户端的最终压缩字节数进行计量。

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

指标

启用压缩后,loadbalancing.googleapis.com 下的现有 https/response_bytes_count 指标会报告压缩后的响应大小。

预计响应字节总数及出站数据传输吞吐量均会下降。

如果您传送大量基于文本的内容(如 HTML、CSS、JavaScript 或 JSON),由于这些内容能够很好地进行压缩,因此响应字节数会大幅下降。

如需了解详情,请参阅 Monitoring

后续步骤