GZIP是什么?
gzip是GNU Zip的简称,是一个在Linux和其他类Unix系统中广泛使用的命令行压缩工具。它基于DEFLATE算法来有效减少文件大小,从而节省存储空间并加速文件传输。gzip可以压缩任何类型的文件,但特别适合文本文件,因为它对文本中的重复数据压缩效果显著。
GZIP解决什么问题?
GZIP能够压缩服务器端的文件,减小Http传输过程文件的体积,在相同带宽前提下,减少传输时间。
GZIP请求和响应的协议是:
请求头:accept-encoding:gzip
例如,B站js文件的请求头是:
Accept-Encoding: gzip, deflate, br, zstd
响应头:content-type: gzip
算法还可以有其他类型,例如,br。
响应头中的
Content-Encoding: br
表明服务器使用了Brotli算法对响应主体(即发送给客户端的实际数据内容)进行了压缩。Brotli是一种无损压缩算法,由Google开发并在2015年推出,设计初衷是为了提高网页内容的加载速度。与传统的gzip和deflate压缩算法相比,Brotli通常能提供更高的压缩比率,尤其是在压缩文本数据时,这使得通过网络传输的数据量减少,从而加快页面加载时间。现代的大多数浏览器都已经支持Brotli解码。
GZIP具体过程:
问题:
1. gzip是服务器端做压缩,为什么需要前端做?
服务器去做Gzip 压缩,它会用 CPU 去进行处理。大量的gzip压缩处理,势必会影响服务器的响应处理时间。前端提前做gzip的压缩处理,可以减少服务器端CPU的压力。
2. 是不是所有文件都需要做gzip压缩?
最终的目标是为了减少响应时间。响应时间包括传输时间和做Gzip压缩的时间。如果压缩占用的时间,比传输减少的时间多,那么就没必要采用Gzip压缩。这一点可以从nginx的配置中看出来。
nginx开启Gzip:
# gzip模块设置
gzip on; #开启gzip压缩
gzip_min_length 1k; #最小压缩文件大小
gzip_buffers 4 16k; #压缩缓冲区
gzip_http_version 1.1; #压缩版本
gzip_comp_level 2; #压缩等级
# 压缩类型
gzip_types text/plain;
# 用于设置使用Gzip进行压缩发送是否携带“Vary:Accept-Encoding”头域的响应头部
# 主要是告诉接收方,所发送的数据经过了Gzip压缩处理
gzip_vary on; // 作用是指示 Nginx 在响应头中添加 Vary: Accept-Encoding 字段
从配置可以看出,可以配置最小压缩文件大小,压缩登记、压缩文件的类型。Gzip对大型项目是能够提供帮助,而对于小文件就没必要使用Gzip。