Nginx-gzip压缩
nginx 推荐配置
1 | gzip on; |
ngx_http_gzip_module
默认已编译,可通过
--without-http_gzip_module
禁用模块。
我们可通过 ngx_http_gzip_module
模块,使用 gzip on;
指令开启 gzip 压缩,实时压缩 http 包体,提升网络传输效率。
Syntax: gzip on | off;
Default: gzip off;
Context: http,server,location, if in location
1 | gzip on; |
指定压缩文件类型,图片类文件本身就自带压缩,再进行压缩提升并不明显。
Syntax: gzip_types mime-type …;
Default: gzip_types text/html;
Context: http,server,location
1 | gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php application/vnd.ms-fontobject font/ttf font/opentype font/x-woff image/svg+xml; |
指定压缩文件的最小字节数,当小于此字节数时不进行压缩。
Syntax: gzip_min_length length;
Default: gzip_min_length 20;
Context: http, server, location
1 | gzip_min_length 1k; |
通过设置正则规则,表明哪些 User-Agent
头不使用 gzip 压缩。
Syntax: gzip_disable regex …;
Default: —
Context: http, server, location
1 | # 禁用IE 1-6 gzip |
指定压缩的 http 版本,默认:http_version: 1.1 才启用压缩处理。
Syntax: gzip_http_version 1.0 | 1.1;
Default: gzip_http_version 1.1;
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
值,则压缩响应。
- 如果上游响应中含有
- private
- 如果上游响应中含有
Cache-Control
头部,且其值含有private
值,则压缩响应
- 如果上游响应中含有
- no_last_modified
- 如果上游响应中没有
Last-Modified
头部,则压缩响应
- 如果上游响应中没有
- no_etag
- 如果上游响应中没有
ETag
头部,则压缩响应
- 如果上游响应中没有
- auth
- 如果客户端请求中含有
Authorization
头部,则压缩响应
- 如果客户端请求中含有
- any
- 压缩所有来自上游的响应
配置缓冲区大小
Syntax: gzip_buffers number size;
Default: gzip_buffers 32 4k|16 8k;
Context: http, server, location
压缩率等级,1-9,1:压缩速度最快,压缩率最低。
Syntax: gzip_comp_level level;
Default: gzip_comp_level 1;
Context: http, server, location
是否在响应中返回 Vary: Accept-Encoding
。
Syntax: gzip_vary on | off;
Default: gzip_vary off;
Context: http, server, location
变量
- 压缩率
$gzip_ratio
如何确定是否成功开启?
1 | [root@codezm ~]# curl -I "http://127.0.0.1/src/js/jquery.min.js" |
响应头中有 Vary
参数,证明已开启 gzip
压缩。
ngx_http_gzip_static_module
默认未编译,需在
configure
时增加--with-http_gzip_static_module
参数。
在启用 gzip
压缩后,因需要对 body
做压缩处理所以无法使用 sendfile 零拷贝技术。可通过 ngx_http_gzip_static_module
模块,它将检索请求文件相对路径下有没有同名 .gz
文件,有时将直接响应此文件。
Syntax: gzip_static on | off | always;
Default: gzip_static off;
Context: http, server, location
配置文件中增加 gzip_static on;
指令,开启此模块,还需要在访问文件相对目录下创建同名 .gz
压缩文件。
1 | [root@codezm js]# tar -zcvf jquery.min.js.gz jquery.min.js |
如何确定是否成功开启?
1 | [root@codezm ~]# curl -I -H "Accept-Encoding: gzip, deflate" "http://127.0.0.1/src/js/jquery.min.js" |
响应头中 Content-Length: 30939
大小与文件压缩后大小一致。
在使用 tar -zcvf
压缩文件后,发现浏览器并不能对压缩后文件正常解压并解析。而使用 gzip
命令压缩后则正常,文件也更小了。
1 | [root@codezm js]# gzip jquery.min.js |
ngx_http_gunzip_module
默认未编译,需在
configure
时增加with-http_gunzip_module
参数。
若服务器上仅存在 *.gz
压缩文件,没有源文件,且客户端不支持 gzip
压缩,可在配置文件中添加 gunzip on;
指令开启此模块。
- 当客户端不支持
gzip
压缩时,将在解压后再返回响应。 - 若客户端支持
gzip
压缩,则直接输出.gz
文件。
Syntax: gunzip on | off;
Default: gunzip off;
Context: http, server, location
Syntax: gunzip_buffers number size;
Default: gunzip_buffers 32 4k|16 8k;
Context: http, server, location