问题排查

了解问题排查步骤。如果您在使用 Cloud CDN 时遇到以下问题,这些问题排查步骤可能会派上用场。

常见问题和解决方案

响应没有被缓存

如果响应没有被缓存,请首先检查是否为后端服务或后端存储分区启用了 Cloud CDN。当您启用 Cloud CDN 时,可能需要等待几分钟时间,然后系统才能开始缓存响应。

Cloud CDN 仅缓存标记为公开的响应,并且这些响应需要指定过期时间或最长存在时间。HTTP 响应标头将传达这些信息。如果网址的响应没有被缓存,请检查为该网址返回了哪些标头。

您可以通过多种方法来检查响应标头:

以下示例演示了如何使用 curl 来检查 http://example.com/style.css 的 HTTP 响应标头:

$ curl -s -D - -o /dev/null http://example.com/style.css
HTTP/1.1 200 OK
Date: Tue, 16 Feb 2016 12:00:00 GMT
Content-Type: text/css
Content-Length: 1977
Via: 1.1 google

$

将这些标头与缓存详情中的要求进行比较后可以看出,响应缺少必要的 Cache-Control 标头。

设置标头的方法取决于源服务器的类型。如果您在 Google Compute Engine 上运行网络服务器,请参阅网络服务器软件的文档,了解有关配置响应标头的详细信息。对于 Google Cloud Storage,如果将对象标记为公开共享,则会发送相应的标头。

重新配置源服务器以添加必要的标头后,您可以再次使用 curl 来检查结果:

$ curl -s -D - -o /dev/null http://example.com/style.css
HTTP/1.1 200 OK
Date: Tue, 16 Feb 2016 12:00:30 GMT
Content-Type: text/css
Content-Length: 1977
Cache-Control: max-age=86400,public
Via: 1.1 google

$ curl -s -D - -o /dev/null http://example.com/style.css
HTTP/1.1 200 OK
Date: Tue, 16 Feb 2016 12:00:31 GMT
Content-Type: text/css
Content-Length: 1977
Cache-Control: max-age=86400,public
Via: 1.1 google

$ curl -s -D - -o /dev/null http://example.com/style.css
HTTP/1.1 200 OK
Date: Tue, 16 Feb 2016 12:00:30 GMT
Content-Type: text/css
Content-Length: 1977
Cache-Control: max-age=86400,public
Via: 1.1 google
Age: 2

$

本示例中的最后一个响应包含 Age 标头。Cloud CDN 将 Age 标头添加到它从缓存传送的响应中。此处,该标头表明,系统已使用 2 秒前创建的缓存条目从缓存中成功传送了响应。

缓存了不公开的内容,或者缓存的内容不正确

如果您知道源服务器为什么传送了不公开或不正确的内容,并且您可以解决该问题,则可以通过以下过程使 Cloud CDN 缓存失效:

  1. 确保源服务器不再返回不公开或不正确的内容。
  2. 请求缓存失效操作,以指示 Cloud CDN 停止传送缓存的内容。

有关详情,请参阅缓存失效操作页面。

Cloud CDN 将仅缓存标记为可公开缓存的响应,并且仅从缓存中传送存在时间不超过响应中指定的过期时间的响应。如果您不知道为什么内容会被缓存,或无法方便地解决相关问题,不妨在了解并解决问题之前先停用 Cloud CDN,等问题得到解决后再重新启用。如需详细了解缓存的内容以及缓存时长,请参阅缓存详情

缓存命中率较低,或者同一内容具有多个缓存填充

如果您的后端服务或后端存储分区的缓存命中率低于预期,请确保缓存相关网址的响应

Cloud CDN 将完整的请求 URI 合并到其缓存键中,因此 http://example.com/cat.jpg?1 和 http://example.com/cat.jpg?2 将具有单独的缓存条目。您可以对给定的资源始终使用单一网址,以便提高缓存命中率。如果您需要将参数传递给在某个可缓存页面上运行的 JavaScript,请考虑使用片段标识符(而非查询字符串)。此外,您可以只在必要时才使用 Vary 响应标头,以便提高缓存命中率。如需详细了解缓存键,请参阅缓存详情

通常,您可以通过增加可缓存响应的过期时间来减少缓存填充的数量。在保持其他所有设置不变的情况下,Cache-Control: public, max-age=86400 的响应的缓存填充数量要比 Cache-Control: public, max-age=1 的响应更少。有关过期时间的信息,请参阅缓存详情。有关如何配置适当的响应标头的详细信息,请参阅网络服务器软件的文档。但请注意,Cloud CDN 在全球运行着众多缓存,我们会定期逐出旧的缓存条目,以便为新内容腾出空间。因此,每个资源有多个缓存填充属于正常操作。

未执行压缩

Cloud CDN 本身不会对响应进行压缩或解压缩,但它可以传送由源服务器生成的响应(通过 gzipDEFLATE 等编码方法进行了压缩)。

如果 Cloud CDN 传送的响应未被压缩,但本应进行压缩,请检查您的实例上运行的网络服务器软件是否配置为会对响应执行压缩。默认情况下,某些网络服务器软件将为包含 Via 标头的请求自动停用压缩功能。如果 Via 标头存在,则表示请求是由代理转发的。根据 HTTP 规范的要求HTTP(S) 负载平衡等 HTTP 代理会向每个请求添加 Via 标头。要启用压缩功能,您可能必须替换您的网络服务器的默认配置,以指示它对响应执行压缩(即使请求具有 Via 标头)。

如果您使用的是 nginx 网络服务器软件,请修改 nginx.conf 配置文件,以启用压缩功能。此文件的位置取决于 nginx 的安装位置。在许多 Linux 发行版中,该文件存储在 /etc/nginx/nginx.conf。要允许 nginx 压缩功能与 HTTP(S) 负载平衡一起运行,请将以下两行添加到 nginx.conf 的 http 部分:

gzip_proxied any;
gzip_vary on;

第一行可以为请求启用压缩功能(即使请求是由 HTTP(S) 负载平衡等代理转发的请求)。第二行会向响应添加一个 Vary: Accept-Encoding 标头。Vary: Accept-Encoding 会向缓存代理(例如 Cloud CDN)发送通知,告知它们应为可压缩资源的已压缩和未压缩变体保留单独的缓存条目。

修改 nginx.conf 之后,您需要首先重新启动 nginx,然后它才会使用新的配置。在许多 Linux 发行版中,您可以通过运行 sudo service nginx restart/etc/init.d/nginx restart 来重新启动 nginx。

响应以 byte_range_caching_aborted 错误终止

当 Cloud CDN 汇总来自多个字节范围请求的响应时,它会比较 ETag 和 Last-Modified 响应标头,以此来检查这些范围是否来自相同版本的资源。如果 Cloud CDN 发现任一标头的值与已传送给客户端的范围不一致,它将中止响应。

如果您发现响应意外终止的情况(Stackdriver Logging 日志条目的 statusDetails 字段显示 byte_range_caching_aborted,或者您的实例返回了 412 Precondition Failed 响应),请确保在所有虚拟机实例上运行的网络服务器软件会为给定资源返回相同的 ETag 值和 Last-Modified 值。

从磁盘传送文件时,网络服务器软件通常会从文件的修改时间得出 ETag 和 Last-Modified 值。在这种情况下,您可以通过为所有实例使用相同的映像来确保虚拟机实例报告得到一致的值。如需详细了解如何确定 ETag 和 Last-Modified 值,请参阅网络服务器软件的文档。

错误消息

缓存失效操作错误
错误代码 备注
Invalid value for field 'resource.path' 路径值的格式无效。路径必须以 / 开头,不能包含 ?#,并且必须只有一个 *(必须为 / 之后的最后一个字符)。路径不能超过 1024 个字符。如果您看到此错误,请检查路径值并更正任何格式错误。
(此错误仅针对路径的格式。具有有效格式、但不存在的路径仍被视为有效。)
Rate Limit Exceeded Cloud CDN 会限制可以执行缓存失效操作的速率。每分钟只允许执行一次失效操作。但是,每个操作都可以指定与任意数量的对象匹配的路径模式。

已知问题

以下已知问题和限制会对 Cloud CDN 造成影响:

  • 缓存失效操作的速率受限制,每分钟只能对每个网址映射执行一次失效操作。
此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Cloud CDN 文档