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_module模块便是用来针对不支持Gzip压缩数据处理的客户端浏览器,对压缩数据进行解压处理的.
同样,对这个模块的指令使用就不具体展开了,大家可以参考官方文档
现代的浏览器一般都支持压缩功能,所以这个模块使用到的几率较小。
配置列子
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的话,我们只需要在server.xml配置开启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 = connector.getProtocolHandler();
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压缩功能
我们在开发网站的时候,应该要考虑到pv,因为pv比较大可能会造成服务器带宽不够用,进而导致用户体验变差. 这个时候我们就可以考虑用nginx的gzip功能. 在nginx中开启gzip压缩功能很简单, ...
- 开启Nginx的gzip压缩功能详解
默认情况下,Nginx的gzip压缩是关闭的, gzip压缩功能就是可以让你节省不少带宽,但是会增加服务器CPU的开销哦,Nginx默认只对text/html进行压缩 ,如果要对html之外的内容进行 ...
- Nginx性能优化功能- Gzip压缩(大幅度提高页面加载速度)
Nginx开启Gzip压缩功能, 可以使网站的css.js .xml.html 文件在传输时进行压缩,提高访问速度, 进而优化Nginx性能! Web网站上的图片,视频等其它多媒体文件以及大文件,因 ...
- Nginx 开启gzip 压缩,实现基于域名的虚拟主机。
一:gzip(GNU-ZIP)是一种压缩技术. 经过gzip压缩后页面大小可以变为原来的30%甚至更小,这样,用户浏览页面的时候速度会块得多. gzip 的压缩页面需要浏览器和服务器双方都支持,实际上 ...
- nginx的gzip模块
gzip模块是我们在nginx里面经常用到的,压缩响应的数据,这通常有助于将传输数据的大小减少一半甚至更多.可以让我们访问网站更为流畅. Syntax Default Context gzip on ...
- tomcat服务器开启gzip功能的方法
http://blog.csdn.net/wang_159369/article/details/8107163 tomcat5.0以后的版本是支持对输出内容进行gzip格式的压缩的.该功能默认是关闭 ...
- 入门系列之在Nginx配置Gzip
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由小铁匠米兰的v 发表于云+社区专栏 简介 网站加载的速度取决于浏览器必须下载的所有文件的大小.减少要传输的文件的大小可以使网站不仅加载 ...
- Nginx启用Gzip压缩js无效的原因
Nginx启用gzip很简单,只需要设置一下配置文件即可完成,可以参考文章Nginx如何配置Gzip压缩功能.不过,在群里常有人提到,他们的网站Gzip压缩虽然成功了,但检测到JS仍然没有压缩成功,这 ...
- Nginx开启gzip提高页面加载速度
今天发现页面多次请求数据且加载的数据大,需要等待的时间很长 记得Nginx有gzip,可以对数据进行压缩 gzip是nginx服务器的ngx_http_gzip_module模块提供的在线实时数据压缩 ...
随机推荐
- PyQt样式设计
QSS QSS(Qt Style Sheets)即PyQt样式表,是用来定义控件外观的一种机制.QSS内部实现大量参考了CSS,但是功能没有CSS强大,主要体现在选择器少,属性少等. 使用QSS 格式 ...
- 深入探究JVM之内存结构及字符串常量池
前言 Java作为一种平台无关性的语言,其主要依靠于Java虚拟机--JVM,我们写好的代码会被编译成class文件,再由JVM进行加载.解析.执行,而JVM有统一的规范,所以我们不需要像C++那样需 ...
- WBF交易所如何使用二次验证码/谷歌身份验证器
一般点账户名——设置——安全设置中开通虚拟MFA两步验证 具体步骤见链接 WBF交易所如何使用二次验证码/谷歌身份验证器 二次验证码小程序于谷歌身份验证器APP的优势 1.无需下载app 2.验证码 ...
- 疑难杂症1-去掉网站里的特殊编码
编辑器:Visual Studio 2019项目框架:Net Core 3.1 + AutoFac 特殊符号,这是编码UTF-8 + BOM的特殊标记,是隐藏的,但是会被浏览器翻 ...
- Python 简明教程 --- 25,Python 目录操作
微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 做技术一定要一颗恒心,这样才不会半途而废. 目录 上一节我们介绍了文件相关的操作,本节我们来介绍目录 ...
- scrapy中选择器用法
一.Selector选择器介绍 python从网页中提取数据常用以下两种方法: lxml:基于ElementTree的XML解析库(也可以解析HTML),不是python的标准库 BeautifulS ...
- C语言中的 “>>”与“<<”
1. ">>" int x = 16; printf("%d\n", x >> 1); 先将x转成二进制 10000, 不读最后一位, ...
- It还是高薪行业不?—软件测试
It还是高薪行业不?—软件测试 谁都希望拿高薪,但是并不是所有人.所有地方都能的:甚者培训出来还不能就业的大有人在,也不是所有人都适合培训后就业(年龄.学历.专业.期望就业地点.不同行业转行还是有很大 ...
- 总结HashMap实现原理分析
一.底层数据结构在JDK1.6,JDK1.7中,HashMap采用位桶+链表实现,即使用链表处理冲突,同一hash值的键值对会被放在同一个位桶里,当桶中元素较多时,通过key值查找的效率较低. 而JD ...
- 社交网站的数据挖掘与分析pdf版本|网盘下载地址附提取码|
点击此处进入网盘下载地址 提取码:btqx 作者介绍: 马修·罗塞尔(MatthewA.Russell),DigitalReasoningSystems公司的技术副总裁和Zaffra公司的负责人,是热 ...