动态压缩会自动压缩 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 来源,请执行以下操作:
在 Google Cloud 控制台中,前往 Cloud CDN 来源页面。
点击要修改的来源名称,然后点击修改。
在来源基础信息部分中,点击下一步。
在主机和路径规则部分,点击下一步。
在缓存性能部分中,转到高级选项。
在压缩模式列表中,选择自动。
如需应用更改,请点击完成。
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
标头中指示所选压缩方法为 gzip
或 brotli
。
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-mpegURL
或application/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/jpeg
、image/png
和 video/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 | 设置为 gzip 或 brotli。 |
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。
后续步骤
- 如需了解缓存模式如何使缓存内容变得更容易,请参阅更改缓存模式。
- 如需为 HTTP(S) 负载均衡实例和存储桶启用 Cloud CDN,请参阅设置概览。
- 如需了解如何使缓存失效,请参阅缓存失效操作概览。
- 如需查找 GFE 入网点,请参阅缓存位置。