实战Nginx(4)-压缩模块与http首部响应报文模块

默认情况下,Nginx的gzip压缩是关闭的, gzip压缩功能就是可以让你节省不少带宽,但是会增加服务器CPU的开销,Nginx默认只对text/html进行压缩 ,如果要对html之外的内容进行压缩传输,我们需要手动调整。


一.nginx资源文件压缩模块介绍

基于gzip实现资源文件压缩模块:

发送给客户端的资源结果做压缩:

ngx_http_gzip_module

整个网站内容压缩了:

ngx_http_gzip_static_module

需要编译:--with-http_gzip_static_module 

此模块的作用就是在接到请求后,会到url相同的路径的文件系统去找扩展名为“.gz”的文件,如果不存在,再将文件进行gzip压缩,再发送出去,这样可以避免重复的压缩无谓的消耗资源,这个模块不受gzip_types限制,会对所有请求有效。所以建议不要在全局上使用,因为一般来说大部分都是动态请求,是不会有.gz这个文件的,建议只在局部我们确认有.gz的目录中使用。  

我们常用的是对发送给客户端的资源结果做压缩,那我们就关注一下ngx_http_gzip_module模块;


二.gzip压缩模块详解

1.模块安装

gzip压缩模块是ngx_http_gzip_module,是nginx内置的。


2.模块指令

决定是否开启gzip模块

gzip

语法:
Syntax:gzip on | off;
默认关闭:
Default:gzip off;
配置段:
Context:http, server, location, if in location


设置gzip申请内存的大小,其作用是按块大小的倍数申请内存空间

gzip_buffers 

语法:
Syntax:gzip_buffers number size;
默认值:
Default:gzip_buffers 32 4k|16 8k;
配置段:
Context:http, server, location


设置gzip压缩等级,等级越底压缩速度越快文件压缩比越小,反之速度越慢文件压缩比越大

gzip_comp_level

语法:
Syntax:gzip_comp_level level;
默认压缩比是1:
Default:gzip_comp_level 1;
配置段:
Context:http, server, location


当返回内容大于此值时才会使用gzip进行压缩,以K为单位,当值为0时,所有页面都进行压缩

gzip_min_length

语法:
Syntax:gzip_min_length length;
默认值是20k:
Default:gzip_min_length 20;
配置段:
Context:http, server, location


用于识别http协议的版本,早期的浏览器不支持gzip压缩,用户会看到乱码,所以为了支持前期版本加了此选项,目前此项基本可以忽略

gzip_http_version

语法:
Syntax:gzip_http_version 1.0 | 1.1;
默认版本是1.1:
Default:gzip_http_version 1.1;
配置段:
Context:http, server, location


Nginx做为反向代理的时候启用

gzip_proxied

语法:
Syntax:gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
默认关闭:
Default:gzip_proxied off;
配置段:
Context:http, server, location

指令参数详解:

off        #关闭所有的代理结果数据压缩
expired    #启用压缩,如果header中包含”Expires”头信息
no-cache   #启用压缩,如果header中包含”Cache-Control:no-cache”头信息
no-store   #启用压缩,如果header中包含”Cache-Control:no-store”头信息
private    #启用压缩,如果header中包含”Cache-Control:private”头信息
no_last_modified   #启用压缩,如果header中包含”Last_Modified”头信息
no_etag    #启用压缩,如果header中包含“ETag”头信息
auth       #启用压缩,如果header中包含“Authorization”头信息
any        #无条件压缩所有结果数据


设置需要压缩的MIME类型,非设置值不进行压缩

gzip_types

语法:
Syntax:gzip_types mime-type ...;
默认压缩html文件:
Default:gzip_types text/html;
配置段:
Context:http, server, location


3.nginx官网实例

gzip            on;
gzip_min_length 1000;
gzip_proxied    expired no-cache no-store private auth;
gzip_types      text/plain application/xml;


解释:

开启gzip压缩
最小压缩文件大小是1000kb
如果header中包含”Cache-Control:no-cache”头信息,”Cache-Control:no-store”头信息,Cache-Control:private”头信息,“Authorization”头信息就启用压缩
压缩的类型为text和xml文件



三.http首部报文模块

1.模块介绍

ngx_http_headers_module模块提供了两个重要的指令add_header和expires,来添加 “Expires” 和 “Cache-Control” 头字段,对响应头添加任何域字段。add_header可以用来标示请求访问到哪台服务器上。expires指令用来对浏览器本地缓存的控制。


2.模块指令

add_header指令

语法:
Syntax:add_header name value [always];
默认值:
Default:—
配置段:
Context:http, server, location, if in location


对响应代码为200,201,204,206,301,302,303,304,或307的响应报文头字段添加任意域。如:

add_header From stu31.com


expires指令

语法:
Syntax:expires [modified] time;
expires epoch | max | off;
默认关闭:
Default:expires off;
应用配置段:
Context:http, server, location, if in location

在对响应代码为200,201,204,206,301,302,303,304,或307头部中是否开启对“Expires”和“Cache-Control”的增加和修改操作。

可以指定一个正或负的时间值,Expires头中的时间根据目前时间和指令中指定的时间的和来获得。


epoch表示自1970年一月一日00:00:01 GMT的绝对时间,max指定Expires的值为2037年12月31日23:59:59,Cache-Control的值为10 years。

Cache-Control头的内容随预设的时间标识指定:

·设置为负数的时间值:Cache-Control: no-cache。

·设置为正数或0的时间值:Cache-Control: max-age = #,这里#的单位为秒,在指令中指定。

参数off禁止修改应答头中的”Expires”和”Cache-Control”。


实例:对图片,flash文件在浏览器本地缓存30天

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
 {
           expires 30d;
 }



四.对虚拟主机启用gzip压缩和自定义http首部报文


1.修改虚拟主机配置文件,加入gzip压缩和http首部报文

[root@www ~]# vim /etc/nginx/extra/nginx-vhost.conf 
server {
        gzip  on;
        gzip_http_version 1.1;
        gzip_vary on;
        gzip_proxied expired no-cache no-store private auth;
        gzip_comp_level 7;
        gzip_buffers 16 8k;
        gzip_types text/plain text/html application/xml application/json;
        gzip_min_length 1024;
        listen   *:80 default_server;
        server_name www.stu31.com;
        index index.html index.htm ;
        root  /www/vhosts/www1;
        add_header X-header TestHeader2014;
        access_log  /var/log/nginx/www.stu31.com.log main ;
        location /status {
                stub_status on;
                auth_basic "Nginx-status";
                auth_basic_user_file /etc/nginx/.htpasswd;
                allow 172.16.0.0/16;
                deny all;
        }
}


2.语法检查:

[root@www ~]# service nginx configtest
nginx: [warn] duplicate MIME type "text/html" in /etc/nginx/extra/nginx-vhost.conf:8
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

原因:text/html根本就不需要写的,gzip默认就会压缩它的,只不过以前的nginx版本不提示这个警告而已,新版本的会出这个警告。



3.重启nginx服务:

[root@www ~]# service nginx restart                 
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Stopping nginx:                                            [  OK  ]
Starting nginx:                                            [  OK  ]

4.连接测试:

可以看见响应报文头部内有自定义的:

[root@www ~]# curl -I http://172.16.31.40
HTTP/1.1 200 OK
Server: nginx/1.6.2
Date: Sat, 27 Dec 2014 05:56:57 GMT
Content-Type: text/html
Content-Length: 27
Last-Modified: Sat, 27 Dec 2014 02:09:31 GMT
Connection: keep-alive
ETag: "549e14db-1b"
X-header: TestHeader2014
Accept-Ranges: bytes


压缩也是成功的:

技术分享

至此,nginx的资源压缩模块和http头部报文模块介绍完毕。


本文出自 “龙之守护” 博客,请务必保留此出处http://sohudrgon.blog.51cto.com/3088108/1596696

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。