使用负缓存

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

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

准备工作

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

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

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

    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 421 误发请求 60 秒
HTTP 451 由于法律原因而无法使用 120 秒
HTTP 501 未实现 60 秒

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

设置负缓存

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

控制台

  1. 在 Google Cloud Console 中,转到负载平衡页面。

    转到“负载平衡”页面

  2. 点击外部 HTTP(S) 负载平衡器的名称。
  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

对于每个状态代码,您可以指定缓存响应的秒数。如果省略 TTL 字段,则系统会停用状态代码的负缓存。

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

如果缓存模式设置为 CACHE_ALL_STATICUSE_ORIGIN_HEADERS,则负缓存会应用于具有指定响应代码且缺少任何 cache-controlexpires 标头的响应。如果缓存模式设置为 FORCE_CACHE_ALL,则负缓存会应用于具有指定响应代码的所有响应,并替换任何缓存标头。

停用负缓存

控制台

  1. 在 Google Cloud Console 中,转到负载平衡页面。

    转到“负载平衡”页面

  2. 点击外部 HTTP(S) 负载平衡器的名称。
  3. 点击修改
  4. 后端配置中,选择一个后端,然后点击修改
  5. 确保选择启用 Cloud CDN
  6. 在窗口底部,点击高级配置
  7. 点击启用负缓存
  8. 删除所有负缓存政策。
  9. 取消选中启用负缓存旁边的复选框。
  10. 点击更新
  11. 再次点击更新

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
}