更改 TTL 设置和替换

本页面介绍如何使用 Cloud CDN 更改 TTL 替换。通过 TTL 替换,您可以精细控制 Cloud CDN 在将内容缓存多长时间后进行重新验证。

下表总结了 TTL 设置。

  默认 TTL TTL 上限 客户端 TTL
配置原因 提高不频繁更改的内容的缓存命中率 强制 Cloud CDN 以高于源站标头指定的频率重新验证内容 强制客户端更频繁地针对 Cloud CDN 重新验证内容
使用条件 对于成功的响应,满足以下任一条件:
  • 缓存模式 = FORCE_CACHE_ALL
  • 缓存模式 = CACHE_ALL_STATIC,content-type 可静态缓存,并且 TTL 不是由源站标头(max-ages-maxageExpires)设置
同时满足以下所有条件:
  • 缓存模式 = CACHE_ALL_STATIC
  • TTL 由源站标头(max-ages-maxageExpires)设置
  • 源站标头中指定的 TTL 大于最大 TTL 值
满足以下任一条件:
  • 缓存模式 = FORCE_CACHE_ALL,并且客户端 TTL 值小于 Cloud CDN 的 TTL
  • 缓存模式 = CACHE_ALL_STATIC,并且客户端 TTL 小于由源站标头设置的 TTL(如果没有源站标头信息,则小于默认 TTL)
默认值 3600 秒(1 小时) 86400 秒(1 天) 3600 秒(1 小时)
允许的最大值 31622400 秒(1 年) 31622400 秒(1 年) 31622400 秒(1 年)
Notes 必须小于或等于最大 TTL

--default-ttl=0
强制在源站重新验证响应
必须少于或等于最大 TTL

准备工作

  • 了解缓存模式

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

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

    gcloud components update
    

设置默认 TTL

如需提高不频繁更改的内容的缓存命中率,您可以替换默认 TTL,以降低 Cloud CDN 在源站对内容进行重新验证的频率。请注意,不常访问的对象可能会在定义的 TTL 之前从缓存中逐出。

如果缓存模式为 FORCE_CACHE_ALL,则默认 TTL 会覆盖所有响应中设置的 TTL(包括由源站标头设置 TTL 的响应)。在此模式下,客户端可以查看默认的 TTL,因为 Cloud CDN 会设置传送给客户端的响应的 publicmax-age 特性。

对于 CACHE_ALL_STATIC 模式,默认 TTL 适用于源站针对当前不具有有效 TTL(max-ages-maxageExpires 标头)的响应传送的缓存内容。在 CACHE_ALL_STATIC 模式下,默认 TTL 不会修改传送给客户端的 Cache-Control 标头。如需在 CACHE_ALL_STATIC 模式下修改 Cache-Control 标头,您必须设置客户端 TTL

将缓存模式设置为使用源站标头 (USE_ORIGIN_HEADERS) 时,默认 TTL 值未应用且无法设置,因为 Cloud CDN 改为使用 max-ages-maxage 源站指令或 Expires 标头。

控制台

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

    进入“负载均衡”

  2. 点击外部应用负载均衡器的名称。
  3. 点击修改
  4. 后端配置中,选择一个后端,然后点击修改
  5. 确保选择启用 Cloud CDN
  6. 确保缓存模式为缓存静态内容(推荐)强制缓存所有内容。如果缓存模式为使用基于 Cache-Control 标头的源站设置,则系统不支持替换 TTL 值。
  7. 默认存留时间下,选择一个值。
  8. 点击保存

gcloud

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

对于后端存储分区,请使用带有 --default-ttl 标志的 gcloud compute backend-buckets creategcloud compute backend-buckets update 命令。

gcloud compute backend-services (create | update) BACKEND_SERVICE_NAME
    --default-ttl=DEFAULT_TTL
gcloud compute backend-buckets (create | update) BACKEND_BUCKET_NAME
    --default-ttl=DEFAULT_TTL

DEFAULT_TTL 替换为不超过 31622400 秒(1 年)的值。

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": {
  "defaultTtl": DEFAULT_TTL
}

DEFAULT_TTL 替换为不超过 31622400 秒(1 年)的值。

设置最长 TTL

最大 (max) TTL 指定由 Cloud CDN 对来源传送的缓存内容允许的最大 TTL。

如果满足以下任一条件,响应的 TTL 将受到最大 TTL 的限制:

  • 响应尝试设置 max-ages-maxage 高于 TTL 值。
  • 响应的 Expires 标头未来超过 cdnPolicy.maxTtl 秒。

最大 TTL 设置不会更改发送给客户端的 max-age 值;如需了解详情,请参阅替换客户端 TTL 上限。最大 TTL 设置仅影响 Cloud CDN 尝试缓存内容的时间。

此设置仅在缓存模式为 CACHE_ALL_STATIC 时使用。允许的最大值为 31622400 秒(1 年)。请注意,不常访问的对象可能会在定义的 TTL 之前从缓存中逐出。

对于 FORCE_CACHE_ALL,TTL 始终设置为默认 TTL;无法设置 TTL。

控制台

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

    进入“负载均衡”

  2. 点击外部应用负载均衡器的名称。
  3. 点击修改
  4. 后端配置中,选择一个后端,然后点击修改
  5. 确保选择启用 Cloud CDN
  6. 确保缓存模式为缓存静态内容(推荐)
  7. 最长存留时间下,选择一个值。
  8. 点击保存

gcloud

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

对于后端存储分区,请使用带有 --max-ttl 标志的 gcloud compute backend-buckets creategcloud compute backend-buckets update 命令。

gcloud compute backend-services (create | update) BACKEND_SERVICE_NAME
    --max-ttl=MAX_TTL
gcloud compute backend-buckets (create | update) BACKEND_BUCKET_NAME
    --max-ttl=MAX_TTL

MAX_TTL 替换为不超过 31622400 秒(1 年)的值。

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": {
  "maxTtl": MAX_TTL
}

MAX_TTL 替换为不超过 31622400 秒(1 年)的值。

替换客户端 TTL

对于所有缓存模式,Cloud CDN 都会将 Cache-Control 标头传递给客户端。

借助客户端 TTL,您可以为发送到客户端或客户端的内容设置最大 TTL,这样客户端就可以更频繁地针对 Cloud CDN 重新验证内容,而无需在来源执行重新验证。这样,相应内容就在 Cloud CDN 中可以根据需要失效,并且客户端可以发现内容在客户端 TTL 到期后立即失效。

FORCE_CACHE_ALL 模式下,Cloud CDN 通常会将同一 max-age 传递到其用于代理缓存的客户端;但是,如果指定了客户端 TTL 且值较小,则系统会将客户端 TTL 传递给 max-age 指令中的客户端。同样,在 CACHE_ALL_STATIC 模式下,客户端 TTL 充当源服务器指定任何 max-age 的支架,这样发送到浏览器或客户端的 max-age 就不会大于配置的客户端 TTL。如果源站未指定 max-age,则 Cloud CDN 的 TTL 和客户端 TTL 值中的较小值会用作发送到浏览器或客户端的 max-age

如果源响应中存在 Expires 标头,则标头将被移除,并替换为一个具有适当 TTL 的 Cache-Control: max-age 指令。 对于错误响应,如果未设置负缓存 TTL,则 Cache-Control 标头也会被移除。

由于客户端 TTL 被视为发送到浏览器或客户端的内容的最大值,因此它不能用于增加本应发送的 max-age 值。如果发送到浏览器和客户端的 max-age 值低于您的预期,您必须增加源站返回的响应中的 max-age 指令值,或相应地调整默认 TTL负缓存设置。

通常,大约为一天的客户端 TTL 是一个比较实用的上限。设置为一天意味着浏览器至少以该频率进行检查,并且可以了解 Cloud CDN 中可能发生的缓存失效操作。您可以将客户端 TTL 设置为远高于此的值(最长可达一年),从而允许源站和配置的 TTL 完全控制发送到客户端的内容。如果您不希望浏览器针对 Cloud CDN 执行更频繁的验证,这将非常有用。

控制台

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

    进入“负载均衡”

  2. 点击外部应用负载均衡器的名称。
  3. 点击修改
  4. 后端配置中,选择一个后端,然后点击修改
  5. 确保选择启用 Cloud CDN
  6. 确保缓存模式为缓存静态内容(推荐)强制缓存所有内容。如果缓存模式为使用基于 Cache-Control 标头的源站设置,则系统不支持替换 TTL 值。
  7. 客户端存留时间下,选择一个不超过 1 年的值。
  8. 点击保存

gcloud

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

对于后端存储分区,请使用带有 --client-ttl 标志的 gcloud compute backend-buckets creategcloud compute backend-buckets update 命令。

gcloud compute backend-services (create | update) BACKEND_SERVICE_NAME
    --client-ttl=CLIENT_TTL
gcloud compute backend-buckets (create | update) BACKEND_BUCKET_NAME
    --client-ttl=CLIENT_TTL

CLIENT_TTL 替换为不超过 31622400 秒(1 年)的值。

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": {
  "clientTtl": CLIENT_TTL
}

CLIENT_TTL 替换为不超过 31622400 秒(1 年)的值。

后续步骤