我正在重构我的 Varnish VCL,但无法弄清楚这一点。
Varnish 3.0 本身支持 gzip 压缩内容,而且基本上看起来做对了。另请参阅:https://stackoverflow.com/a/12962493/35434
但是,根据 varnishlog,即使客户端请求 gzip 内容并且后端响应 gzip 内容,Varnish 仍会执行 gunzip 步骤。根据 Varnish 文档,Varnish 默认为 do_gzip=true,并且还会压缩存储缓存对象。那么,为什么要使用 gunzip?
以下是相关日志条目:
11 RxURL c /javascripts/general.js
11 RxHeader c Accept-Encoding: deflate, gzip
11 VCL_call c fetch
13 TxHeader b Accept-Encoding: gzip
13 RxHeader b Content-Encoding: gzip
13 RxHeader b Content-Type: application/javascript
11 Gzip c u F - 1554 4476 80 80 12365
11 VCL_call c deliver
11 TxHeader c Content-Encoding: gzip
如您所见,整个管道都支持 gzip,但 Varnish 在 vcl_fetch 期间执行 gunzip。我假设它以压缩形式存储对象,正如您所见,它也以压缩形式传输对象。
该请求之后,varnishstat 显示发生了 gunzip 操作:
$ varnishstat -1 | grep zip
n_gzip 0 0.00 Gzip operations
n_gunzip 1 0.00 Gunzip operations
注意:我的 VCL 有不gzip 配置,我也没有对对象的主体进行任何操作。我依赖合理的默认值,因此我没有显示 VCL。
gunzip 操作相对较轻,但我仍然想了解原因,并可能防止几十万次操作。
答案1
您能否将其设置到您的 vcl_fetch() 部分中
set beresp.do_gunzip = false;
这应该会停止 varnish 执行 gzip 操作。