nginx gzip 以及gzip_static 区别和用法

766 阅读4分钟

gzip 技术早期用于unix系统的文件压缩,后广泛应用于HTTP协议以用于提升web应用性能。这就要求客户端浏览器以及web代理服务器,例如apache nginx iis 必须共同支持gzip。目前主流的浏览器以及代理服务器都支持gzip。

可以在http请求头中设置:accept-encoding:gzip 告知服务器支持gzip压缩。 服务器接收到后就会发送压缩后的内容。

image.png

相应的,浏览器接收到内容后就会判断内容是否压缩。是就需要解压缩在展示。

需要注意点是并不是需要无脑开启Gzip,首先要知道gzip对于文本类文件压缩的效果最好。这就是为什么前端工程化体系中,webpack vite rollup 等都有相应的插件支持将文本类文件压缩为.gz文件。

nginx 中gzip模块是内置的,只不过是需要手动到 nginx.conf中去掉注释,但是gzip_static并不是内置的,直接配置 gzip_static on; 会提示错误:unknown directive gzip_static

nginx 配置开启并安装 gzip_static,其对应模块为 --with-http_gzip_static_module 配置:

image.png

image.png

#nginx  开启和关闭gzip 以及gzip_static
这里可以单独设置到http下,也可以单独设置到某一个虚拟服务器下,如上二图,具体的server下还是http下,server外。
gzip on;
gzip_static on;
# gizp压缩起点,文件大于1k才进行压缩
gzip_min_length 1k;
# 设置压缩所需要的缓冲区大小,以4k为单位,如果文件为7k则申请2*4k的缓冲区 
gzip_buffers 4 16k;
# 设置gzip压缩针对的HTTP协议版本
gzip_http_version 1.1;
# gzip 压缩级别,1-9,数字越大压缩的越好,也越占用CPU时间
gzip_comp_level 2;
# 需要压缩的文件mime类型
gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml;
# 是否在http header中添加Vary: Accept-Encoding,建议开启
gzip_vary on;
# nginx做前端代理时启用该选项,表示无论后端服务器的headers头返回什么信息,都无条件启用压缩
gzip_proxied expired no-cache no-store private auth;
# 不启用压缩的条件,IE6Gzip不友好,所以不压缩
gzip_disable "MSIE [1-6]\.";

首先如果是安装了nginx的

那么进入sbin 目录下,一般位于:/usr/local/nginx/sbin

键入: ./nginx -V 查看模块信息 是否包含 --with-http_gzip_static_module

一般应该是没有的,nginx 默认是没有开启这个模块的。进入下一步:

安装 --with-http_gzip_static_module

cd /usr/local/nginx/sbin

mv nginx nginxold :将nginx目录下sbin目录中的nginx二进制文件进行更名

cd /usr/local/nginx-x.xx.x/ :进入当时安装nginx的安装目录

./configure --with-http_gzip_static_module: 配置模块参数

make : 编译

mv objs/nginx /usr/local/nginx/sbin : 将obj下的nginx 二进制文件拷到原来的sbin目录下

make upgrade :更新 nginx

如果没有安装,那么安装到 configure 这一步,务必把 这个模块-with-http_gzip_static_module 添加后在编译安装。

关于安装了nginx,添加上gzip_static模块这里,按照查阅的,有说直接./configure --with-http_gzip_static_module 从这步开始的,然后后面执行的跟第一次安装同样的指令 make 后 make install,我这样做,配置gzip_static:on; 是不会报错了,但是发现请求回来的数据其实是没有走gzip_static的。明明前端已经生成gz文件了,但是去调试窗口-网络下,发现响应头不带content-encoding:gzip。反正就是折腾了一会儿,就怀疑gzip_static 其实并没有真的生效,不报错了只是安装上了,nginx其实没有真的识别到这个模块 *

后续冲浪就发现了除了configure 中需要添加模块,还需要更新 ./nginx 这个二进制文件。后续就发现应用上了。

补充一下 gzip 和gzip_static 区别在于 gzip是动态压缩,是在nginx服务器端将内容压缩后响应,然后http传过去, gzip_static 是静态压缩,需要前端提前将文件压缩为.gz,并且跟源文件需要在一个目录下。压缩后,nginx直接将预先准备静态资源.gz文件返回,浏览器接收到后解压缩展示。

最后一个点,如何判断gzip是否正常工作,并且如何区分是动态还是静态压缩呢?

  • 是否存在压缩 ,请求头带content-encoding:gzip, 表示启用gzip,否则就是没启用,也就无所谓判断动静态了。
  • 根据响应头Etag判断是动态还是静态, 包含W\的是动态压缩,不带的是静态压缩

最后附上一张优化后的图:

image.png

image.png