ngx_http_gzip_static_module模块处理的指令

ngx_http_gzip_static_module模块主要负责搜索和发送经过gzip功能压缩的数据。这些数据以“.gz”作为后缀存在在服务器上,如果客户端请求的数据在之前被压缩过,并且客户端浏览器支持gzip压缩,就直接返回压缩后的数据。
该模块与ngx_http_gzip_module模块的不同之处主要在于,该模块使用的是静态压缩,在HTTP头部包含content-length头域来指明报文体的长度,用于服务器可确定响应数据长度的情况;而后者默认使用chunked编码的动态压缩,主要使用域服务器无法确定响应数据长度的情况,比如大文件下载的情形,这时需要生产实时数据长度。
与该模块相关的主要指令有以下几个:gzip_static、gzip_http_version、gzip_proxied、gzip_disable和gzip_vary等。其中gzip_static指令用于启用和关闭该模块的功能,语法为:

gzip_static on | off | always;
  • on,开启该模块的功能。
  • off、关闭该模块的功能;
  • always,一直发送gzip预压缩文件,而不检查客户端浏览器是否支持gzip压缩。
    其他指令与ngx_http_gzip_module模块下使用法师相同,请参与上一节。

需要注意的是gzip_proxied指令只接受一下设定:

gzip_proxied expired no-cache no-store private auth;

该指令需要使用需要进行编译安装 --with-http_gzip-static_module指令。

gzip压缩功能的使用

由于gzip压缩功能在使用过程中容易发生莫名其妙的问题,作者对常见的2类问题进行了分析和说明,一类问题涉及客户端浏览器gzip压缩功能的支持,另一类问题涉及Nginx服务器做为代理服务器时与其他服务器在交互过程中gzip压缩功能的支持。

#gzip压缩功能综合配置实例,沿用第二章的配置添加gzip压缩功能的配置
###全局块 开始###

user nobody nobody;                                    #配置允许运行Nginx服务器的用户和用户组

worker_processes 3;                                    #配置允许Nginx进程生成的worker process数

error_log logs/error.log;                               #配置Nginx服务器运行的错误日志存放路径

pid nginx.pid;                                          #配置Nginx服务器运行时的pid文件存放路径和名称

####全局模块 结束####

###events块 开始###

events
{
use epoll;                                        #配置事件驱动模型
worker_connections 1024;                          #配置最大连接数
}

####events块 结束####

###http块 开始###

http {
include mime.types;                               #定义MIME-TYPE
default_type application/octet-stream;

sendfile on;                                      #配置允许使用sendfile方式传输
keepalive_timeout 65;                             #配置连接超时时间
log_format access_log '$remote_addr-[$time_local]-"$request"-"$http_user_agent"';     #配置请求处理日志的格式

######gzip功能的配置 开始#######
gzip on;                                          #开启gzip功能
gzip_min_length 1024;                             #响应页数据上限
gzip_buffer 4 16k;                                #缓存空间大小
gzip_comp_level 2;                                #压缩级别为2
gzip_types text/plain application/x-javascript text/css text/html application/xml;        #压缩源文件类型
gzip_vary on;                                     #启用压缩标示
gzip_static on;                                 #检查与压缩文件
gzip_disable “MSIE[1-6]\”;                        #禁用IE1-6的压缩功能
######gzip功能的配置 结束#######


###server块 开始###
server {                                          #配置虚拟机主机myserver1
listen 8081;                                 #配置监听端口和主机名称(基于名称)
server_name myServer1;

access_log /myweb/server1/log/access.log;    #配置错误页面
error_page 404 /404.html;

location /server1/location {                 #配置处理/server1/location1请求的location
root /myweb;
index index.svr1-loc1.htm;
}

location /server1/location2 {                #配置处理/server1/location2请求的location
root /myweb;
index index.srv-loc2.htm;
}



}

server {                                          #配置虚拟主机myserver2
listen 8082;
server_name 192.168.1.3;
gzip off;                                   #不开启gzip压缩
access_log /myweb/server2/log/access.log;
error_page 404 /404.html;                    #对错误页面404.html做了定向配置

location /server2/location1 {
root /myweb;
index index.srv2-loc1.htm;
}

location /svr2/loc2 {
alias /myweb/server2/location2/;         #对location的URI进行更改
index index.ser2-loc2.htm;
}

location = /404.html {                        #配置错误页面转向
root /myweb/;
index 404.html;
}


}
###server块 结束###

}
####http块 结束####

在该示例中,配置开启gzip功能(代码:gzip_min_length 1024;),Nginx服务器用于gzip压缩的缓存空间大小为4*16kb=64kb(代码:gzip_buffers 4 16k;).当响应页数据大于1KB时(代码gzip_min_length 1024)对类型为TXT数据、JS数据、css数据和xml数据(代码:gzip_types text/plain application/x-javascript text/css text/html application/xml;)进行级别为2的快速gzip压缩(代码:gzip_comp_level 2;),并在返回数据头部添加“vary:accept-encoding”头域通知客户端浏览器使用了gzip压缩(代码:gzip_vary on;).如果检测到客户端浏览器不支持gzip压缩功能,Nginx服务器自动将压缩过程的数据压缩后再发送。
为了使得Nginx服务器能够在全局范围内应用gzip压缩功能,笔者将其放在了http全局块中。如果要对各个虚拟主机差别对待,我们可以在对应的server块中添加各自的gzip指令;对于少数虚拟主机的差别对待,也可以在http全局块中配置gzip指令后在对应少数的server块中添加配置。比如如果要关闭虚拟主机192.168.1.3不开启gzip压缩功能,只需要在server块中添加(gzip off;),见上面代码。

gzip压缩功能与IE6浏览器运行脚本的兼容问题
该问题设计客户端浏览器是否支持gzip压缩功能。本节以IE6浏览器为例分析产生文件的原因,说明处理问题的方法。IE6对gzip的压缩支持非常不完善,导致Nginx服务器在内的所有web服务器的gzip压缩功能与IE6的兼容问题一直困扰许多用户,虽然如今IE6使用越来越少但是还需要总结相关问题和解决办法。
根据作者的经验和相关资料的整理,Nginx服务器对开启对JavaScript脚本的gzip功能压缩后,遇到IE6浏览器处理器响应数据时,经常会遇到JavaScript脚本运行不正常的问题(具体问题参加书本)。
解决办法,添加gzip_disable指令:

gzip_disable “MSIE[1-6]\”;

Nginx与其他服务器交换时产生的gzip压缩功能问题
该类问题产生原因分为2类,一类是多层服务器同时开启gzip压缩功能导致;另一类是多次服务器之间对gzip压缩功能支持能力不同导致。gzip压缩功能在各种服务器产品中广泛应用,包括IIS、Tomcat和Apache等多种服务器都支持该功能。一般情况下如果Nginx开了gzip压缩,后端就关闭压缩功能,否则会导致浏览器缺失JavaScript脚本,而返回304,即请求的网页与上次没有更新,当关闭其中一台服务器的gzip压缩后,服务正常。



最后修改:2021 年 02 月 08 日
如果觉得我的文章对你有用,请随意赞赏