南琴浪博客

Nginx 启用 GZip 压缩

12/24/2017

站点在上线前,代码会做压缩,图片也会做压缩。而对于文本文档,在服务端发送数据之前进行压缩也很重要。GZip 压缩就是其中的一种压缩方式。

GZip 压缩

以下字段的写入配置段可以为:http server location

gzip            on;
gzip_vary       on;
gzip_min_length 1000;
gzip_buffers    16 10k;
gzip_comp_level 3;
gzip_proxied    any;
gzip_types      text/html;
gzip_http_version 1.0;
gzip_disable    "msie6";

其中:

gzip 值为 on/off,表示开启或关闭 GZip 压缩。

gzip_vary 输出 Vary 响应头,在 response header 中添加 Vary:Accept-Encoding 这一项,用于解决某些缓存服务的可能的毛病。

gzip_min_length 指定压缩数据的最小长度,只有大于或等于最小长度才会对其压缩。默认值是 20 字节。

gzip_buffers 指定 GZip 压缩的 buffer 区的数量和大小。

gzip_comp_level 压缩等级,可选值为 1~9。太高的压缩水平也会需要更多的 CPU 时间,建议指定 1~3 中的一级即可。

gzip_types 指定允许压缩的文件类型。本文中以 html 格式为例。更多文件格式,请参考 Nginx 的默认配置文件 mime.types

gzip_http_version 默认 Nginx 只对 HTTP/1.1 及以上的请求才会启用 GZip,因为早期的 HTTP/1.0 客户端的 GZip 有缺陷。现在已不用担心此问题,设置这项的值为 1.0 来启用对 HTTP/1.0 的 GZip 压缩。

gzip_disable 写入一个正则字符串,当 request header 中的 UserAgent 字段匹配这条正则时,response 不会启用 GZip 压缩。可用于解决在启用 GZip 压缩后某些浏览器的不兼容问题。指定值为 msie6 表示对 MicroSoft IE 4~6 浏览器不启用压缩。

GZip 压缩的增强插件

Nginx 默认就能提供上述功能,下面介绍两个 GZip 压缩的增强插件:

  • http_gzip_static_module
  • http_gunzip_module

若要启用上述插件,需要在编译 Nginx 时,加入相应模块:

./configure  ... --with-http_gzip_static_module --with-http_gunzip_module

http_gzip_static_module

# 配置段: http, server, location
# 值: on, off, always
gzip_static  ${value};

这个模块可以让 Nginx 发送一个已经压缩好的 .gz 文件,而不是发送普通文件。

在 gzip_static 的值设为 on 后,Nginx 会先判断客户端是否支持 .gz 文件,如果支持就发送 .gz 文件,不支持就发送普通文件。通过发送压缩过的文件来节省传输时间。

也可以将 gzip_static 的值设为 always,这时 Nginx 总是发送 .gz 文件(如果 .gz 文件存在的话),而不会检查客户端是否支持 .gz 文件。

http_gunzip_module

# 配置段: http, server, location
# 值: on, off
gunzip  ${value};

这个模块让 Nginx 发送一个经解压的文件给那些不支持 gzip 的客户端,并且经常与 ngx_http_gzip_static_module 搭配使用(令 gzip_static = always)。

http_gzip_static_module 发送一个已经压缩好的文件,而 http_gunzip_module 可以解压文件以让 Nginx 发送给不支持压缩的客户端。