传送过时内容

本页面介绍如何使用 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-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 控制台中,转到负载均衡页面。

    进入“负载均衡”

  2. 点击外部应用负载均衡器的名称。
  3. 点击修改
  4. 后端配置部分,选择一个后端,然后点击 修改
  5. 确保选择启用 Cloud CDN
  6. 在窗口底部,点击高级配置
  7. 对于其他 CDN 选项,请为在服务过时时提供选择以下选项之一:
    • 1 分钟
    • 5 分钟
    • 10 分钟
    • 30 分钟
    • 1 天(建议)
    • 7 天
  8. 点击更新
  9. 再次点击更新

gcloud

对于后端存储分区,请使用 gcloud compute backend-buckets create 命令gcloud compute backend-buckets update 命令--serve-while-stale

对于后端服务,请使用带有 --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.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 控制台中,转到负载均衡页面。

    进入“负载均衡”

  2. 点击外部应用负载均衡器的名称。
  3. 点击修改
  4. 对于后端配置,选择一个后端,然后点击 修改
  5. 确保未选中启用 Cloud CDN
  6. 在窗口底部,点击高级配置
  7. 依次选择其他 CDN 选项 > 在过时的情况下传送,然后选择在过时的情况下停用服务
  8. 点击更新
  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
}