提供過時內容

本頁面說明如何使用 Cloud CDN 提供過時或過期的內容。如果原始伺服器無法連線或傳回錯誤給 Cloud CDN,Google 的全球快取就會繼續提供過時內容。

這麼做的原因如下:

  • 偏好向使用者提供過時內容,而非傳回錯誤。
  • 當快取收到剛過期的內容要求時,提供過時內容可避免延遲。不必等待同步重新驗證後端,快取會提供剛過期的過時內容,同時觸發個別的重新驗證。

Cloud CDN 提供下列兩種方法,可控制在重新驗證要求傳送至來源時,過時物件的服務時間長度:

  • 在來源:您可以在回應標頭中指定 Cache-Control: stale-while-revalidate 指令。Cloud CDN 會遵守這項指令,在快取項目到期後,仍會提供過時內容一段時間 (以秒為單位)。在這段期間,Cloud CDN 會非同步傳送要求至來源,重新驗證及重新整理內容。

  • 透過政策:這是 Cloud CDN 的設定,可決定回應過期後,Cloud CDN 最多可繼續提供過時版本的時間。這項設定是使用 serve-while-stale 選項進行。如果回應中沒有 stale-while-revalidate 指令,系統就會使用這項設定。如未指定值,系統會使用預設值 86400s (1 天)。

Cloud CDN 不支援 stale-if-error 指令。這項指令會指示快取避免提供過時內容,除非與原始伺服器同步重新驗證失敗,並出現特定錯誤狀態碼。

預設值、最小值和最大值如下:

  • 預設值:86,400 秒 (一天)
  • 最小值:0 秒 (停用這項功能)
  • 最大值:604,800 秒 (一週)

系統會提供過時內容,直到超過快取項目到期時間的指定限制為止,而到期時間是由 max-ages-maxageExpires 標頭定義。詳情請參閱「到期時間和驗證要求」。

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

記錄和使用者代理程式

Cloud CDN 發出的非同步要求,在原始伺服器看來,與未提供過時內容時發出的正常重新驗證要求完全相同。但如果標記的 User-Agent 標頭包含 Cloud-CDN-Google,則為例外狀況。

非同步要求也會分別記錄到 Cloud Logging,因此提供過時內容的使用者要求會產生兩筆記錄:第一筆是實際提供給使用者的內容,第二筆是重新驗證來源的要求。與同步重新驗證一樣,Cloud CDN 可能會在某些情況下傳送條件式要求,或只是無條件重新要求內容。無論是哪種情況,記錄到 Cloud Logging 的回應代碼都會對應至 Cloud CDN 的原始要求;例如,無條件要求會傳回 200 OK,而使用者原始回應為條件式時,則會傳回 304 Not Modified

用戶端 max-stale 要求指令

用戶端可以指定 max-stale cache-control 指令,要求縮短過時服務時間。如果指定這項指令,即可控管用戶端可容許的陳舊程度。

如果快取內容比用戶端的 max-stale 值更過時,Cloud CDN 會先重新驗證內容,再提供服務。

用戶端要求的 max-stale 值不得大於使用 serve-while-stale 設定選項設定的值,以及來自來源的 stale-while-revalidate cache-control 指令。

事前準備

  • 瞭解快取模式和靜態內容

  • 確認已啟用 Cloud CDN;如需操作說明,請參閱「使用 Cloud CDN」。

  • 請視需要更新至最新版本的 Google Cloud CLI:

    gcloud components update
    

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

控制台

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

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

  2. 按一下外部應用程式負載平衡器的名稱。
  3. 按一下「Edit」(編輯)
  4. 在「Backend configuration」(後端設定) 中選取後端,然後按一下「Edit」(編輯)
  5. 確認已選取「Enable Cloud CDN」(啟用 Cloud CDN)
  6. 按一下視窗底部的「Advanced configurations」(進階設定)
  7. 在「Additional CDN options」(其他 CDN 選項),為「Serve while stale」(網頁無回應時顯示過時內容) 選取下列其中一個選項:
    • 1 分鐘
    • 5 分鐘
    • 10 分鐘
    • 30 分鐘
    • 1 天 (建議)
    • 7 天
  8. 按一下「Update」(更新)
  9. 再按一下「Update」(更新)

gcloud

如為後端 bucket,請使用 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

如為後端 bucket,請使用 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. 按一下「Edit」(編輯)
  4. 在「Backend configuration」(後端設定) 中選取後端,然後按一下「Edit」(編輯)
  5. 確認未選取「Enable Cloud CDN」(啟用 Cloud CDN)
  6. 按一下視窗底部的「Advanced configurations」(進階設定)
  7. 依序選取「Additional CDN options」(其他 CDN 選項) >「Serve while stale」(網頁無回應時顯示過時內容),然後選取「Disable serve while stale」(停用「過時即提供」)
  8. 按一下「Update」(更新)
  9. 再按一下「Update」(更新)

gcloud

如為後端 bucket,請使用 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

如為後端 bucket,請使用 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
}