nginx模块 ngx_http_gunzip_module、ngx_http_gzip_module、ngx_http_gzip_static_module

2018-07-17 18:30:28

ngx_http_gunzip_module 模块将文件解压缩后并在响应头加上 "Content-Encoding: gzip" 返回给客户端。为了解决客户端不支持gzip压缩。编译的时候带上 --with-http_gunzip_module。

也就是说,当响应头里有 "Content-Encoding: gzip",但是客户端又不支持 gzip时它才会起作用。这两个条件缺一不可,网上有很多朋友说 gunzip on 不生效就是其中一个条件没满足导致的。

这两个条件我们可以通过配合下面的 ngx_http_gzip_static_module  模块模拟出来。

想利用该模块,一般服务器上的文件先通过gzip压缩,然后开启此模块。这样 nginx 就会帮我们先解压缩再返回给客户端。

Syntax:	gunzip on | off;
Default: gunzip off;
Context: http, server, location

是否开启解压缩响应的内容当客户端不支持gzip时解压缩。如何判断客户端支不支持gzip,nginx除了检查请求头 Accept-Encoding: 也会把 gzip_http_version,gzip_proxied,gzip_disable,gzip_vary等指令考虑在内。

Syntax:	gunzip_buffers number size;
Default: gunzip_buffers 32 4k|16 8k;
Context: http, server, location

设置解压缩缓冲区的数量和大小。默认情况下 buffer 大小为一个内存页,一般64位为4K。

下面我们来模拟下,对gzip_static 指令不了解的可以先看下下面的 ngx_http_gzip_static_module 模块讲解。

#预先生成压缩文件
gzip -c index.html > index.html.gz

部分配置如下,下面的意思是,总是返回压缩文件,不管客户端支不支持压缩。

location / {
    root html;
    gzip_static  always;
    gunzip on;		  	
}

此时我们用curl模拟

curl -v localhost/index.html

此时 nginx 会取找 index.html.gz 文件并返回,而且在响应头里加上了 Content-Encoding: gzip。

又由于我们在发起该命令是没带上 请求头 "Accept-Encoding: gzip",所以nginx判断出客户端不支持 gzip。

好了,由于满足了2个条件,所以此时 gunzip on; 生效,会把 index.html.gz 内容解压缩后返回。

从上面我们也可以得出结论,过滤模块 ngx_http_gunzip_module 在 ngx_http_gzip_static_module 模块之后被调用。 


ngx_http_gzip_module 过滤模块能够通过 gzip 压缩响应体来减少传输的大小。

Syntax:	gzip on | off;
Default: gzip off;
Context: http, server, location, if in location

是否开启 gzip,如果客户端不支持gzip,那么就算开启也不会压缩。

Syntax:	gzip_buffers number size;
Default: gzip_buffers 32 4k|16 8k;
Context: http, server, location

设置解压缩缓冲区的数量和大小。默认情况下 buffer 大小为一个内存页,一般64位为4K。

Syntax:	gzip_comp_level level;
Default: gzip_comp_level 1;
Context: http, server, location

设置压缩比 1-9,1最快,压缩最差。9最慢,压缩最好。

Syntax:	gzip_disable regex ...;
Default: —
Context: http, server, location

如果 User-Agent 请求头里的内容匹配了此正则,则不压缩。

Syntax:	gzip_http_version 1.0 | 1.1;
Default: gzip_http_version 1.1;

小于此版本的不压缩。

Syntax:	gzip_min_length length;
Default: gzip_min_length 20;
Context: http, server, location

内容大小小于此的不压缩。

Syntax:	gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
Default: gzip_proxied off;
Context: http, server, location

对代理的请求控制是否压缩。

off  不压缩。

expired  如果响应头里有 Expires,则压缩。

no-cache  响应头里指定 Cache-Control: no-cache 则压缩。

no-strore  响应头里指定 Cache-Control: no-store 则压缩。

private  响应头里指定 Cache-Control: private 则压缩。

no_etag 如果响应头里没有包含 ETag,则压缩。

auth  如果请求头里有 Authorization 则压缩。

any 所有请求都压缩。

Syntax:	gzip_types mime-type ...;
Default: gzip_types text/html;
Context: http, server, location

指定要压缩的 MIME 类型,不管指不指定,text/html都会被压缩。* 代表所有都压缩。

Syntax:	gzip_vary on | off;
Default: gzip_vary off;
Context: http, server, location

如果使用 gzip 或 gzip_static 或 gunzip指令,是否在响应头里增加 "Vary: Accept-Encoding"。

变量 $gzip_ratio 保存了压缩前和压缩后文件大小的压缩比。

gzip            on;
gzip_min_length 1000;
gzip_proxied    expired no-cache no-store private auth;
gzip_types      text/plain application/xml;

上面配置的意思是当文件大于 1000 个字节,且mime类型为 text/html 或 text/plain 或 application/xml,且客户端支持 gzip 压缩(请求头里带上 Accept-Encoding: gzip )则压缩。


ngx_http_gzip_static_module 模块可以发送预先压缩好的 .gz 结尾的文件给客户端。

Syntax:	gzip_static on | off | always;
Default: gzip_static off;
Context: http, server, location

always,则不管客户端支不支持 gzip,都返回压缩好的那个文件。
on 会依据请求头,gzip_http_version,、gzip_proxied、gzip_disable、and gzip_vary来判断是否要返回压缩文件。

#预先生成压缩文件
gzip -c index.html > index.html.gz

假设我们的服务器地址为 192.168.1.10。那么当我们在浏览器里键入 http://192.168.1.10/index.html,如果该客户端支持gizp压缩,那么 nginx 会把 index.html.gz 这个文件返回。


 备注

1.测试环境centos7 64位,nginx版本为 1.14.0。
2.读者也可以参考官方文档 nginx documentation
3..原文地址http://www.freecls.com/a/2712/be


©著作权归作者所有
收藏
推荐阅读
简介
天降大任于斯人也,必先苦其心志。