squid apache tomcat gzip chunked content-length问题研究_我的记事本_百度空间
squid apache tomcat gzip chunked content-length问题研究2009-04-14 10:30
1、squid2.6.22支持gzip压缩缓存,可以针对vary属性缓存多份。
2、apache2可以用mod_deflate压缩,压缩其实是gzip压缩,需要添加header让squid支持根据vary头缓存,添加vary为 accept-encoding。apache根据accept-encoding选择是否gzip压缩,而不管http协议是1.1还是1.0。
3、tomcat会根据http协议是1.1和keepalive选项来进行chunked,chunked对象是outputbuffer大小不能容纳的,或者调用了out.flush()操作的。
由于以上特点,当squid和apache,tomcat三者一起用时,会有以下问题:
1、squid2.6.22发送request会强制用http1.0的,但header信息不会修改,而apache转发给tomcat不作header修改,因此tomcat会认为是http1.0,所以不会chunked,这样apache收到response之后,根据accept-encoding对内容作gzip压缩,返回squid。
2、如果修改squid源代码,改为发送http1.1协议,其实它也可以正确处理chunked内容,但是,因为squid会完全读完response才会缓存,所以只会增加其负担,而无益处。
3、只用apache和tomcat,客户端收到的是chunked之后,再gzip之后的内容,浏览器会正确解析。
综上,squid,apache,tomcat可以很好的支持静态文件gzip和动态文件gzip,因为利用squid去请求tomcat,tomcat不作chunked处理,apache会等tomcat完全返回response之后作gzip压缩,然后再返回squid。
最后,如果response或者request的内容是chunked的,一般不会有content-length字段,gzip压缩后默认也不添加content-length字段,但squid接收到gzip之后,如果加入缓存,则再次输出的时候会添加content-length字段。