gzip压缩技术

gzip(GNU-ZIP)是一种压缩技术,经过gzip压缩后,页面大小可以变为原来的30%甚至更小。这样,用户浏览页面的时候速度会快得多。gzip 网页压缩的实现需要浏览器和服务器的支持,如图:

gzip nginx开启 nginx gzip原理_服务器

从图可以看出,gzip压缩的过程,首先在服务器端压缩,然后传到浏览器端后解压。当浏览器支持gzip解压时,会在请求消息头中包含Accept-Encoding:gzip,这样Nginx就会向浏览器发送经过gzip后的内容,同时在响应消息头中加人Content-Encoding:gzip,声明这是gzip后的内容,告知浏览器要先解压后才能解析输出。

网页压缩传输配置

Nginx服务器为网页压缩专门提供了gzip模块,并且模块中的相关指令均可以设置在http、server或location块中,实现服务器端按照指定的设置进行压缩。具体指令及其含义,如表:

gzip nginx开启 nginx gzip原理_网页压缩传输_02


gzip nginx开启 nginx gzip原理_Nginx_03

1. 修改配置文件:

http {
	...
	gzip on;
	gzip_types text/plain applicaion/javascript text/css;
	...
}

在上述设置中,第3行用于启用gzip模块,第4行用于在客户端访问网页时,对文本、JavaScript和CSS文件进行压缩输出。

2. 配置tomcat反向代理:

gzip nginx开启 nginx gzip原理_Nginx_04

3. 访问测试:

访问:http://localhost/edu/a.html

gzip nginx开启 nginx gzip原理_服务器_05


查看响应信息:

gzip nginx开启 nginx gzip原理_原始数据_06

从图中可以看出,当前ContentEncoding(内容编码)为gzip类型,ContentType(内容类型)为HTML网页类型。

除了,上述的基本配置外,在实际开发中还可以具体配置压缩比,缓存大小、对于代理是否采用压缩等详细的设置,具体示例如下:

gzip_buffers 416k;
gzip_comp_level 4;
gzip_disable "MSIE [1-6]."
gzip_min_length 5k;
gzip_http_version 1.0;
gzip_proxied any;
gzip_vary on;

上述第1行中的416k,表示按照原始数据大小以16KB为单位的4倍申请内存;如果没有设置,默认值是申请与原始数据相同大小的内存空间去存储gzip压缩结果。第2行表.示压缩级别为4,由于压缩级别越高,则需要压缩的时间越长,CPU消耗也越大。因此,一般推荐将压缩级别设置为4。第3行用于设置浏览器为IE6时,不进行压缩,防止出现页面假死的现象。
第4行用于设置当响应内容大于5KB时进行压缩输出,且一般建议最小值设置为1KB,当小于1KB时,可能会出现越压越大的问题。第5行表示只有是HTTP/1.0协议的请求时才会进行gzip压缩。第6行用于设置Nginx作为反向代理服务器时,无条件压缩所有结果数据,第7行gzip_vary指令设置为on,表示在响应消息头中添加Vary: Accept-Encoding,使代理服务器根据请求头中的AcceptEncoding识别是否启用Gzip压缩。

其中,Nginx作为反向dialing时,gzip_proxied指令的常用参数值如下表:

gzip nginx开启 nginx gzip原理_gzip nginx开启_07

值得一提的是,虽然Nginx使用gzip压缩内容可以减少传输数据大小,但压缩率越大CPU消耗越高。CPU消耗高会导致Nginx能同时处理请求的响应能力下降。因此,在实际应用中是否要开启gzip模块,需要根据实际应用功能决定。