GCP-CDN自动压缩介绍
Cloud CDN自动压缩介绍:
动态压缩使 Cloud CDN 能够在来源端与客户端之间传送响应时自动压缩这些响应内容。缩小传输文件大小,提升文件传输效率,减少带宽消耗,节省开销。通常,通过网络发送的数据大小会减少 60% 到 85%。
文档:https://cloud.google.com/cdn/docs/dynamic-compression#compression-modes
注:Brotli压缩的性能比Gzip压缩提升约15%~25%,暂不支持Brotli。
使用限制:
- 您的后端具有可供传送的可压缩内容,例如介于 1 KiB 到 10 MiB(含边界值)之间的 Web 资源或视频清单。
- 确保客户端不依赖于通过范围请求或强 ETag 提取部分内容。动态压缩不支持这些特性。
- 在后端启用动态压缩后,范围支持会被停用:
Range
和If-Range
标头会从所有请求中移除。Accept-Ranges: bytes
标头会从所有响应中移除。
这样便可以防止向客户端传送不正确的部分内容,因为没有办法确定客户端到底是希望收到经过压缩还是未经压缩的资源的某一字节范围。
- 根据 RFC 7232 第 2.3 节的要求,在动态压缩对响应进行压缩时,任何强 ETag 标头都会被弱化。例如,
ETag: xyzzy
已替换为ETag: W/xyzzy
。 - 如果响应有压缩的可能(具体取决于请求),则该响应会传送至具有
Vary: Accept-Encoding
标头的客户端。
响应何时会被压缩?
目前仅支持 gzip 压缩。如果客户端的 Accept-Encoding
编码列表中包含 gzip
,Cloud CDN 会使用 gzip 来压缩响应;否则,Cloud CDN 不会压缩响应。
目前,只有可缓存的响应会被压缩。
可压缩类型:https://cloud.google.com/cdn/docs/dynamic-compression#compressible-content
响应何时不会被压缩?
当响应具有以下一个或多个特征时,动态压缩便不会压缩该响应:
- 没有与可压缩内容类型匹配的
Content-Type
标头 - 没有
Content-Length
标头 - 小于 1 KiB
在这种情况下,压缩和解压缩所花费的时间通常会抵消该操作所能带来的益处;而且由于压缩内容极小,这也会导致压缩效率降低(即压缩比降低)。
- 大于 10 MiB
- 包含
Cache-Control: no-transform
指令
使用方法:
动态压缩默认关闭,需要通过gcloud或api启用,暂不支持控制台操作。
gcloud方法如下:
对于新的后端服务,请使用 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
注:
- 若bucket无法启用,可尝试beta方法试下:
gcloud beta compute backend-buckets update BACKEND_BUCKET_NAME --compression-mode=AUTOMATIC
- compression-mode 可以是下列选项之一:
AUTOMATIC:自动压缩内容。
DISABLED(默认):停用压缩。
- 配置会在几分钟内传播到所有边缘位置。从后端传送的可压缩内容在传送给客户端之前会被压缩。
测试结果:
-
测试一:
[wanggaoli@WangGaoli:] ~ $ curl –H “accept-encoding: gzip, deflate, br” http://test.wanggaoli.com/a.js -voa >> /dev/null
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 —:—:— —:—:— —:—:— 0* Trying 34.98.119.180:80…
* Connected to 34.98.119.180 (34.98.119.180) port 80 (#0)
> GET /a.js HTTP/1.1
> Host: 34.98.119.180
> User–Agent: curl/7.79.1
> Accept: */*
> accept-encoding: gzip, deflate, br
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< X-GUploader-UploadID: ADPycdvce_xQcwHMkYs6zvCAy1UmqDkBDA2R5ICmXaWDhFMErnEoJ6HdClhV6CKiolojonXENXFfQgtz1RXmaywxbk0R5Q
< Date: Fri, 20 May 2022 12:57:23 GMT
< Last-Modified: Fri, 20 May 2022 08:47:55 GMT
< ETag: W/”7cf12dedb01701ce6c6f50667ee12825″
< x-goog-generation: 1653036475786628
< x-goog-metageneration: 2
< x-goog-stored-content-encoding: identity
< x-goog-stored-content-length: 249734
< Content-Type: application/javascript
< x-goog-hash: crc32c=eK6ikQ==
< x-goog-hash: md5=fPEt7bAXAc5sb1BmfuEoJQ==
< x-goog-storage-class: STANDARD
< Accept-Ranges: none
< Server: UploadServer
< Vary: Accept-Encoding
< Content-Encoding: gzip
< Cache-Control: public,max-age=10
< cdn_cache_status: miss
< Transfer-Encoding: chunked
<
{ [1916 bytes data]
100 4184 0 4184 0 0 16507 0 –:–:– –:–:– –:–:– 16939
* Connection #0 to host 34.98.119.180 left intact
-
测试二:
[wanggaoli@WangGaoli:] ~ $ curl --compressed http://test.wanggaoli.com/a.js -voa >> /dev/null
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Trying 34.98.119.180:80...
* Connected to 34.98.119.180 (34.98.119.180) port 80 (#0)
> GET /a.js HTTP/1.1
> Host: 34.98.119.180
> User-Agent: curl/7.79.1
> Accept: */*
> Accept-Encoding: deflate, gzip
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< X-GUploader-UploadID: ADPycdsOHk4Gbr-bPehZgJTUxhjqjdnmFNIQjHCrzVSoh6hnzhmK3IF2vMNDNMjwwTmQ8LSBKG8UW8h5zVVdXrD3Xf9m9fPliU_J
< Date: Fri, 20 May 2022 13:08:10 GMT
< Last-Modified: Fri, 20 May 2022 08:47:55 GMT
< ETag: W/7cf12dedb01701ce6c6f50667ee12825
< x-goog-generation: 1653036475786628
< x-goog-metageneration: 4
< x-goog-stored-content-encoding: identity
< x-goog-stored-content-length: 249734
< Content-Type: application/javascript
< x-goog-hash: crc32c=eK6ikQ==
< x-goog-hash: md5=fPEt7bAXAc5sb1BmfuEoJQ==
< x-goog-storage-class: STANDARD
< Accept-Ranges: none
< Server: UploadServer
< Vary: Accept-Encoding
< Content-Encoding: gzip
< Cache-Control: public,max-age=10
< cdn_cache_status: miss
< Transfer-Encoding: chunked
<
{ [1579 bytes data]
100 4160 0 4160 0 0 15667 0 --:--:-- --:--:-- --:--:-- 16124
* Connection #0 to host 34.98.119.180 left intact
-
测试三:实现部分文件不压缩,可通过cache-control的no-transform实现。
[wanggaoli@WangGaoli:] ~ $ curl -H accept-encoding: gzip, deflate, br http://test.wanggaoli.com/a.js -voa >> /dev/null
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Trying 34.98.119.180:80…
Connected to 34.98.119.180 (34.98.119.180) port 80 (#0)
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0> GET /a.js HTTP/1.1
> Host: 34.98.119.180
> User-Agent: curl/7.79.1
> Accept: /
> accept-encoding: gzip, deflate, br
>
Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< X-GUploader-UploadID: ADPycdvOK5l7W-HTJbsyMaMh71bLHannxXzMhBgT64XDcnwn4KlWib7m3WgLd-7P1xNCI84TtWfcQO04vaWZqjTdiyNfMMGhgm7x
< x-goog-generation: 1653036475786628
< x-goog-metageneration: 3
< x-goog-stored-content-encoding: identity
< x-goog-stored-content-length: 249734
< x-goog-hash: crc32c=eK6ikQ==
< x-goog-hash: md5=fPEt7bAXAc5sb1BmfuEoJQ==
< x-goog-storage-class: STANDARD
< Accept-Ranges: bytes
< Content-Length: 249734
< Server: UploadServer
< Date: Fri, 20 May 2022 13:04:06 GMT
< Age: 2
< Last-Modified: Fri, 20 May 2022 08:47:55 GMT
< ETag: 7cf12dedb01701ce6c6f50667ee12825
< Content-Type: application/javascript
< Cache-Control: public,max-age=10,no-transform
< cdn_cache_status: hit
<
{ [3500 bytes data]
100 243k 100 243k 0 0 694k 0 --:--:-- --:--:-- --:--:-- 708k
Connection #0 to host 34.98.119.180 left intact
-
测试四:浏览器请求,显示cl字段,为压缩后大小
其他:
通过curl测试发现资源被压缩,但没有content-length头;通过浏览器访问时,偶尔有content-length头。