啟用動態壓縮

動態壓縮功能會自動壓縮 Cloud CDN 提供的回應。透過網路傳送的資料大小會減少 60% 至 85% (一般情況)。

縮減大小後,下載內容所需的時間就會縮短。對於樣式表單 (CSS)、指令碼 (JavaScript) 和影片資訊清單 (HLS/DASH) 等重要資產,這項功能可縮短網頁載入和影片開始播放的時間。

如要進一步瞭解壓縮回應的好處,請參閱Web 基礎知識指南

您可以在後端服務或後端值區中啟用壓縮功能。

應用實例

動態壓縮功能可直接縮減從 Cloud CDN 邊緣傳送至用戶端的資料大小。這可以直接執行以下操作:

  • 縮減 CSS 和 JavaScript 的大小,有助於加快網頁的算繪速度,並縮短第一個內容繪製的時間,這項指標是重要的網站效能指標。
  • 在快取 REST API 回應 (例如 JSON 酬載) 時,會產生巨大的正面影響。由於這些酬載含有重複的鍵、空格和大括號,因此壓縮效果良好。將公開 API 快取 5 到 10 秒,是減少來源負載並維持資料新鮮度的熱門做法。

    即使未啟用快取,壓縮這些回應也能將傳送的總位元組數減少最多 90%。

  • 改善影片提交的播放開始時間,以及即時串流的加入延遲時間。大型即時播放清單 (資訊清單) 含有大量重複資料,包括每個區段的主機 + 路徑前置字串,以及 HLS 或 DASH 播放清單中繼資料。播放清單載入速度越快,或播放清單更新可下載的速度越快,用戶端等待解析並開始下載參照的影片片段所需的時間就越短。HLS 和 DASH 播放清單的總大小通常會減少 90% 以上。

事前準備

請確認您已備妥下列項目:

  • 已設定啟用 Cloud CDN 的後端。如果您尚未設定 Cloud CDN,可以按照設定指南中的任一步驟進行。
  • 後端已準備好可壓縮的內容,例如 1 KiB 到 10 MiB (含) 之間的網頁素材資源或影片資訊清單。
  • 用戶端不會依賴範圍要求強式 ETag來擷取部分內容。這些與動態壓縮不相容。
  • 用戶端可處理不含 Content-Length 標頭的回應。舉例來說,Cloud CDN 壓縮的快取遺漏資料不會有 Content-Length 標頭。
  • IAM Compute 負載平衡器管理員角色 (roles/compute.loadBalancerAdmin),這是變更後端設定時所需的角色。

為後端服務或後端值區啟用壓縮功能

如要啟用壓縮功能,請按照下列步驟操作。

控制台

新增來源

如要新增及設定新來源,請按照設定總覽中適當類型的後端操作說明進行。建立來源時,請使用「進階選項」部分,在「壓縮模式」清單中選取「自動」,藉此設定動態壓縮功能。

編輯現有來源

如要編輯現有的 Cloud CDN 來源,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的 Cloud CDN「Origins」頁面。

    前往「Origins」

  2. 按一下要編輯的來源名稱,然後點選「編輯」

  3. 在「Origin 基本資訊」部分,按一下「Next」

  4. 在「Host and path rules」部分,按一下「Next」

  5. 在「Cache performance」(快取效能) 部分,前往「Advanced options」(進階選項)

  6. 在「Compression mode」清單中,選取「Automatic」

  7. 如要套用變更,請按一下「完成」

gcloud

針對後端服務,請使用 gcloud compute backend-services create 指令gcloud compute backend-services update 指令,並加上 --compression-mode 旗標。

如要使用後端資料集,請使用 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

如果是現有的後端 bucket,請使用 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% 的下載大小,並提供類似的解壓縮效能,因此在考量下載時間和用戶端的解壓縮速度時,整體速度會更快。

Cloud CDN 會在回應的 Content-Encoding 標頭中,將所選的壓縮方法標示為 gzipbrotli

Cloud CDN 會判斷壓縮等級,以平衡用戶端的總下載大小和 CPU 成本。較高的壓縮等級不一定能提升效能,特別是在效能較低的行動裝置上。

當 Cloud CDN 初始壓縮內容時,會從回應中移除 Content-Length 標頭;這是必要的,因為在整個回應壓縮完成前,完整內容長度是未知的。回應經過壓縮及快取後,Cloud CDN 可能會在後續回應中加入 Content-Length 標頭。(對於 HTTP/1.1 及更早版本,Cloud CDN 會在回應中使用 Transfer-Encoding: chunked,但不會使用 Content-Length)。

回覆內容何時會經過壓縮?

如果要求含有 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 在壓縮發生時,對回應標頭所做的變更:

回應標頭 壓縮後的標頭值
內容編碼 設為 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),回應位元組可能會大幅減少。

詳情請參閱「監控」。

後續步驟

  • 如要瞭解快取模式如何讓快取內容更輕鬆,請參閱「變更快取模式」。
  • 如要為 HTTP(S) 負載平衡執行個體和儲存空間值區啟用 Cloud CDN,請參閱設定總覽
  • 如要瞭解如何撤銷快取,請參閱「快取撤銷總覽」。
  • 如要查看 GFE 點播點,請參閱「快取位置」。