http - Varnish 不 gzip html 页面

标签 http tomcat compression gzip varnish

我有多个在 CentOS 6 上运行的 tomcat 7.0.56 和一个在另一台服务器 Centos 上运行的 Varnish 4。 Varnish 必须为我们做两件重要的事情:做一个反向代理(工作起来很有魅力)和压缩所有可以压缩的数据。我们不关心我们架构中的缓存。 关于第二点,我们有一个问题。 Varnish gzip CSS 和 JS 而不是 gzip html。 在我的 default.vcl 中,我不压缩图片、swf 或专为移动设备设计的页面等文件,我将 beresp.do_gzip 设置为 true 用于所有其他内容。

我的vcl_recv:

sub vcl_recv { 如果(req.http.Accept-Encoding){ if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf)$"|| req.url ~ "Mobile\.") { 取消设置 req.http.Accept-Encoding; } elsif (req.http.Accept-Encoding ~ "gzip") { 设置 req.http.Accept-Encoding = "gzip"; } elsif (req.http.Accept-Encoding ~ "deflate"&& req.http.user-agent !~ "MSIE") { 设置 req.http.Accept-Encoding = "deflate"; } 别的 { #未知算法 取消设置 req.http.Accept-Encoding; } } 设置 req.backend_hint = h.backend(client.identity); }

我的vcl_backend_response:

sub vcl_backend_response {

 if (beresp.http.url ~ "\.(jpg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf)$" || beresp.http.url ~ "Mobile\.") {
    set beresp.do_gzip = false;
}
else {
    set beresp.do_gzip = true;
    set beresp.http.X-Cache = "ZIP";
}}

除 html 页面外,所有通过 Varnish 的流都被正确压缩。但是这些页面的标题几乎是正确的。

请求 header

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 接受编码:gzip、deflate、sdch 接受语言:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4 缓存控制:无缓存 连接:保持事件状态 Cookie:JSESSIONID=F116C2729E96D2150EEEACEB90F95EA9.node1; UUID=631a2947-14ac4e00ca6-0233de72a654bb34bce4a88d9e172e25 主机:tomcat.domain.tld 用法:无缓存 引用:http://tomcat.domain.tld/path/to/ServletControl?sourceview=liste_menu User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36

响应 header

接受范围:字节 年龄:0 缓存控制:无存储,无缓存 连接:保持事件状态 内容语言:fr-FR 内容类型:文本/html;字符集=UTF-8 日期:2015 年 1 月 7 日星期三 14:55:04 GMT 过期:0 信息产业部:1800 Pragma:无存储,无缓存 服务器:Apache-Coyote/1.1 设置 Cookie:UUID=631a2947-...e25;版本=1;最大年龄=10000;过期 = 星期三,2015 年 1 月 7 日 17:41:44 GMT;路径=/gce162 传输编码:分块 变化:接受编码 通过:1.1 Varnish -v4 X缓存:ZIP X- Varnish :163870

我们可以看到标签 X-Cache 的值为 ZIP,标签 Vary with accept-Encoding 但没有 Content-Encoding "gzip"。 所以我不明白为什么 varnish 不 gzip html 并写标签 Vary=accept-Encoding ?

欢迎任何帮助。谢谢。

八 bean

最佳答案

相信这与 Transfer-Encoding:chunked 由于未为 html 文件设置内容长度而返回响应 header 有关。

要禁用分块响应,请尝试在 vcl_backend_response 的 else 循环中添加 set beresp.do_esi = true;

另见

https://www.varnish-cache.org/trac/ticket/1506How do I disable 'Transfer-Encoding: chunked' encoding in Varnish?

关于http - Varnish 不 gzip html 页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27823783/

相关文章:

java - 无法解析服务器输入流

python - 通过pycurl获取youtube的页面加载时间

javascript - NodeJs HTTP Post 调用,如何将其用作使用 $http 的 AngularJs 的 API

java/GWT 网络应用程序 : how to get a callback on Session Timeout

java - Tomcat 6.0 不在本地主机上基于 webkit 的浏览器中设置 Cookie

java - Imageloader.save 到 ByteArrayOutputStream 的速度非常慢

floating-point - IEEE-754数据的压缩算法

基于 NodeJS 的 HTTP 客户端 : How to authenticate a request?

http - 在实现PoolingHttpClientConnectionManager时遇到问题

java - org.apache.jasper.JasperException :/index. jsp