Nginx使⽤Gzip算法对报⽂进⾏压缩详解
什么是HTTP压缩
有时候客户端和服务器之间会传输⽐较⼤的报⽂数据,这时候就占⽤较⼤的⽹络带宽和时长。为了节省带宽,加速报⽂的响应速速,可以将传输的报⽂数据先进⾏压缩,然后再进⾏传输。
HTTP⽀持多种报⽂压缩算法,下⾯是⼀个普通的请求头,从Accept-Encoding字段可以看出⽀持gzip、deflate和br压缩算法。本⽂我们重点讲使⽤Gzip算法对报⽂进⾏压缩,⽐如Gzip来压缩HTML,Javascript, CSS⽂件,压缩完后能⼤⼤减少⽹络传输的数据量,提⾼了⽤户显⽰⽹页的速度。
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: max-age=0
Connection: keep-alive
Host: localhost:8000
If-Modified-Since: Tue, 21 Apr 2020 14:09:01 GMT
If-None-Match: "5e9efe7d-264"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
任何技术都是双⾯的,HTTP压缩虽然能减少带宽占⽤加快响应速度,但是因为需要额外的压缩和解压的过程,所以会占⽤些客户端或服务器端的计算资源。
了解HTTP的读者知道,可以对HTTP的报⽂体进⾏编码加密。其实HTTP压缩是⼀种特殊的编码⽅式,使⽤这种编码⽅式可以将报⽂⼤⼤减少,使⽤对应的解法⽅式⼜能还原最初的报⽂。(我们可以看出,其实压缩技术的本质就是⼀种编码⽅式)
HTTP压缩的使⽤场景
从上⾯对于HTTP压缩的介绍可以看出,这种技术是⼀种优化技术,常常⽤于压缩服务器端返回的报⽂以达到节省带宽加速响应的⽬的。
下⾯简单介绍⼀个HTTP使⽤Gzip压缩的过程。
浏览器发送Http request 给Web服务器, request 中有Accept-Encoding: gzip, deflate, br。 (告诉服务器,浏览器⽀持gzip 压缩)
Web服务器接到request后,先⽣成原始的Response, 其中有原始的Content-Type和Content-Length。
Web服务器通过Gzip,来对Response进⾏编码,编码后header中有Content-Type和Content-Length(压缩后的⼤⼩),并且增加了Content-Encoding:gzip. 然后把Response发送给浏览器。
浏览器接到Response后,根据Content-Encoding:gzip来对Response进⾏解码。获取到原始response后,然后显⽰出⽹页。
客户端也可以发送压缩数据给服务端,通过代码将请求数据解压即可,规范起见同样要在请求中加⼊Content-Encoding:gzip
⽤Nginx实现HTTP压缩
Nginx提供了对HTTP Gzip压缩的⽀持,这边我们就来看看适应Nginx怎么对返回报⽂进⾏压缩。
Nginx中通过ngx_http_gzip_module模块、ngx_http_gzip_static_module模块和ngx_http_gunzip_module模块来对Gzip功能进⾏⽀持。⼀般情况下Nginx默认会编译
这些模块,可以通过nginx -V命令看下你安装的nginx是否包含了这些模块。
Gzip相关的指令可以在配置⽂件的http块、server块或者location块中。
ngx_http_gzip_module模块
ngx_http_gzip_module模块主要负责Gzip功能的开启和设置,对响应数据进⾏在线实时压缩。该模块包含以下主要指令。
# 开启或者关闭Gzip功能,默认情况下,该指令设置为off,即不启⽤Gzip功能。只有将该指令设置为on时,其他指令设置才有效
gzip on | off
# 设置Gzip压缩⽂件使⽤缓存空间的⼤⼩
# 默认值是:gzip_buffers 32 4k|16 8k
gzip_buffers number size;
# 该指令⽤于设定Gzip压缩程度,包括级别1到级别9。
# 级别1表⽰压缩程度最低,压缩效率最⾼;级别9表⽰压缩程度最⾼,压缩效率最低,最费时间。
# 默认是1
gzip_comp_level level
# 针对不同种类客户端发起的请求,可以选择性地开启和关闭Gzip功能。
# ⽀持正则表达式,其中,regex 根据客户端的浏览器标志(User-Agent,UA)进⾏设置。
gzip_disable regex ...;
# 该设置使⽤了正则表达式,其可以匹配UC字符串中包含MSIE 4、MSIE 5和MSIE6的所有浏览器。
# 响应这些浏览器发出的请求时,Nginx服务器不进⾏Gzip压缩。
gzip_disable MSIE [4-6]\.;
# 早期的⼀些浏览器或者HTTP客户端,可能不⽀持Gzip⾃解压,因此⽤户有时会看到乱码,所以针
# 对不同的HTTP协议版本,需要选择性地开启或者关闭Gzip功能。该指令⽤于设置开启Gzip功能的最低HTTP协议版本。
# 默认设置为1.1版本,即只有客户端使⽤1.1及以上版本的HTTP协议时,才使⽤Gzip功能对响应输出数据进⾏压缩。
# 从⽬前来看,绝⼤多数的浏览器都⽀持Gzip⾃解压,⼀般采⽤默认值即可.
zip_http_version 1.0 | 1.1;
# 该指令设置页⾯的字节数,当响应页⾯的⼤⼩⼤于该值时,才启⽤Gzip功能。
# 建议设置成gzip_min_length 1024;
gzip_min_length length;
# ⽤于设置Nginx服务器是否对后端服务器返回的结果进⾏Gzip压缩;
# ⼀般情况下,后端都是⽤来做restAPI接⼝,返回的数据量不会太⼤,不建议进⾏压缩
# 真的需要对后端返回的数据进⾏压缩是可以再看下这块的内容
gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
# 设置MIME类型,被设置的类型将被压缩,默认值是:text/html
# 该变量还可以取“*”,表⽰对所有MIME类型的页⾯数据进⾏Gzip压缩
# ⼀般可以设置成:gzip_types text/plain application/javascript text/css text/xml
gzip_types mime-type ...;
# 开启后的效果是在响应头部添加了Accept-Encoding: gzip
gzip_vary on | off;
ngx_http_gzip_static_module模块
ngx_http_gzip_static_module模块主要负责搜索和发送经过Gzip功能预压缩的数据。这些数据以“.gz”作
为后缀名存储在服务器上。如果客户端请求的数据在之前被压缩过,并且客户端浏览器⽀持Gzip压缩,就直接返回压缩后的数据。
该模块与ngx_http_gzip_module模块的不同之处主要在于,该模块使⽤的是静态压缩,在HTTP响应头部包含Content-Length 头域来指明报⽂体的长度,⽤于服务器可确定响应数据长度的情况;⽽后者默认使⽤Chunked编码的动态压缩,其主要适⽤于服务器⽆法确定响应数据长度的情况,⽐如⼤⽂件下载的情形,这时需要实时⽣成数据长度。
该模块指令的使⽤和ngx_http_gzip_static_module模块类似,这边就不再具体展开了。⼤家可以参考官⽅⽂档
该模块是Nginx服务器的可选HTTP模块,如果要使⽤,必须在Nginx程序配置时添加--with-http_gzip_static_module指令。
ngx_http_gunzip_module模块
Nginx服务器⽀持对响应输出数据流进⾏Gzip压缩,这对客户端浏览器来说,需要有能⼒解压和处理Gzip压缩数据,但如果客户端本⾝不⽀持该功能,就需要Nginx服务器在向其发送数据之前先将该数据解压。这些压缩数据可能来⾃于后端服务器压缩产⽣或者Nginx服务器预压缩产⽣。ngx_http_gunzip_m
odule模块便是⽤来针对不⽀持Gzip压缩数据处理的客户端浏览器,对压缩数据进⾏解压处理的.
同样,对这个模块的指令使⽤就不具体展开了,⼤家可以参考官⽅⽂档
现代的浏览器⼀般都⽀持压缩功能,所以这个模块使⽤到的⼏率较⼩。
配置列⼦
tomcat虚拟主机怎么设置gzip  on;
gzip_min_length 1000;
gzip_proxied expired no-cache no-store private auth;
gzip_types  text/plain application/xml;
为了使得Nginx服务器能够在全局范围内应⽤Gzip压缩功能,可以将Gzip配置放在了http全局块中。如果要对各个虚拟主机差别性对待,我们可以在对应的server
块中添加各⾃的Gzip配置指令;
阅读延伸
平时开发的应⽤中可能不是所有的应⽤都使⽤了Nginx,看看其他Web服务器怎么开启对HTTP压缩的⽀持。
1. Spring Boot中内嵌的Tomcat开启压缩功能
Tomcat作为servet容器+http server,也是⽀持gzip压缩的。使⽤传统的Tomcat的话,我们只需要在l配置开启HTTP 压缩即可。
在embed版本下需要通过代码来配置。spring-boot内置的tomcat是embed版本,通过内置的autoconfig机制已经做了⼀些默认tomcat配置,但是对于⼀些不常⽤/⾼级的配置,spring-boot并没有提供⼊⼝。
不过由于spring bean的特性,可以覆盖默认装配的bean,包括tomcat相关的配置。使⽤TomcatConnectorCustomizer接⼝可以开启压缩配置。
public class ConnC1 implements TomcatConnectorCustomizer{
@Override
public void customize(Connector connector) {
ProtocolHandler protocolHandler = ProtocolHandler();
if(protocolHandler instanceof Http11NioProtocol){
Http11NioProtocol http11NioProtocol = (Http11NioProtocol)protocolHandler;
http11NioProtocol.setCompression("on");//default off
http11NioProtocol.setCompressibleMimeType();
http11NioProtocol.setCompressionMinSize(2048);//default 2048(B)
http11NioProtocol.setMaxKeepAliveRequests(1);//default 200
}
}
}
关于Tomcat对于HTTP压缩的⽀持,⼤家可以从Tomcat的CompressionConfig这个类开始寻线索。
其实如果只是简单开启对压缩功能的⽀持的话,只要在Spring Boot做下⾯的配置即可:
server:
compression:
enabled: true
min-response-size: 1024
mime-types:
application/json
总结
到此这篇关于Nginx的Gzip功能的⽂章就介绍到这了,更多相关Nginx的Gzip功能内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。