動態壓縮功能會自動壓縮 Cloud CDN 提供的回應。一般來說,透過網路傳送的資料大小會縮減 60% 至 85%。
一旦縮減資料大小,下載內容所需的時間就會縮短。對於樣式表 (CSS)、指令碼 (JavaScript) 和影片資訊清單 (HTTP 即時串流/DASH) 等重要資產,這項功能可縮短網頁載入和影片播放時間。
如要進一步瞭解壓縮回應的好處,請參閱「網站基礎知識指南」。
您可以在後端服務或後端 bucket 中啟用壓縮功能。
應用實例
動態壓縮功能可直接縮減從 Cloud CDN 邊緣傳送至用戶端的資料大小,這樣就能直接執行下列操作:
- 縮減 CSS 和 JavaScript 的大小,有助於加快網頁算繪速度,並縮短 First Contentful Paint 時間,這是重要的網站成效指標。
快取 REST API 回應 (例如 JSON 酬載) 時,會產生巨大的正面影響。這些酬載含有重複的鍵、空白字元和大括號,因此壓縮效果良好。快取公用 API 5 到 10 秒是常見的做法,可減少來源負載並維持資料即時性。
即使沒有使用快取,壓縮這些回應也能減少最多 90% 傳送的總位元組數。
縮短影片的播放開始時間,以及即時串流的加入延遲時間。大型即時播放清單 (資訊清單) 含有大量重複資料,包括每個區段的主機 + 路徑前置字元,以及 HTTP 即時串流或 DASH 播放清單中繼資料。只要播放清單越快載入,或是相關更新越快下載,用戶端就能越快解析並開始下載參照影片片段。HTTP 即時串流和 DASH 播放清單的總大小通常會縮減超過 90%。
事前準備
請確認您已具備以下條件:
- 已設定啟用 Cloud CDN 的後端。如尚未設定 Cloud CDN,請按照任一設定指南進行。
- 後端已準備好提供可壓縮的內容,例如介於 1 KiB 到 10 MiB (含) 之間的網頁素材資源或影片資訊清單。
- 用戶端不會依賴範圍要求或強式 ETag 擷取部分內容。這些機制與動態壓縮並不相容。
- 用戶端可處理不含
Content-Length標頭的回應。舉例來說,Cloud CDN 壓縮的快取失敗項目不會有Content-Length標頭。 - 具備 IAM Compute 負載平衡器管理員角色 (
roles/compute.loadBalancerAdmin),這是變更後端設定所需的角色。
在後端服務或後端 bucket 中啟用壓縮功能
如要啟用壓縮功能,請按照下列步驟操作。
控制台
新增來源
如要新增及設定來源,請按照設定總覽中的說明,根據適當的後端類型完成設定。建立來源時,請前往「Advanced options」(進階選項) 部分,在「Compression mode」(壓縮模式) 清單中選取「Automatic」(自動),即可設定動態壓縮。
編輯現有來源
如要編輯現有 Cloud CDN 來源,請按照下列步驟操作:
前往 Google Cloud 控制台的 Cloud CDN「Origins」(來源) 頁面。
按一下要編輯的來源名稱,然後點選「Edit」(編輯)。
在「Origin basics」(來源基本資訊) 部分,點選「Next」(下一步)。
在「Host and path rules」(主機與路徑規則) 部分,點選「Next」(下一步)。
在「Cache performance」(快取效能) 部分,前往「Advanced options」(進階選項)。
在「Compression mode」(壓縮模式) 清單中,選取「Automatic」(自動)。
按一下「Done」(完成) 即可套用變更。
gcloud
如為後端服務,請使用 gcloud compute backend-services
create 指令或 gcloud compute backend-services
update 指令,並加上 --compression-mode 旗標。
如為後端 bucket,請使用 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
如為新的後端 bucket,請使用 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 方法。
如為後端 bucket,請使用 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。
Cloud CDN 若採用 AUTOMATIC 模式,便可根據下列因素選擇最佳壓縮方法:
- 用戶端接受的編碼
- 回應的預期壓縮比率
- Cloud CDN 的壓縮速度 (處理量)
相較於 Gzip,Brotli 可為大多數內容類型額外縮減 10% 至 20% 的下載資料大小,並提供類似的解壓縮效能,因此在考量到下載時間「和」用戶端的解壓縮速度時,整體速度會更快。
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 - HTTP 即時串流播放清單:
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 壓縮回應時,會新增 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),回應位元組可能會大幅減少。
詳情請參閱「監控」。
後續步驟
- 如要瞭解快取模式如何讓內容快取更輕鬆,請參閱「變更快取模式」。
- 如要為 HTTP(S) 達到負載平衡的執行個體和儲存空間 bucket 啟用 Cloud CDN,請參閱「設定總覽」。
- 如要瞭解如何撤銷快取,請參閱「快取撤銷總覽」。
- 如要查看 GFE 網路連接點,請參閱「快取位置」。