内容分发最佳实践

本页面介绍使用 Cloud CDN 优化和加速内容分发的最佳做法。 本部分分为几个关键区域。

Cloud CDN 使用外部应用负载均衡器作为可缓存内容的来源。外部应用负载平衡器可以通过一个全球 IP 地址,从以下类型的后端向用户传送混合静态和动态创建内容的数据。

由于 Cloud CDN 与 Google Cloud 无缝集成,因此您可以通过多种方式部署 Cloud CDN 并管理内容。请使用此处列出的最佳做法来计划和优化您的部署。 如需了解详情,请参阅设置 Cloud CDN

优化缓存命中率

以下推荐做法有助于优化缓存命中率。

缓存静态内容

为提高性能,在启用 Cloud CDN 时,您需要为应用选择合适的缓存模式。

管理缓存规则的最灵活且通常首选的方法是使用缓存控制标头。如果您不熟悉如何使用源缓存控制标头,则最佳做法建议是允许 Cloud CDN 自动缓存静态内容。

如需从源站自动缓存静态响应,您可以使用 --cache-mode=CACHE_ALL_STATIC 设置(默认)。如果来源未在响应标头中指定任何缓存指令,则此设置允许 Cloud CDN 缓存常见的静态内容类型。确保您的内容与概述的类别匹配:否则,内容不会缓存。

不缓存特定于用户的内容

在某些情况下,浏览器可以缓存特定于用户的内容。请勿使用 Cloud CDN 缓存特定于用户的内容。

使用自定义缓存键来提高缓存命中率

为了提高性能和可伸缩性,请务必优化缓存命中率。默认情况下,Cloud CDN 使用完整的请求网址来构建缓存键。为了帮助优化缓存命中率,您可以使用自定义缓存键,以免 Cloud CDN 不必要地对缓存进行分片。

Cloud CDN 键值对存储(点击可放大)。

自定义缓存键可让您包含或省略协议、主机或查询字符串的任一组合。以下是一些何时可以使用自定义缓存键的示例:

  • 您有两个主机,这两个主机解析为同一 IP 地址并转到同一服务。在这个例子中,两个主机上的整个网站都是相同的。默认情况下,Cloud CDN 会缓存两个副本,因为 HTTP 请求中具有不同的 Host: 标头。借助自定义缓存键,您可以让 Cloud CDN 忽略请求的主机部分并共享缓存条目。

  • 举一个更具体的例子,您可能在不同的网域上有两个网站,这两个网站使用相同的徽标。网站内容不同,但您在两个网域中使用相同的公司徽标,并且拥有一个用于保存共享内容的专用后端服务。当您为拥有该徽标的后端服务开启 Cloud CDN 并自定义缓存键时,请取消选中主机复选框,这样一来,缓存会忽略该网域,但会缓存该徽标。

  • 无论是通过 HTTP 还是 HTTPS 显示徽标,都需要对该徽标进行缓存。当您为拥有该徽标的后端服务自定义缓存键时,请清除协议复选框,使得通过 HTTP 和 HTTPS 传送的请求被统计为徽标缓存条目的匹配项。

如需了解如何自定义缓存键,请参阅使用缓存键

优化性能

以下推荐做法有助于优化性能。

确保已启用 HTTP/3 和 QUIC 协议支持

HTTP/3 是新一代互联网协议。它基于原始 Google QUIC (gQUIC) 协议开发的 QUIC 协议构建。外部 HTTP(S) 负载均衡器、Cloud CDN 和客户端之间支持 HTTP/3。

如需使用 Cloud CDN 提高性能,请确保启用 HTTP/3

使用负缓存

借助负缓存,您可以对常见错误或重定向进行精细控制。当 Cloud CDN 遇到特定的响应代码时,它会在缓存中存储该响应的设定 TTL。这可减少来源的负载,并通过缩短响应延迟时间来提升最终用户体验。

优化安全性

以下推荐做法有助于优化安全性。

使用 Google Cloud Armor

Google Cloud Armor 与 Cloud CDN 集成,用于缓存非缓存或缓存未命中内容。最佳做法建议尽可能将 Google Cloud Armor 与 Cloud CDN 结合使用,以提高 Web 应用的安全性。

使用签名网址。

如果您使用的是签名网址,请注意以下事项:

  • 将公开和私有内容保存在不同的 Cloud Storage 存储分区中。

  • 遵循安全最佳做法

对专用源站进行身份验证

源站身份验证提供强大的保证,以确保请求仅来自您配置的后端服务。它还为请求提供传输数据保护,并防止重复使用请求的签名部分。

我们建议对 Amazon S3 存储桶或兼容对象存储区使用专用源站身份验证。专用源站身份验证有助于确保只有受信任的连接才能访问您的专用源站上的内容,并且用户无法直接访问它们。

此外,如果源站防火墙阻止对源站的访问,请使用 IP 许可名单来确保请求来自 Cloud CDN 或外部应用负载均衡器。但是,这不会阻止其他媒体 CDN 客户通过在其配置中指定您的源站来访问您的内容。

优化缓存

以下推荐做法有助于优化缓存。

优化缓存 TTL

您可以设置或替换 TTL,以微调 Cloud CDN 缓存响应的时长以及 Cloud CDN 重新验证响应的时间。

您还可以定义面向客户端的 TTL,以便充分利用浏览器缓存。

如需了解详情,请参阅使用 TTL 设置和替换

为时间敏感内容设置过期时间

Cloud CDN 缓存中的每项内容都有一个关联的过期时间,请务必设置适合您的用例的过期时间。由于源服务器必须重新发送缓存服务器上过期的内容,因此您需要谨慎选择过期时间。

要选择过期时间,一种方法是根据您更新内容的频率对内容进行分类,例如:

  • 近乎实时更新,例如体育赛事或交通运输的实时反馈
  • 频繁更新,例如每周、每日或每小时的天气信息或头版新闻图片
  • 不常更新,例如网站徽标或者 CSS 或 JavaScript 文件

接下来,按内容类别选择过期时间。例如,五秒的过期时间可能适用于近乎实时的体育赛事比分,一小时的过期时间则可能适用于天气动态。对于存储在 Cloud Storage 中的内容,请使用 Cache-Control 元数据设置过期时间。内容由 Compute Engine 传送时,您可以通过配置 Web 服务器软件来控制过期时间。

过期时间由 Cache-Control 标头中的 max-ages-maxage 值指定。此标头由 HTTP 规范定义。例如,以下 Cache-Control 标头使相关内容可被公开读取并缓存,缓存过期时间为 72 小时(259200 秒):

  Cache-Control: public, max-age=259200

要最大程度增加缓存,请按照缓存概览中的准则进行操作。切记,Cache-Control 元数据字段中的 max-ages-maxage 值通过以下方式配合使用:

  • max-ages-maxage 值以秒为单位进行衡量。
  • s-maxage 值仅适用于共享缓存,不适用于浏览器缓存。
  • max-age 值适用于所有缓存,除非 s-maxage 将其替换。

对于频繁更改的内容或必须随相关内容一起更改的内容,建议您结合使用较长的过期时间以及具有版本控制的网址

使用具有版本控制的网址更新内容

通过对内容进行版本控制,您可以传送同一内容的不同版本,这样一来,您可以在缓存条目过期之前向用户显示新内容,并有效地移除旧内容。由于版本控制功能不收取任何费用,因此我们建议您使用版本控制功能作为更新可缓存内容的默认方法。

要对内容进行版本控制,请在网址中添加一个参数,例如版本号。 您可以通过多种方法在网址中包含参数,例如:

  • 添加查询字符串:file.ext?v=100

    对于后端存储桶,必须在后端存储桶配置中指定用于版本控制的任何查询字符串。如需了解详情,请参阅 Cloud Storage 缓存键的查询字符串包含列表

  • 更改文件名:file.1.0.0.extfile_v100.ext

  • 更改路径:/v100/file.ext

当您添加参数时,您将更改文件的名称和网址。此更改会强制缓存忽略所有现有缓存条目。

谨慎使用失效操作来移除内容

在缓存条目过期之前,失效操作会从 Cloud CDN 分布式缓存服务器中移除内容。失效操作具有最终一致性。

我们建议您谨慎使用失效操作,您只能将此操作用作最后的补救手段。 例如,当您因法律原因或意外上传而必须移除内容时,失效操作十分有用。 其他情况下,我们建议您尽可能使用版本控制功能,或等待内容正常到期。 Cloud CDN 缓存服务器通常会逐出不常访问的内容,以便为新内容腾出空间。如果某项内容未被访问的时间达到 30 天,系统会无条件将其删除。

缓存失效操作的速率受限

如需详细了解失效操作,请参阅缓存失效操作概览

优化上传文件的一致性

以下推荐做法有助于优化文件上传的一致性。

避免更新现有文件

请上传新版本,而不是更新现有文件。

对于新文件,请使用可包含版本号或日期的唯一名称。将版本号(例如 file_v2.css)或日期(例如 file_20230806.js)附加到文件名有助于确保 Cloud CDN 提取正确的更新版本。不建议将参数附加到文件网址(例如 file.css?v=2)以强制提取新版本,因为此方法无法解决缓存非原子源文件更新的风险,其中仍可能会缓存部分或不完整的文件。

请务必先上传依赖项的新版本,然后再上传引用这些依赖项的文件。此做法有助于确保所有引用均指向已更新的完整文件,从而降低分块更新或截断文件的风险。

对文件进行原子更新

如有必要更新现有文件,请以原子方式进行更新。

如果在文件上传完成之前访问并缓存了文件,则该文件可能会被缓存为不完整或截断的文件。例如,某个文件(例如 /index.html)不能具有唯一名称,但可以指向具有唯一名称的其他文件。

以目标名称上传文件可能会导致在上传期间访问不完整的文件时,系统将其缓存。请改为使用临时名称上传文件,并在上传完成后再将其重命名为目标名称。此做法有助于确保文件在被引用时可立即完整提供。

更新现有文件时,字节范围缓存可能会导致 Cloud CDN 在上传新文件后保留旧文件的范围。如果 Cloud CDN 缓存了较早文件的范围,则请求缺失的块可能会导致部分响应。之所以会出现这种情况,是因为 Cloud CDN 检测到源文件已更改(因为 etaglast-modified 发生更改),会删除所有过时内容、断开所有正在进行的下载连接,并生成错误,从而提示客户端重试。为了缓解此问题,请针对正在更新的字节范围缓存文件发出失效通知。

优化 Monitoring 和 Logging

以下推荐做法有助于优化 Monitoring 和 Logging。

确保已为 Cloud CDN 启用日志记录

管理 Cloud CDN 的最佳做法是确保为所有已启用 Cloud CDN 的后端启用日志记录功能

使用适用于 Cloud CDN 的自定义监控信息中心

为了确保更高的可靠性和性能,最佳做法是定期查看与 Cloud CDN 相关的监控指标。您不妨从 Cloud CDN 自定义监控信息中心入手。

查看第三方性能测试

查看来自第三方提供商的报告,例如由 Citrix Radar 提供的可用性、延迟时间和吞吐量报告