尽管整个管道都经过了 gzip 压缩,Varnish 3 仍会执行 gunzip

尽管整个管道都经过了 gzip 压缩,Varnish 3 仍会执行 gunzip

我正在重构我的 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 操作。

相关内容