提供過時內容

本頁面提供有關透過 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-ages-maxageExpires 標頭定義。詳情請參閱「到期時間和驗證要求」。

如果 Cloud CDN 邊緣快取沒有快取的物件副本可提供過時內容,或是物件已達到逾期 TTL 上限,Cloud CDN 會同步使用來源重新驗證內容。如果來源在該時間點傳回錯誤,Cloud CDN 就會傳回來源錯誤。

記錄和使用者代理程式

Cloud CDN 發出的非同步要求會顯示在原始伺服器中,就像在未提供過時的內容時發生的正常重新驗證要求一樣。例外狀況是,這些項目會標示為含有 Cloud-CDN-GoogleUser-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
    

在重新驗證時提供過時內容

控制台

  1. 前往 Google Cloud 控制台的「Load balancing」(負載平衡) 頁面。

    前往「Load balancing」(負載平衡) 頁面

  2. 按一下外部應用程式負載平衡器的名稱。
  3. 按一下「編輯」圖示
  4. 針對「後端設定」,選取後端,然後按一下 「編輯」
  5. 確認已選取「Enable Cloud CDN」
  6. 按一下視窗底部的「進階設定」
  7. 在「其他 CDN 選項」中,選取「服務過時內容」的下列任一選項:
    • 1 分鐘
    • 5 分鐘
    • 10 分鐘
    • 30 分鐘
    • 1 天 (建議)
    • 7 天
  8. 按一下 [Update]
  9. 再次按一下「更新」

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.insertMethod: backendBuckets.update API 呼叫。

如為後端服務,請使用 Method: backendServices.insertMethod: 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
}

停用提供過時內容

控制台

  1. 前往 Google Cloud 控制台的「Load balancing」(負載平衡) 頁面。

    前往「Load balancing」(負載平衡) 頁面

  2. 按一下外部應用程式負載平衡器的名稱。
  3. 按一下「編輯」圖示
  4. 針對「後端設定」,選取後端,然後按一下 「編輯」
  5. 確認未選取「Enable Cloud CDN」
  6. 按一下視窗底部的「進階設定」
  7. 依序前往「其他 CDN 選項」>「在失效時提供」,然後選取「停用在失效時提供」
  8. 按一下 [Update]
  9. 再次按一下「更新」

gcloud

如要使用後端值集,請使用 gcloud compute backend-buckets creategcloud 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.insertMethod: backendBuckets.update API 呼叫。

如為後端服務,請使用 Method: backendServices.insertMethod: 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
}