使用负缓存

本页面介绍了如何将负缓存与 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 create 或 gcloud compute backend-buckets update 命令。

对于后端服务,请使用带有 --negative-caching 标志的 gcloud compute backend-services create 或 gcloud 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 状态代码:

  • 300、301、302、307、308
  • 404、405、410、421、451
  • 501

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

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

如果缓存模式设置为 CACHE_ALL_STATIC 或 USE_ORIGIN_HEADERS,则负缓存会应用于具有特定 HTTP 状态代码(例如 404、501、502 或 503)的响应。这些负面响应的缓存时长由以下优先规则确定:

  • 如果来自源站的负面响应包含 explicit Cache-Control 或 Expires 响应标头,Cloud CDN 将按照这些标头指定的时长缓存该负面响应。

    例如,如果您的源站返回带有 Cache-Control: public,max-age=60 设置的 404 Not Found,则该 404 状态代码会被缓存 60 秒,并且针对该特定请求,系统会忽略负缓存政策。

  • 如果来自源站的负面响应没有任何 Cache-Control 或 Expires 标头,Cloud CDN 会应用配置的负缓存政策 TTL。例如,如果您的源站返回不带任何缓存标头的 404 Not Found,则系统会根据针对 404 status code 在 cdnPolicy.negativeCachingPolicy 中指定的 TTL 来缓存该响应。

如果缓存模式设置为 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-Control 或 Expires 标头时才会被视为有效。因此,停用负缓存后,标头中没有缓存存在时间指令的响应将不会从缓存中传送。

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

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

停用负缓存

控制台

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

    转到“负载平衡”页面

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

gcloud

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

对于后端服务,请使用带有 --no-negative-caching 标志的 gcloud compute backend-services create 或 gcloud 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
}