本页面介绍如何使用 Cloud CDN 提供过时的过期内容。如果来源服务器无法访问或向 Cloud CDN 返回错误,Google Cloud 的全球缓存就可以继续传送内容。
这样做的原因如下:
- 您希望向用户提供过时的内容,而不是向用户返回错误。
- 如果缓存收到刚刚过期的内容的请求,提供过时内容可避免延迟。缓存无需等待后端的同步重新验证,而是传送刚刚过期的过时内容,同时触发单独的重新验证。
要启用此行为,您的后端可以在响应 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 控制台中,转到负载均衡页面。
- 点击外部应用负载均衡器的名称。
- 点击 修改。
- 对于后端配置,选择一个后端,然后点击 修改。
- 确保选择启用 Cloud CDN。
- 在窗口底部,点击高级配置。
- 对于其他 CDN 选项,请为在服务过时时提供选择以下选项之一:
- 1 分钟
- 5 分钟
- 10 分钟
- 30 分钟
- 1 天(建议)
- 7 天
- 点击更新。
- 再次点击更新。
gcloud
对于后端存储分区,请使用带有 --serve-while-stale
标志的 gcloud compute backend-buckets
create
命令或 gcloud compute backend-buckets
update
命令。
对于后端服务,请使用带有 --serve-while-stale
标志的 gcloud compute backend-services
create
命令或 gcloud compute backend-services
update
命令。
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 控制台中,转到负载均衡页面。
- 点击外部应用负载均衡器的名称。
- 点击 修改。
- 对于后端配置,选择一个后端,然后点击 修改。
- 确保未选中启用 Cloud CDN。
- 在窗口底部,点击高级配置。
- 依次选择其他 CDN 选项 > 在过时的情况下传送,然后选择在过时的情况下停用服务。
- 点击更新。
- 再次点击更新。
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 }