本頁面說明如何使用 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-age、s-maxage 或 Expires 標頭定義。詳情請參閱「到期時間和驗證要求」。
如果 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
在重新驗證時提供過時內容
控制台
- 前往 Google Cloud 控制台的「Load balancing」(負載平衡) 頁面。
- 按一下外部應用程式負載平衡器的名稱。
- 按一下「Edit」(編輯)。
- 在「Backend configuration」(後端設定) 中選取後端,然後按一下「Edit」(編輯)。
- 確認已選取「Enable Cloud CDN」(啟用 Cloud CDN)。
- 按一下視窗底部的「Advanced configurations」(進階設定)。
- 在「Additional CDN options」(其他 CDN 選項),為「Serve while stale」(網頁無回應時顯示過時內容) 選取下列其中一個選項:
- 1 分鐘
- 5 分鐘
- 10 分鐘
- 30 分鐘
- 1 天 (建議)
- 7 天
- 按一下「Update」(更新)。
- 再按一下「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.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」(負載平衡) 頁面。
- 按一下外部應用程式負載平衡器的名稱。
- 按一下「Edit」(編輯)。
- 在「Backend configuration」(後端設定) 中選取後端,然後按一下「Edit」(編輯)。
- 確認未選取「Enable Cloud CDN」(啟用 Cloud CDN)。
- 按一下視窗底部的「Advanced configurations」(進階設定)。
- 依序選取「Additional CDN options」(其他 CDN 選項) >「Serve while stale」(網頁無回應時顯示過時內容),然後選取「Disable serve while stale」(停用「過時即提供」)。
- 按一下「Update」(更新)。
- 再按一下「Update」(更新)。
gcloud
如為後端 bucket,請使用 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
如為後端 bucket,請使用 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
}