Tomcat 7 GZIP 压缩无法正常工作

32
我已经在Tomcat的conf/server.xml文件中添加了以下行以启用gzip压缩,但它没有生效。页面仍然没有被压缩。
 <Connector port="8080"
         compression="on"
         compressionMinSize="2048"
         noCompressionUserAgents="gozilla, traviata"
         compressableMimeType="text/html,text/xml,text/plain,text/css,
         text/javascript,text/json,application/x-javascript,
         application/javascript,application/json"/>

有什么想法吗?


我从未见过这样的形式,如果出现某些解决方案将会很有趣。仅供您参考 - 在我们的项目中,我们使用以下方式http://blog.max.berger.name/2010/01/jetty-7-gzip-filter.html - Dewfy
3
你的Tomcat实例是否通过80端口由Apache前置,还是直接通过8080端口访问Tomcat? - David Levesque
嗨,David。你说得对。它是由Apache在80端口前端处理的,这就是我获取未压缩文件的原因。当我访问8080端口上的Tomcat时,我会得到压缩文件。感谢您指引我正确的方向。 - Popeye
5个回答

36
如果Tomcat在80端口由Apache作为前端,则需要在Apache中启用压缩。如果您直接通过8080端口访问Tomcat,则Tomcat中的压缩才会起作用。

14

在Windows上,我尝试暂时启用内容压缩以获得应用程序页面总有效载荷的大致了解时,遇到了这种情况。

我可以确认ESET NOD32 Antivirus确实会像@bugs_在他回答此问题时描述的那样表现,并且我也可以确认运行Fiddler4会产生同样的效果。但是,关闭Fiddler和禁用NOD32的HTTP扫描都不能解决这个问题,为了解决这个问题,我必须按照以下方式禁用连接器中的“sendfile”使用:

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           compression="on" compressionMinSize="8192" useSendfile="false"
           compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript"
           redirectPort="8443" />

这里需要注意的重要属性是 useSendfile="false"

我正在使用Windows下的Apache Tomcat 8。Tomcat文档(http://tomcat.apache.org/tomcat-8.0-doc/config/http.html)关于useSendfile的说明如下:

使用此属性启用或禁用sendfile功能。默认值为true。请注意,使用sendfile将禁用Tomcat可能对响应执行的任何压缩。

关于compression的说明如下:

在使用压缩(节省带宽)和使用sendfile功能(节省CPU周期)之间存在一个折衷。如果连接器支持sendfile功能,例如NIO连接器,则使用sendfile将优先于压缩。症状将是静态文件大于48 KB将不会被压缩。您可以通过设置连接器的useSendfile属性(如下文所述)关闭sendfile,或者在default conf/web.xml或您的Web应用程序的web.xml中更改DefaultServlet的配置以更改sendfile使用阈值。


在我的情况下,只需要关闭 ESET 就可以了。因为我的 Tomcat 不会从磁盘上提供文件服务。 - bugs_

5
在我的情况下,它没有起作用是因为杀毒软件(ESET,Windows)。
它在浏览器之前绑定了某个位置。它解压了正文并删除了“Content-Encoding”头。对于浏览器响应看起来像正常未压缩的响应。即使在 Fiddler 中,它已经被解压缩了。
Https 响应正常工作,但 http 响应被 ESET 解压缩。
这还不够。关闭 ESET。我必须进入“高级设置”->“Web 访问保护”->“HTTP,HTTPS”,然后在那里将其关闭。
如果您从硬盘中提供文件,则可能需要将选项 useSendFile="false" 添加到连接器中。

1
我希望两周前就知道这个,而不是浪费无尽的时间试图弄清楚我做错了什么。干杯! - wmehanna

4

我在本地开发环境中测试类似的server.xml更改,但令人沮丧的是它也没有起作用。

我的问题是我在使用Spring Tool Suite的Servers window -> (right-click) -> New -> Server对话框时选择了编辑本地Tomcat安装目录(C:\apache-tomcat-8.0.5)。

然而,发布后,实际使用的tomcat目录位于(workspace folder)\.metadata\.plugins\org.eclipse.wst.server.core\tmp0

您可以通过右键单击服务器并选择“浏览部署位置...”来检查已发布的位置。

enter image description here

从那里,您可以更新相应的server.xml文件,或者您可以删除并重新添加服务器。


0
也许应该将compression="on"改为compression="force"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接