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;
}
...
我正在使用 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;
}
...