CSS、JS 的 Tomcat8 Gzip 压缩

Tomcat8 Gzip Compression for CSS, JS

我正在使用 tomcat8 并尝试模拟 CSS 和 JS 的 GZIP 压缩。我在 server.xml 中添加了条目并遵循

 <Connector port="8088" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" 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" />

在我的 html 页面中,我包含了如下脚本

<script type="text/javascript" src="extjs/ext-all-debug.js"></script> 

但是在访问页面时,压缩没有发生,收到的响应头如下。

Remote Address:[::1]:8088
Request URL:http://localhost:8088/test/extjs/ext-all-debug.js
Request Method:GET
Status Code:200 OK

Response Headers

view source
Accept-Ranges:bytes
Content-Length:4585183
Content-Type:application/javascript
Date:Wed, 03 Jun 2015 00:34:12 GMT
ETag:W/"4585183-1427778288000"
Last-Modified:Tue, 31 Mar 2015 05:04:48 GMT
Server:Apache-Coyote/1.1

Request Headers

view source
Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Host:localhost:8088
Referer:http://localhost:8088/test/index.html
User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36

请帮我找出这里出了什么问题。当我在远程服务器上进行此设置时,也会发生同样的情况。

我添加了值为 false 的属性 useSendfile。

手册说:

(bool)使用此属性启用或禁用发送文件功能。默认值是true。请注意,使用 sendfile 将禁用 Tomcat 可能对响应执行的任何压缩。

我的 tomcat8 现在正在压缩一个大 html 文件。

我的连接器:

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
            useSendfile="false"
            compression="on"
            compressionMinSize="2048"
            noCompressionUserAgents="gozilla, traviata"
            compressableMimeType="text/html,text/xml,text/plain,text/css"
           redirectPort="8443" />

Fiddler 信息:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Accept-Ranges: bytes
ETag: W/"560012-1444044890000"
Last-Modified: Mon, 05 Oct 2015 11:34:50 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Content-Encoding: gzip
Vary: Accept-Encoding
Date: Tue, 06 Oct 2015 08:53:53 GMT

我在使用 tomcat8 开发 angularjs 应用程序时遇到了同样的问题。它有一些大的 js files.Setting useSendfile to 'false' 部分帮助,从某种意义上说,一些文件被压缩了,但不是全部。在进一步的研究中,我发现有必要在 compressableMimeType 中也添加 'application/javascript' 。这适用于所有 javascript 个文件。

来自 tomcat8 文档

The value is a comma separated list of MIME types for which HTTP compression may be used. The default value is text/html,text/xml,text/plain,text/css,text/javascript,application/javascript .

FYI 对于任何试图在连接器上使用 compression="force" 属性的人。 "force"只是强制如果客户端支持压缩。

注意力是"Content-Encoding"header检查...

 /**
 * Check if the resource could be compressed, if the client supports it.
 */
private boolean isCompressible() {

    // Check if content is not already compressed
    MessageBytes contentEncodingMB = response.getMimeHeaders().getValue("Content-Encoding");

    if ((contentEncodingMB != null) &&
            (contentEncodingMB.indexOf("gzip") != -1 ||
                    contentEncodingMB.indexOf("br") != -1)) {
        return false;
    }

    // If force mode, always compress (test purposes only)
    if (compressionLevel == 2) {
        return true;
    }
    ...

Source