我有多个在 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/1506和 How do I disable 'Transfer-Encoding: chunked' encoding in Varnish?
关于http - Varnish 不 gzip html 页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27823783/