一、原理
Gzip
的作用就是压缩网络传输中的数据包,其原理如下图所示:
1.1 浏览器通过设置请求头,告诉服务端支持 gzip。
1.2 服务根据请求头,压缩传输的数据包(可以设置压缩等级)。
1.3 客户端收到数据,根据响应头来解压数据包。
1.3.1 查看浏览器支持压缩格式
二、配置
2.1 动态压缩
在Nginx的配置文件中可以通过配置 gzip
来压缩网络传输中的数据包,相关的指令可以配置在 http
块、server
块和 location
块中,Nginx可以通过:
ngx_http_gzip_module
模块
ngx_http_gzip_static_module
模块
ngx_http_gunzip_module
模块
对这些指令进行解析和处理。
所有资源满足条件的资源传递都回被压缩,会导致
sendfile
失效。
提示
可以使用 ngx_http_gzip_static_module
模块的 gzip_static
指令来解决 Gzip 和 sendfile 共存问题。
gzip on;
// 根据操作系统配置
// 32位:32 4k
// 64位:16 8k
gzip buffers 16 8k;
// 压缩等级:1~9,压缩率
gzip_comp_level 6;
// http 版本
gzip_http_version 1.1;
// 低于这个值不会压缩
gzip_min_length 256;
// 反向代理时的压缩限制
// off:不做限制, any:无条件压缩,其他根据上游服务器header配置
gzip_proxied any;
// 浏览器响应头显示 Vary
gzip_vary on;
// 那些MIME文件需要压缩
gzip_types text/plain applicaton/x-javascript text/css application/xml;
// 那些浏览器禁用压缩
gzip_disable <正则>
2.2 静态压缩
1、通常应用于CDN服务器,不需要原文件,只需要压缩文件时开启;
2、经常被访问的js、css或者其他静态页面
将某些资源预先压缩,这样就可以使用sendfile
这个功能。
官方配置文档:http://nginx.org/en/docs/http/ngx_http_gzip_static_module.html
我们需要重新编译 nginx 加入--with-http_gzip_static_module
模块
./configure --prefix=/usr/local/nginx --with-http_gzip_static_module
# 编译
make
# 这里不要 make install 不然配置文件会被重置掉
systemctl stop nginx
cp /usr/local/nginx/sbin/nginx /usr/local/sbin/nginx.old
cp ./objs/nginx /usr/local/nginx/sbin
cp ./objs/nginx /usr/bin/
nginx -V
配置语法:
Syntax: gzip_static on | off | always;
Default:
gzip_static off;
Context: http, server, location
on
开启压缩,会检查浏览器是否支持这个 gzip 格式压缩。
off
表示关闭该模块
always
不管浏览器支不支持,都会把这个压缩发送。通常是配合 ngx_http_gunzip_module 使用。如果浏览器不支持,就会把这个压缩包解压了再发送给浏览器。
注意
ngx_http_gzip_static_module
模块解决了 gzip 压缩 和 sendfile
文件共存的问题,若目录下面没有 *.gz
压缩文件,就会 404。所以我们需要预生成静态文件。
配置如下:
gzip file_name
要避免 404
问题,我们可以使用 ngx_http_gunzip_module
,它会判断浏览器是否支持 gzip
支持就压缩返回数据包,不支持就返回原始数据包。
gunzip on;
gzip_static always;