1. 前言
在 Nginx 中与网页压缩相关的模块有两个:一个是 HttpGzipModule,另一个是 HttpGzipStaticModule。前者用于启用在文件传输过程中使用 gzip 压缩,而后者的作用是将一个文件以压缩的方式传递到一个支持压缩功能的客户端之前,首先检查是否已经存在相应的以 '.gz' 结尾的文件名格式,这样可以避免重复压缩而造成资源浪费.
因此,对于 Nginx 的网页压缩传输在 Nginx 中的配置将其分为两种模式:一种是动态的, 实时压缩输出(边压缩,边输出),而另一种则是静态的, 找到同名文件的 .gz 格式文件就输出。
2. HttpGzipModule
HttpGzipModule 用于在文件传输过程中启用 gzip 压缩,压缩率通过变量 $gzip 来设定。
2.1 示例
2.2 指令
指令名称:gzip 语法:gzip on | off 默认值:gzip off 使用环境:http、server、location 功能:启动或禁止 gzip 压缩功能。 指令名称:gzip_buffers 语法:gzip_buffer number size 默认值:gzip_buffers 4 4k/8k 使用环境:http、server、location 功能:该指令用于指定存放被压缩响应的缓冲的数量和大小。如果没有设置大小,那么一个缓冲的大小等于一个页码的大小,具体页码的大小依赖于所在的系统平台,不是 4KB 就是8KB。 获取系统内存页码大小的方法很简单: [root@10.0.10.158 ~]#getconf PAGE_SIZE 4096 指令名称:gzip_comp_level 语法:gzip_comp_level 1…9 默认值:gzip_comp_level 1 使用环境:http、server、location 功能:该指令用于设定压缩级别,可以设定的级别从 1 - 9,1 是最小的压缩率,也是最快的,占用CPU资源最少;而9是压缩率最高的,也是最慢的,占用cpu资源最大。 指令名称:gzip_disable 语法:gzip_disable regex 使用环境:http、server、location 功能:可以通过该指令对一些特定的用户代理不使用压缩功能,就可以使用正则表达式,但这需要PCRE的支持。该指令从0.6.23以后才开始提供。从 Nginx 0.7.63版本后,可以使用"msie6" 来禁止对 IE5.5 和 IE 6 的压缩。 指令名称:gzip_http_version 语法:gzip_http_version 1.0 | 1.1 默认值:gzip_http_version 1.1 使用环境:http、server、location 功能:该指令用于决定对指定的 HTTP 请求协议版本进行压缩或者不压缩,其依赖于客户端的HTTP请求版本。 指令名称:gzip_min_length 语法:gzip_min_length length 默认值:gzip_min_length 0 使用环境:http、server、location 功能:该指令用于设置响应体的最小长度,单位为字节。如果响应体的长度低于指定的值,那么就不使用压缩。长度的决定从 'Content-Length' 头获取。 指令名称:gzip_proxied 语法:gzip_proxied [ off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ] 默认值:gzip_proxied off 使用环境:http、server、location 功能:该指令用于设置启用或禁止从代理服务器上收到的响应体 Gzip 压缩功能。 指令名称:gzip_types 语法:gzip_types mime-type [ mime-type… ] 默认值:gzip_types text/html; 使用环境:http, server, location 功能:该指令用于设定除了默认的 text/html MIME 类型外,对其他的那些 MIME 类型也启用压缩功能。 指令名称:gzip_vary 语法:gzip_vary on | off 默认值: gzip_vary off 使用环境:http、server、location 功能:该指令用于设定是否向响应数据包添加 Vary: Accept-Encoding HTTP 头(header)。
gzip 指令是挺多的,一般常用的如下:
gzip on; # ¿ªÆôѹËõ gzip_disable "msie6"; # IE ½ûֹѹËõ gzip_proxied any; # ÈκÎÎļþ¶¼Ñ¹Ëõ gzip_comp_level 4; # ѹËõµÈ¼¶ gzip_vary on; # ͨ¹ý¿Í»§¶ËÅжÏѹËõ gzip_min_length 1k; # ѹËõµÄ×îСÈÝÁ¿ # ѹËõ¸ñʽ£¬¸ù¾ÝÐèÇóµ÷Õû gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
2.3 测试
生成一个较大的页面
浏览器直接访问
查看有没有开启gzip压缩功能
curl -I -H "Accept-Encoding: gzip,deflate" http://10.0.10.158/hello.html
3. HttpGzipStaticModule
gzip_static 生效的前提是 nginx 开启了 gzip_static压缩并且请求目录下存在名称相同且以 .gz 结尾的文件。
使用 gzip_static 压缩的话要先准备好压缩后的 gz 文件,并且服务器会消耗更多的空间来存储压缩文件和原文件,这个有利有弊要自己衡量。
3.1 指令
gzip_static
语法:gzip_static on | off
默认值:gzip_static off
使用环境:http、server、location
功能:用于启用 HttpGzipStaticModule
3.2 测试
通过访问,系统会去读页面文件,文件的最新访问时间会被修改。所以通过文件的访问时间可以确定是哪个文件被访问了。
接下来,通过浏览器访问:
再次查看 hello.html* 最新访问时间:
通过对比,本次浏览器访问的是 hello.html.gz 文件,文件大小为: 244K,通过浏览器访问:243.55KB。
4. 总结
gzip 和 gzip_static 模块的区别就是:gzip是动态压缩,压缩过程中会消耗一定的资源,gzip_static 是需要提前将页面转换为.gz格式的文件,需要额外的空间来存储。它们的压缩比例和传输大小都是通过相同的参数设定的。
可以这么说:
gzip 是通过计算换空间,gzip_static 是通过空间换计算。