为什么要启用GZIP压缩?
一、遇到的问题
在做一个电商ERP项目中,有一个页面没有使用分页功能,一下子加载了好几百条数据,数据大小达到了2M,加载了十几秒才渲染完毕(由于我用的服务器带宽也不多可能1M吧),客户那边反馈过来速度慢的问题,然后我就思考了一下整个程序流程,首先在数据返回中对数据进行了精简(不需要的数据就不进行返回),而后我想到了一个功能就是压缩功能,之前在nginx中使用到了gzip压缩的功能,想到了是否在tomcat(这个项目使用的是tomcat)中也可以使用,这样不就更好了么
二、压缩原理
HTTP协议中的压缩可以很大方面提高网页的加载速度;压缩的流程为,客户端请求服务器相应资源文件,服务器端将相应资源文件进行压缩,再输出到客户端,由客户端的浏览器负责解压缩。
三、HTTP支持的压缩格式
HTTP协议定义了一些标准的内容编码类型,并允许用扩展的形式添加更多的编码。Content-Encoding header 就用这些标准化的代号来说明编码时使用的算法,Content-Encoding 值
- gzip 表明实体采用GNU zip编码
- compress 表明实体采用Unix的文件压缩程序
- deflate 表明实体是用zlib的格式压缩的
- identity 表明没有对实体进行编码。当没有Content-Encoding header时, 就默认为这种情况
- gzip, compress, 以及deflate编码都是无损压缩算法,用于减少传输报文的大小,不会导致信息损失。 其中gzip通常效率最高, 使用最为广泛。
四、开启压缩的优点
- 通过减小HTTP响应大小来减少响应时间
- 相对于普通的页面显示(HTML,CSS,Javascript,文本),压缩可以节省40%~60%左右的流量
- 对动态生成的,包括CGI、PHP , JSP , ASP , Servlet, SHTML等输出的网页也能进行压缩,压缩效率也很高
五、开启压缩的缺点
- 服务器增加性能消耗(CPU、内存等)
- 客户端增加性能消耗(解压缩逻辑增加了实际和空间成本)
- 时间空间的对称理论,如果想要时间快那么空间肯定要消耗多,如果想要空间小那么时间肯定要使用长,(压缩比=原内容大小/压缩后大小,压缩比率越大,则表明压缩后占用空间的压缩包越小)
本文是针对 apache-tomcat-7.0.91-windows-x64 进行配置GZIP压缩的。浏览器使用360极速浏览器
在Tomcat中配置GZIP压缩
一、打开Tomcat安装目录,找到配置文件%TOMCAT_HOME%/conf/server.xml,修改如下参数:
<Connector port="80"
protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
compression="on"
compressionMinSize="2048"
noCompressionUserAgents="chrome,webkit"
compressableMimeType="text/html,text/xml,text/javascript,application/javascript,text/css,text/plain,application/json"/>
参数说明:
1、compression="on" 开启压缩。可选值:"on"开启,"off"关闭,"force"任何情况都开启
2、compressionMinSize="2048"大于2KB的文件才进行压缩。用于指定压缩的最小数据大小,单位B,默认2048B。注意此值的大小,如果配置不合理,产生的后果是小文件压缩后反而变大了,达不到预想的效果
3、noCompressionUserAgents="chrome,webkit",对于这两种内核的浏览器,不进行压缩,其值为正则表达式,匹配的UA将不会被压缩,默认空
4、compressableMimeType="text/html,text/xml,application/javascript,text/css,text/plain" 会被压缩的MIME类型列表,多个逗号隔,表明支持html、xml、js、css、json等文件格式的压缩(plain为无格式的文本内容)。compressableMimeType很重要,它用来告知tomcat要对哪一种文件进行压缩,如果类型指定错误了,肯定是无法压缩的。浏览器支持的所有的MIME类型,可以在系统查找相应的文章即可查看
错误排查与优化结果
一、可能遇到的错误
- Tomcat中的配置参数位置写错。注意配置参数参考下图
- 配置了压缩,数据返回后却没有压缩,可能是由于compressableMimeType参数配置的类型不正确,可以参考本站介绍HTTP中MIME类型的文章
- 响应数据的大小小于compressionMinSize的配置值
- 没有重启Tomcat服务器
二、优化的前的请求数据状态
三、优化后的请求数据状态