使用负缓存

本页面介绍了如何将负缓存与 Cloud CDN 搭配使用。借助负缓存,您可以为每个状态代码设置不同的 TTL。

这样做的原因是针对常见错误或重定向应用精细缓存控制。这可减少来源的负载,并通过缩短响应延迟时间来提升最终用户体验。

准备工作

  • 了解缓存模式和静态内容

  • 确保已启用 Cloud CDN;如需了解相关说明,请参阅使用 Cloud CDN

  • 如有必要,请更新到 Google Cloud CLI 的最新版本:

    gcloud components update
    

状态代码和默认 TTL

负缓存适用于下表中列出的特定状态代码。

Cloud CDN 会将以下默认 TTL 应用于这些状态代码:

状态代码 含义 TTL
HTTP 300 多种选择 10 分钟
HTTP 301 和 308 永久重定向 10 分钟
HTTP 302 和 307 临时重定向 默认不缓存
HTTP 404 未找到 120 秒
HTTP 405 找不到方法 60 秒
HTTP 410 已不存在 120 秒
HTTP 451 由于法律原因而无法使用 120 秒
HTTP 501 未实现 60 秒

您可以替换这些默认值,方法是使用负缓存为指定的 HTTP 状态代码设置缓存 TTL。

设置负缓存

借助负缓存,您可以将服务配置为缓存失败和成功的响应。这样一来,Cloud CDN 就可以防止来自生成错误(例如,404 Not Found)的请求的来源,其使用与防止收到成功响应的请求一样。

控制台

  1. 在 Google Cloud 控制台中,前往负载均衡页面。

    转到“负载均衡”页面

  2. 点击外部应用负载均衡器的名称。
  3. 点击修改
  4. 后端配置中,选择一个后端,然后点击修改
  5. 确保选择启用 Cloud CDN
  6. 在窗口底部,点击高级配置
  7. 点击启用负缓存
  8. 点击添加否定缓存政策
    1. 输入 HTTP 状态代码
    2. 选择缓存存留时间 (TTL)
  9. 点击更新
  10. 再次点击更新

gcloud

对于后端存储桶,请使用带有 --negative-caching 标志的 gcloud compute backend-buckets creategcloud compute backend-buckets update 命令。

对于后端服务,请使用带有 --negative-caching 标志的 gcloud compute backend-services creategcloud compute backend-services update 命令。

gcloud compute backend-buckets (create | update) BACKEND_BUCKET_NAME
    --negative-caching
gcloud compute backend-services (create | update) BACKEND_SERVICE_NAME
    --negative-caching

例如,如需仅启用两个特定错误响应的负缓存,请将状态代码为 404 的响应设置为缓存 60 秒,将状态代码为 405 的响应设置为缓存 120 秒。

gcloud compute backend-services update BACKEND_SERVICE_NAME \
    --negative-caching \
    --cache-mode=CACHE_ALL_STATIC \
    --default-ttl=86400 \
    --negative-caching-policy='404=60,405=120'

api

对于后端存储桶,请使用方法:backendBuckets.insert方法:backendBuckets.update API 调用。

对于后端服务,请使用方法:backendServices.insert方法: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": {
  "negativeCaching": ON,
  "negativeCachingPolicy": [
    {
      "code": STATUS_CODE,
      "ttl": TTL_SECONDS
    }
  ]
}

您必须启用负缓存才能配置 negativeCachingPolicy 设置。如果您省略政策并启用 negativeCaching,则 Cloud CDN 会使用状态代码和默认 TTL 中列出的默认值。

指定负缓存政策时,请务必为您要缓存的所有响应代码指定缓存 TTL。如果存在政策,则 Cloud CDN 不会应用任何默认的负缓存。

对于 STATUS_CODE,您可以指定以下 HTTP 状态代码:

  • 300301302307308
  • 404405410421451
  • 501

对于每个状态代码,您可以指定缓存响应的秒数。如需为状态代码停用负缓存,请从负缓存政策中排除该代码。

系统允许的最大值为 1800 秒(30 分钟);但是,不常访问的对象可能会在定义的 TTL 之前从缓存中逐出。

如果缓存模式设置为 CACHE_ALL_STATICUSE_ORIGIN_HEADERS,则负缓存会应用于具有指定响应代码且缺少任何 Cache-ControlExpires 标头的响应。

如果缓存模式设置为 FORCE_CACHE_ALL,则负缓存会替换源站设置的任何缓存标头,并且 Cloud CDN 将在 TTL 指定的时间段内缓存响应,或者如果未设置 TTL,则完全不缓存。

此外,当缓存模式设置为 FORCE_CACHE_ALL 时,Cloud CDN 还会修改 Cache-Control 标头中发送到客户端的 max-age。特别是,如果给定错误具有已配置的 TTL 设置,则 Cloud CDN 将采用该 TTL 设置和 client_ttl 配置设置中的较小值,并发送包含该值的 Cache-Control: public,max-age=N 标头。如果给定错误没有配置的 TTL 设置,Cloud CDN 将移除源站发送的任何 Cache-Control 标头。Cloud CDN 也会始终移除源站发送的任何 Expires 标头。

如果源站最初启用了负缓存,但后来停用了(手动或通过停用针对特定响应代码的缓存)停用,则缓存的错误响应仅根据其 Cache-ControlExpires 标头被视为有效。因此,停用负缓存后,标头中不含缓存年龄指令的响应将不会从缓存中提供。

Cloud CDN 会缓存数据以响应 GET 请求。如需了解详情,请参阅可缓存的内容

每个缓存条目由缓存键标识。

停用负缓存

控制台

  1. 在 Google Cloud 控制台中,前往负载均衡页面。

    转到“负载均衡”页面

  2. 点击外部应用负载均衡器的名称。
  3. 点击修改
  4. 后端配置中,选择一个后端,然后点击修改
  5. 确保选择启用 Cloud CDN
  6. 在窗口底部,点击高级配置
  7. 取消选中启用负缓存旁边的复选框。
  8. 点击更新
  9. 再次点击更新

gcloud

对于后端存储桶,请使用带有 --no-negative-caching 标志的 gcloud compute backend-buckets creategcloud compute backend-buckets update 命令。

对于后端服务,请使用带有 --no-negative-caching 标志的 gcloud compute backend-services creategcloud compute backend-services update 命令。

gcloud compute backend-services (create | update) (BACKEND_SERVICE_NAME | BACKEND_BUCKET_NAME)
    --no-negative-caching

api

对于后端存储桶,请使用方法:backendBuckets.insert方法:backendBuckets.update API 调用。

对于后端服务,请使用方法:backendServices.insert方法: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": {
  "negativeCaching": OFF
}