本頁面提供有關透過 Cloud CDN 提供過時內容的資訊。當無法存取來源伺服器或來源伺服器傳回錯誤給 Cloud CDN 時,您可以透過提供過時內容,讓 Google 的全球快取繼續提供內容。
原因如下:
- 您會選擇為使用者提供過時的內容,而非傳回錯誤。
- 當快取收到剛過期的內容要求時,提供過時的內容可避免延遲。無須等待後端的同步重新驗證,快取會提供剛過期的陳舊內容,同時觸發個別的重新驗證。
如要啟用這項行為,後端可以在回應 Cache-Control
標頭中指定 stale-while-revalidate
指令。在快取項目到期後,Cloud CDN 會在指定秒數內從快取 (如有) 提供該內容。Cloud CDN 會以非同步方式,重新驗證來源的內容。
Cloud CDN 會透過 cdnPolicy.serveWhileStale
設定代表您啟用這項功能。這項設定會決定 Cloud CDN 在回應過期後,可繼續提供舊版多久。如果回應中未指定其他值,則為 86400s
(1 天)。
Cloud CDN 不支援 stale-if-error
指令。除非與後端的同步重新驗證失敗,並顯示特定錯誤狀態碼,否則此指令會指示快取避免放送過時的內容。
預設、最小和最大值如下:
- 預設:86,400 秒 (一天)
- 最小值:0 秒 (停用功能)
- 上限:604,800 秒 (一週)
過期快取項目的指定限制,是指快取項目到期時間過後的指定限制,由 max-age
、s-maxage
或 Expires
標頭定義。詳情請參閱「到期時間和驗證要求」。
如果 Cloud CDN 邊緣快取沒有快取的物件副本可提供過時內容,或是物件已達到逾期 TTL 上限,Cloud CDN 會同步使用來源重新驗證內容。如果來源在該時間點傳回錯誤,Cloud CDN 就會傳回來源錯誤。
記錄和使用者代理程式
Cloud CDN 發出的非同步要求會顯示在原始伺服器中,就像在未提供過時的內容時發生的正常重新驗證要求一樣。例外狀況是,這些項目會標示為含有 Cloud-CDN-Google
的 User-Agent
標頭。
非同步要求也會個別記錄至 Cloud Logging,因此提供過時內容的使用者要求會產生兩個記錄項目:第一個項目是實際提供給使用者的內容,第二個項目是針對來源的重新驗證要求。與同步重新驗證一樣,Cloud CDN 可能會在某些情況下傳送條件要求,或無條件重新要求內容。無論是哪種情況,記錄到 Cloud Logging 的回應代碼都會對應至對 Cloud CDN 的原始要求,例如,如果是無條件要求,就會是 200 OK
;如果使用者原始回應為條件式,則會是 304 Not Modified
。
用戶端 max-stale
要求指令
用戶端可以指定 max-stale
快取控制指令,要求較短的過時服務時間。如果指定此指令,系統會控管用戶端容許的舊資料量。
如果快取的內容比用戶端的 max-stale
值更舊,Cloud CDN 會在提供內容前重新驗證內容。
用戶端無法要求的 max-stale
值大於使用 serve-while-stale
設定選項和來源的 stale-while-revalidate
快取控制指示設定的值。
事前準備
請參閱快取模式和靜態內容。
請確認已啟用 Cloud CDN。如需操作說明,請參閱「使用 Cloud CDN」。
視需要更新至最新版 Google Cloud CLI:
gcloud components update
在重新驗證時提供過時內容
控制台
- 前往 Google Cloud 控制台的「Load balancing」(負載平衡) 頁面。
- 按一下外部應用程式負載平衡器的名稱。
- 按一下「編輯」圖示 。
- 針對「後端設定」,選取後端,然後按一下 「編輯」。
- 確認已選取「Enable Cloud CDN」。
- 按一下視窗底部的「進階設定」。
- 在「其他 CDN 選項」中,選取「服務過時內容」的下列任一選項:
- 1 分鐘
- 5 分鐘
- 10 分鐘
- 30 分鐘
- 1 天 (建議)
- 7 天
- 按一下 [Update]。
- 再次按一下「更新」。
gcloud
如要使用後端資料集,請使用 gcloud compute backend-buckets
create
指令或 gcloud compute backend-buckets
update
指令,並加上 --serve-while-stale
旗標。
如為後端服務,請使用 gcloud compute backend-services
create
指令或 gcloud compute backend-services
update
指令,並加上 --serve-while-stale
標記。
gcloud compute backend-buckets (create | update) BACKEND_BUCKET_NAME --serve-while-stale=SECONDS
gcloud compute backend-services (create | update) BACKEND_SERVICE_NAME --serve-while-stale=SECONDS
例如:
gcloud compute backend-services update my-backend-service --serve-while-stale=180s
API
如要使用後端資料集,請使用 Method: backendBuckets.insert
或 Method: backendBuckets.update
API 呼叫。
如為後端服務,請使用 Method: backendServices.insert
或 Method: backendServices.update
API 呼叫。
請使用下列其中一個 API 呼叫:
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 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
將下列程式碼片段新增至 JSON 要求主體:
"cdnPolicy": { "serveWhileStale": SECONDS }
停用提供過時內容
控制台
- 前往 Google Cloud 控制台的「Load balancing」(負載平衡) 頁面。
- 按一下外部應用程式負載平衡器的名稱。
- 按一下「編輯」圖示 。
- 針對「後端設定」,選取後端,然後按一下 「編輯」。
- 確認未選取「Enable Cloud CDN」。
- 按一下視窗底部的「進階設定」。
- 依序前往「其他 CDN 選項」>「在失效時提供」,然後選取「停用在失效時提供」。
- 按一下 [Update]。
- 再次按一下「更新」。
gcloud
如要使用後端值集,請使用 gcloud compute backend-buckets
create
或 gcloud compute backend-buckets
update
指令,並將 --serve-while-stale
旗標值設為 0
。
針對後端服務,請使用 gcloud compute backend-services
create
指令或 gcloud compute backend-services
update
指令,並將 --serve-while-stale
標記值設為 0
。
gcloud compute backend-services (create | update) (BACKEND_SERVICE_NAME | BACKEND_BUCKET_NAME) --serve-while-stale=0
API
如要使用後端資料集,請使用 Method: backendBuckets.insert
或 Method: backendBuckets.update
API 呼叫。
如為後端服務,請使用 Method: backendServices.insert
或 Method: backendServices.update
API 呼叫。
請使用下列其中一個 API 呼叫:
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 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
將以下程式碼片段新增至 JSON 要求主體:
"cdnPolicy": { "serveWhileStale": 0 }