在Nginx 配置文件中可以配置Gzip 的使用,相关指令可以在配置文件的http 快,server块或者location 块中设置Nginx 服务器通过ngx_http_gzip_module 模块,ngx_http_gzip_static_module 模块和ngx_http_gunzip_module 模块对这些指令进行解析和处理。
由ngx_http_gzip_module 模块处理的9个指令
ngx_http_gzip_moudle 模块主要负责Gzip功能的开启设置,对相应数据进行在线实时压缩。该模块包含以下主要指令。
1.gzip 指令
该指令用于开启或关闭Gzip 功能
gzip on | off;
默认情况下,该指令设置为off,即不开启用Gzip 功能。只有将该指令设置为on 时,下列各指令设置才有效。
2.gzip_buffers 指令
该指令用于设置Gzip 压缩文件使用缓存空间的大小
根据该配置项,Nginx 服务器在对相应输出数据进行Gzip压缩时需要向新系统申请number*size 大小的空间用于存储压缩数据。从Nginx 0.7.28 开始,默认情况下 的值为128, 其中size 的值取系统内存页一页的大小为4kb 或者8kb 即;
gzip_buffers 32 4k | 16 8k;
获取系统内存页大小的命令是
getconf PAGE_SIZE
3.gzip_comp_level 指令
该指令用于设定Gzip 压缩程度,包括级别 1到 9级别。级别1表示压缩程度最低,压缩效率最高;压缩级别9 表示压缩成都最高,压缩效率最低,最费时间,默认设置为级别1
gzip_comp_level 4;
4.gzip_diable 指令
针对不同种类客户端发起的请求,可以选择性开启和关闭Gzip 功能。该指令从Nginx0.6.23 启用,用于设置一些客户端种类。Nginx 服务器在响应这些种类的客户端请求时,不使用Gzip 功能缓存响应输出数据。设置的参数根据客户端的浏览器标志(User-Agent,UA) 进行设置,支持使用正则表达式。
gzip_disable "MSIE [1-6]\.";
该设置使用了正则表达式,其可以匹配UC 字符串中包含MSIE1,MSIE2,MSIE3 到6的所有浏览器,响应这些浏览器发出的请求时,Nginx 服务器不进行Gzip 压缩。
5.gzip_http_version 指令
早期的一些浏览器或者HTTP客户端,可能不支持Gzip 自解压,因此用户有时会看到乱码,所以针对不同的HTTP 协议版本,需要选择性地开启或者关闭Gzip 功能。该指令用于设置开启Gzip 功能的最低 HTTP 协议版本。
gzip_http_version 1.0 | 1.1;
默认设置为1.1版本,即只有客户端使用1.1 及以上版本的HTTP 协议时,才是用Gzip 功能对响应输出数据进行压缩。从目前来看,绝大多数的浏览器都支持Gzip 自解压,一般采用默认值即可。
6.gzip_min_length 指令
Gzip压缩功能对大数据的压缩效果明显,但是如果压缩很小的数据,可能出现压缩数据量越大的情况(许多压缩算法都有这样的情况发生),因此应该根据响应页面的大小,选择性的开启或者关闭Gzip 功能。该指令设置页面 的字节数,当响应页面的大小大于该值时,才启用Gzip 功能。响应页面的大小通过HTTP 响应头部中的Content-length 指令获取,但是如果使用了Chunk 编码动态压缩,Content-Length 或不存在或被忽略,该指令不起作用。
默认设置为20,设置为0时表示不管响应页面大小如何统统压缩,建议设置为1KB 或以上,以防止出现数据越压越大的情况:
gzip_min_length 1024;
7.gzip_proxied 指令
该指令在使用Nginx 服务器的方向代理功能时有效,前提是在后端服务器返回的响应页面头部中,Requests 部分包含用于通知代理服务器的Via 头域。它主要用于设置Nginx 服务器是否对后端服务器返回结果进行Gzip 压缩。
gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any...;
- off 关闭Nginx 服务器对后端服务器返回结果的Gzip 压缩,这是默认设置。
- expired,当后端服务器响应页头部包含用于指示响应数据过期时间的expred 头域时,启用对响应数据的Gzip压缩
- no-cache,当后端服务器响应页头部包含用于通知所有缓存机制是否缓存的Cache-Control 头域,且其指令为no-cache时,启用对响应数据的Gzip 压缩
- no-store,当后端服务器响应页头部包含用于通知所有缓存机制是否缓存的Cache-Control 头域,且其指令为no-store时,启用对响应数据的Gzip 压缩。
- private,当后端服务器响应页头部包含用于通知所有缓存机制是否缓存的cache-Conrrol 头域,且其指令为private 时,启用对响应数据的Gzip 压缩。
- no_last_modified, 当后端服务器响应页头部不包含用于志明需要获取数据最后修改时间的Last-Modified 头域时,启用对响应数据的Gzip压缩。
- no_etag,当后端服务器响应页头部不包含用于标示被请求变量的实体值的ETag 头域时,启用对响应数据的Gzip压缩。
- auth,当后端服务器响应页头部包含用于标示HTTP 授权证书的Authorization头域时,启用对响应数据的Gzip压缩
- any,无条件启用对后端服务器响应书记的Gzip压缩
该指令的设置需要对HTTP 协议的HTTP Header消息有基本的了解,关于HTTP Header 消息头域的概念及相关的指令 给大家推荐一个网址 其中对HTTP Header 的各个头域进行了详细的说明:https://en.wikipedia.org/wiki/List_of_HTTP_header_fields
8.gzip_types 指令
Nginx 服务器可以根据响应页的MIME类型选择性的开启Gzip 压缩功能。该指令用来设置MIME类型,被设置额类型将被压缩。
在gzip 指令设置为on 时,Nginx服务器会对所有的text/html 类型页面数据进行Gzip压缩。该变量还可以取“*”,表示对所有MIME类型的页面数据进行Gzip压缩,一般情况下我们压缩常规的文件类型时,可以设置为:
gzip_types text/html application/x-javascript text/css application/xml;
9.gzip_vary 指令
该指令用于设置使用Gzip 功能时是否发送带有“Vary:Accept-Encoding” 头域的响应 头部。该头域的主要功能时告诉接受方发送的数据经过了压缩处理。开启后的效果是在响应头部添加了Accept-Encoding:gzip,这对于本身不支持Gzip压缩的客户端浏览器是有用的。
gzip_vary on | off;
默认设置为off。事实上,我们可以通过Nginx 配置的add_header 指令强制Nginx 服务器在响应头部添加“Vary:Accept-Encoding” 头域,以达到相同的效果:
add_header Vary Accept-Encoding gzip;
注意:该指令在使用过程中存在bug,会导致IE4 及以上浏览器的数据缓存功能失效
由ngx_http_gzip_static_module 模块处理的指令
ngx_htttp_gzip_static_module 模块主要负责搜索和发送经过Gzip 功能预压缩的数据。这些数据以".gz" 作为后缀名存在服务器上。如果客户端请求的数据在之前被压缩过。并且客户端浏览器支持Gzip压缩,就直接返回压缩后的数据。
该模块与ngx_http_gzip_module 模块的不同之处主要在于,该模块使用的是静态压缩,在HTTP响应头部包含Content-Length 头域来指明报文体的长度,用于服务器可确定响应数据长度的情况;而后者默认使用Chunked 编码的动态压缩,其主要适用于服务器无法确定响应数据长度的情况,比如大文件下载的情形,这时需要实时生成数据长度。
与该模块有关的指令主要有以下几个:gzip_static,gzip_httpd_version, gzip_proxied,gzip_disable和gzip_vary 等。
其中gzip_static 指令,用于卡其和关闭该模块的功能,其语法结构为:
gzip_static on | off | always;
- on 开始该模块的功能
- off 关闭该模块的功能
- always 一直发送Gzip 预压缩文件,而不检查客户端浏览器是否支持Gzip压缩。
其他指令与ngx_http_gzip_module 模块下的使用方式相同,请参与上面的内容。需要注意的是,gzip_proxied 指令只接受以下设置:
gzip_proxied expired no-cache no-store private auth;
另外,对于该模块下的gzip_vary指令 ,开启以后只给未压缩的内容添加“Vary:Accept-Encoding” 头域,而不是对所有内容都添加。如果需要给所有的响应头添加该头域,可以通过Nginx 配置的add_header 指令实现。
注意: 该模块是Nginx 服务器的可选HTTP 模块,如果要使用,必须添加在Nginx 程序配置时添加--with-http_gzip_static_moudle 指令。
由ngx_http_gunzip_module 模块处理的2个指令
Nginx 服务器支持对响应输出数据流进行Gzip 压缩,这对客户端浏览器来说,需要有能力解压和处理Gzip压缩数据,但是如果客户端本身不支持该功能,就需要Nginx服务器在向其发送数据之前先将该数据解压。这些压缩数据可能来自于后端服务器压缩产生或者Nginx 服务器压缩产生。ngx_http_gunzip_module 模块便是用来针对不支持Gzip 压缩数据处理的客户端浏览器,对压缩数据进行解压处理的,与它有关的指令主要有以下几个:gunzip,gunzip_buffers,gzip_http_version,gzip_proxied,gzip_disable 和gzip_vary 等。
1.gunzip 指令
该指令用于开启或者关闭该模块的功能,语法结构为:
gunzip_static on | off;
- on 开启该模块的功能。
- off 关闭该模块的功能。
该指令默认设置为关闭功能,当功能开启时,如果客户端浏览器不支持Gzip 处理,Nginx 服务器将返回解压后的数据;如果客户端浏览器支持Gzip 处理,Nginx 服务器局略该指令的设置,仍然返回压缩数据。
注意: 在某些特殊情况下可能要求Nginx 服务器始终返回非压缩的数据 (比如使用HTTP 可选模块ngx_http-addition_module时,用于在响应请求的页面开始或者结尾添加文本信息,它只有在Nginx 服务器返回非压缩数据时才能正常使用),这就需要在编译Nginx 程序之前对远吗进行适当的处理
当客户端浏览器不支持Gzip 数据处理时,使用该模块可以解决数据解析的问题,同时保证Nginx 服务器与后端服务器交互数据或者本身存储数据时仍然使用蕊数据,从而减少了服务器之间的数据传输量,降低了本地存储空间和缓存的使用率。
2.gunzip_buffers 指令
该指令与ngx_http_gzip_module 模块中的gzip_buffers 指令非常类似,都是用于设置Nginx 服务器解压Gzip 文件使用缓存空间大小的。
其值的设置与 gzip_buffers 一样 4KB 或者8KB
gunzip_buffers 32 4k | 16 8k;
其他指令同ngx_http_gazip_module模块下的使用方法相同。
该模块是Nginx 服务器的可选HTTP 模块,如果要使用,必须在Nginx 程序配置时添加--with-http_gunzip_module 指令。