Nov*_*ato 8 cdn google-compute-engine google-cloud-platform
我需要一些高级人员给我一个建议,这是一个谷歌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 header但我收到的不是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信息中心中可用,请查看它们的外观.
如果我的所有访问者都不支持gzip,那么GoogleBot呢?
我还分析了我的服务器日志,我发现该文件的99%响应大小的统计信息是gzip,只有少数请求不是gzip.非常合乎逻辑,因为有些访客或者我更喜欢说机器人请求没有gzip标头的文件.
临时解决问题
如果我清除CDN缓存,则在下一个分钟/小时内不存在此问题.过了一段时间,它仍然会发生.此问题并不总是发生,而是随机发生.我有系统解析CDN日志并向我显示图表,这实际上是我发现这个bug的方式.
每当我看到图表带宽增加(正常情况下翻倍),当我登录谷歌仪表板并检查日志时,我发现那些500KB日志就像50%的文件请求,并且很容易在浏览器中产生错误,我只需登录到我的服务器,请求文件并获得随机结果.
如果问题是我的起源,我会很高兴,因为在1分钟内解决了问题,但我认为这是谷歌CDN的错误.如果任何人更多地使用CDN技术来帮助我或Google Cloud中的某些人,我会很高兴.
编辑:
正如我所说,这个错误发生在随机时间框架中,这是我现在录制的视频,向我们展示了"没有时间框架".如您所见,每个响应都被压缩.
EDIT2:
这是一个图表,显示单个.css网址测试的gzip数量而不是gzip响应.
EDIT3:
在第一个图形图像上,线条是可堆叠的,这里是没有堆叠的相同图形.正如您所看到的,有些小时接近100%没有gzip响应.
EDIT4:
这是我的同源css文件的原始解析日志.
提交了1060个请求,响应大小低于100KB.200,304,206响应代码.提交了32个请求,响应大小超过100KB.200和206响应代码.
EDIT5:
分析4月1日至7日的日志是单个.css网址的一些额外统计信息:
19803 CDN请求提供> 100KB(不是gzip)
41004 CDN请求以<100KB(gzip)提供
29缓存从原点填充> 100KB(不是gzip)
924缓存从原点填充<100KB(gzip)
423 Cache-To-Cache填充> 100KB(不是gzip)
2295缓存到缓存填充<100KB(gzip)
我很惊讶Cache-To-Cache填充非常有效,令人惊讶.
解
即使在Google CDN中也没有来源错误.问题是,当请求未发送'Accept-Encoding:gzip'时,Google CDN会收到一个没有'Vary:Accept-Encoding'的可缓存实体,因此Google CDN将存储该未压缩的响应并覆盖所有存储的压缩缓存实体.因此,下次当用户尝试获取某些文件(例如.css)时,Google CDN会回答如下:
请注意,Web服务器未配置为在没有"Accept-Encoding:gzip"标头的请求上发送"Vary:Accept-Encoding"标头.我在Litespeed,Apache,Nginx和Cloudflare Nginx上进行了测试.
我强烈建议Google小组更新有关此内容的文档.有一个关于'Vary标题'的声明,但没有人会对此问题有所了解,因为不是我,而不是谷歌的第一级支持(我还有两个Google支持人员在Google问题跟踪器上进行了20天的通信),堆栈溢出或其他人回答这个问题.
附加文件说:
In addition to the request URI, Cloud CDN respects any Vary headers that instances include in responses.
但是当请求没有"Vary"标题时没有任何内容.
这是我如何解决它:
<FilesMatch '.(js|css|xml|gz|html|txt|xml|xsd|xsl|svg|svgz)$'>
    Header merge Vary Accept-Encoding
  </FilesMatch>
Google Cloud CDN 既不压缩也不解压缩来自您的源的响应。相反,它尊重源服务器的 Vary: Accept-Encoding 响应标头,并根据客户端的 Accept-Encoding 请求标头缓存单独的变体。支持 gzip 压缩的客户端应该获取一种变体,而不支持 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 压缩时,也许它不包含该标头?
| 归档时间: | 
 | 
| 查看次数: | 1020 次 | 
| 最近记录: |