Google CDN随机不提供gzip内容

时间:2017-04-04 20:28:24

标签: google-cloud-platform google-compute-engine cdn

我需要一些高级人员给我一个建议,这是一个谷歌CDN错误或我想念的东西。我发现这个错误就像4个月前,试图联系他们的支持,但他们是如此粗鲁,我不想在这里谈论这个。他们接受了,至少他们告诉我他们会将问题发送给后端团队,但之后他们删除了问题跟踪器,他们不再回复我的电子邮件了。这就是我在这里问的主要原因。

问题

Google CDN随机不向最终用户提供gzip内容。因此,他们下载500KB文件而不是~70KB。我不能直接将这个问题产生于我的原点,但我可以在Google CDN上轻松地解决这个问题。

以下是对CDN的示例请求:

请求:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch, br
Accept-Language:en-US,en;q=0.8,bg;q=0.6,hr;q=0.4,mk;q=0.2,sr;q=0.2
Cache-Control:no-cache
Connection:keep-alive
Cookie: example
Host: example.com
Pragma:no-cache
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36

响应:

Accept-Ranges:bytes
Age:58422
Alt-Svc:clear
Cache-Control:public, max-age=604800
Content-Length:550158
Content-Type:text/css
Date:Tue, 04 Apr 2017 03:45:53 GMT
Expires:Tue, 11 Apr 2017 03:45:53 GMT
Last-Modified:Sun, 19 Mar 2017 01:50:22 GMT
Server:LiteSpeed
Via:1.1 google

正如您所看到的,我的请求有accept-encoding:gzip标头但我收到的不是gzip内容。而不是70KB我收到500KB。另请注意Age标题,该项目在CDN上缓存/存在58422秒!

以下是来自其他机器(美国)的相同请求

请求:

:authority: xxx
:method:GET
:path:/wp-content/themes/365/style.css
:scheme:https
accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
accept-encoding:gzip, deflate, sdch, br
accept-language:en-US,en;q=0.8
cache-control:no-cache
cookie: xxx
pragma:no-cache
upgrade-insecure-requests:1
user-agent:Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36

响应:

accept-ranges:bytes
age:58106
alt-svc:clear
cache-control:public, max-age=604800
content-encoding:gzip
content-length:72146
content-type:text/css
date:Tue, 04 Apr 2017 03:49:28 GMT
expires:Tue, 11 Apr 2017 03:49:28 GMT
last-modified:Sun, 19 Mar 2017 01:50:22 GMT
server:LiteSpeed
status:200
vary:Accept-Encoding
via:1.1 google

如您所见,我从其他服务器获得了一个gzip内容。

我有大量的HAR文件和视频,我证明了这个错误,但让我们保持简单。 Google CDN日志在GCP信息中心中可用,请查看它们的外观。

enter image description here

如果我的所有访问者都不支持gzip,那么GoogleBot呢?

enter image description here

我还分析了我的服务器日志,我发现该文件的99%响应大小的统计信息与gzip一样,只有少数请求不是gzip。非常合乎逻辑,因为有些访客或者我更喜欢说机器人请求没有gzip标题的文件。

暂时解决问题

如果我清除CDN缓存,则在下一个分钟/小时内不存在此问题。过了一段时间,它仍然会发生。此问题并不总是发生,而是随机发生。我得到了解析CDN日志并向我显示图形的系统,这实际上就是我发现这个错误的方法。

enter image description here

每当我看到图表带宽增加(正常情况下翻倍)时,当我登录谷歌仪表板并检查日志时,我发现那些500KB日志就像50%的文件请求,并且很容易在浏览器中产生错误,我只需登录我的服务器,请求文件并获得随机结果。

如果问题出现在我原点,我会很高兴,因为在1分钟内解决了问题,但我认为这是谷歌CDN的错误。如果有人更多地使用CDN技术来帮助我或谷歌云中的某些人,我会很高兴。

编辑:

正如我所说,这个错误发生在随机时间范围内,这是我现在录制的视频,向我们展示了“没有时间框架”#39;如您所见,每个响应都被压缩。

NO BUG TIME FRAME CDN VIDEO

EDIT2:

这是一个图表,显示单个.css网址测试的gzip数量而不是gzip响应。

stacking lines

EDIT3:

在第一张图形图像上,线条是可堆叠的,这里是没有堆叠的相同图形。正如你所看到的,有些小时接近100%没有gzip响应。

not stacking lines

EDIT4:

以下是我对同一个css文件的原始解析日志。

提供了1060个请求,响应大小低于100KB。 200,304,206响应代码。 提交了32个请求,响应大小超过100KB。 200和206响应代码。

origin server

EDIT5:

分析1月7日的7月日志是单个.css网址的一些额外统计信息:

19803 CDN请求与>一起提供100KB(不是gzip)

41004 CDN请求与< 100KB(gzip)

29缓存从原点填充> 100KB(不是gzip)

924缓存从原点填充< 100KB(gzip)

423缓存到缓存填充> 100KB(不是gzip)

2295缓存到缓存填充< 100KB(gzip)

我很惊讶Cache-To-Cache填充非常有效,令人惊讶。

即使在Google CDN中也没有来源错误。问题是,当Google CDN收到一个可缓存的实体而没有' Vary:Accept-Encoding'当请求未发送' Accept-Encoding:gzip'时,Google CDN将存储该未压缩的响应,并覆盖所有存储的压缩缓存实体。因此,下次当用户尝试获取某些文件(例如.css)时,Google CDN会回答如下:

  1. 我收到了来自原产地的这个文件,并没有任何变化。
  2. 发送未压缩的回复。
  3. 请注意,网络服务器未配置为发送' Vary:Accept-Encoding'没有' Accept-Encoding的请求标题:gzip'头。我在Litespeed,Apache,Nginx和Cloudflare Nginx上进行了测试。

    我强烈建议Google小组更新有关此内容的文档。关于' Vary标题'但没有人会对这个问题有所了解,因为不是我,而不是谷歌的第一级支持(我还有两个谷歌支持人员在谷歌问题跟踪器上进行了20天的通信),堆栈溢出或其他人回答问题。

    附加文档说:

    In addition to the request URI, Cloud CDN respects any Vary headers that instances include in responses.
    

    但是当请求没有“变化”时没有任何内容。报头中。

    这是我解决它的方法:

    <FilesMatch '.(js|css|xml|gz|html|txt|xml|xsd|xsl|svg|svgz)$'>
        Header merge Vary Accept-Encoding
      </FilesMatch>
    

1 个答案:

答案 0 :(得分:3)

Google Cloud CDN既不会压缩也不会解压缩来自您的来源的回复。相反,它尊重源服务器的Vary:Accept-Encoding响应头,并根据客户端的Accept-Encoding请求头缓存单独的变体。支持gzip压缩的客户端应该获得一个变体,而不应该获得另一个变体的客户端。

问题是您提供的示例未压缩响应缺少Vary:Accept-Encoding标头:

Accept-Ranges:bytes
Age:58422
Alt-Svc:clear
Cache-Control:public, max-age=604800
Content-Length:550158
Content-Type:text/css
Date:Tue, 04 Apr 2017 03:45:53 GMT
Expires:Tue, 11 Apr 2017 03:45:53 GMT
Last-Modified:Sun, 19 Mar 2017 01:50:22 GMT
Server:LiteSpeed
Via:1.1 google

上述响应指示Cloud CDN对所有客户端使用未压缩的变体,无论它们是否支持gzip压缩。一旦没有Vary:Accept-Encoding标头的响应在缓存中结束,Cloud CDN将为所有客户端使用该缓存响应。修复程序是原始服务器在其响应中包含Vary:Accept-Encoding标头。

您是否可以分享有关如何启用gzip压缩的详细信息?看来有时您的源服务器无法在其响应中包含Vary:Accept-Encoding标头。当它认为客户端不支持gzip压缩时,它可能不会包含该标题吗?