阿夸漫谈

nginx 实践之 gzip 压缩

发表于 2019-02-19

1. 什么是 gzip 压缩

此处 gzip 压缩指的是 http 采取的压缩编码方式,属于 http 内容编码的一种。最初这种编码方式用于 UNIX 系统的文件压缩。

采取 gzip 压缩编码可以减小 http 传输的内容,从而提高响应速度和首屏渲染速度。现在的浏览器基本都支持 gzip 压缩,所以开启 gzip 是优化用户体验的重要方式之一。

2. gzip 相关 http 头和流程

2.1 请求头中 Accept-Encoding

Accept-Encoding 是请求首部。作用是告诉服务器,当前浏览器支持的压缩编码。通常不需要指定,默认值是 *,即当前浏览器支持的压缩编码均可。

Accept-Encoding 可选值如下:

Accept-Encoding 值 意义
gzip 表示采用 Lempel-Ziv coding (LZ77) 压缩算法。
compress 表示采用 Lempel-Ziv-Welch (LZW) 压缩算法。
deflate 表示采用 zlib 结构和 deflate 压缩算法
br 表示采用 Brotli 算法的压缩格式。
identity 表明不对实体进行编码
* 默认值,不代表任意算法都支持,而仅仅表示算法之间无优先次序
;q= (qvalues weighting) 值代表优先顺序

2.2 响应头中 Content-Encoding

Content-Encoding 是对应的响应首部。作用是告诉浏览器,当前对响应体压缩采用的压缩编码。响应头中还有 Content-TypeContent-Length,告诉客户端实际返回内容的类型和长度

Content-Encoding 常见值如下:

Content-Encoding 值 说明
gzip 表示采用 Lempel-Ziv coding (LZ77) 压缩算法,编码方式最初由 UNIX 平台上的 gzip 程序采用
compress 表示采用 Lempel-Ziv-Welch (LZW) 压缩算法,名称来自UNIX系统的 compress 程序
deflate 表示采用 zlib 结构和 deflate 压缩算法
br 表示采用 Brotli 算法的压缩格式。
identity 默认值,表明没有对实体进行编码

2.3 具体流程

  1. 浏览器发送请求到服务器,请求头中 Accept-Encoding: gzip, deflate。 (告诉服务器, 浏览器支持 gzip、deflate 压缩)
  2. 服务器收到请求后,生成 Response, 其中有 Content-TypeContent-Length
  3. 服务器进行 Gzip 压缩,对响应体进行压缩,修改 Content-Length, 响应头中增加 Content-Encoding:gzip
  4. 浏览器收到响应后,根据 Content-Encoding:gzip 来对 Response 进行解码。
    Accept-Encoding-Content-Encoding

3 nginx 设置 gzip

以 nginx 为例,说明如何开启 gzip。nginx 中通过 ngx_http_gzip_module 模块实现 gzip 压缩,配置在 http, server, location 作用域均可。

3.1 基本参数

选项 语法 默认值 说明
gzip gzip on|off gzip off; 开启或者关闭gzip模块
gzip_buffers gzip_buffers number size; gzip_buffers 32 4k|16 8k; 设置压缩响应体的缓存区的 number 和 size
gzip_comp_level gzip_comp_level 1..9 gzip_comp_level 1; 设置压缩等级,等级越高压缩越小但处理速度越慢
gzip_disable gzip_disable regex …; —— 请求头 User-Agent 值正则匹配,关闭 gzip
gzip_http_version gzip_http_version 1.0 | 1.1; gzip_http_version 1.1; 允许压缩的最低 http 版本
gzip_min_length gzip_min_length length; gzip_min_length 20; 压缩后的页面最小字节数,响应头 Content-Length 受此限制,小于该长度则不压缩
gzip_proxied gzip_proxied off | expired | no-cache… gzip_proxied off; 默认不开启,Nginx 反向代理的时候启用,启用必须保证响应中有 “Via” 的响应头。根据请求头、响应头可以设置不同的值。
gzip_types gzip_types mime-type …; gzip_types text/html; 匹配 MIME 类型进行 gzip 压缩。* 代表任何类型都进行压缩(nginx 版本最低要求0.8.29)。”text/html”类型总是会被压缩的。
gzip_vary gzip_vary on | off; gzip_vary off; gzip 开启时是否向响应头中插入 Vary: Accept-Encoding

3.2 参考示例

gzip on; # 开启 gzip
gzip_disable "msie6"; # 等价于 MSIE [4-6]\.,ie 低版本不开启
gzip_vary on; # 响应头中加入 Vary: Accept-Encoding
gzip_proxied any; # 反向代理时无条件启动压缩
gzip_comp_level 2; # 压缩等级
gzip_buffers 16 8k; # 压缩缓存区设置
gzip_http_version 1.1; # 压缩最低 http 版本
gzip_types *; # 任何类型都进行压缩(nginx 版本最低要求0.8.29)

(完)

目录