程序员自由之路 | 作者

urlify.cn/eyuUVr | 来源

什么是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.8Accept-Encoding: gzip, deflate, brAccept-Language: zh-CN,zh;q=0.9Cache-Control: max-age=0Connection: keep-aliveHost: localhost:8000If-Modified-Since: Tue, 21 Apr 2020 14:09:01 GMTIf-None-Match: "5e9efe7d-264"Upgrade-Insecure-Requests: 1User-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 8kgzip_buffers number size;# 该指令用于设定Gzip压缩程度,包括级别1到级别9。# 级别1表示压缩程度最低,压缩效率最高;级别9表示压缩程度最高,压缩效率最低,最费时间。# 默认是1gzip_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/xmlgzip_types mime-type ...;# 开启后的效果是在响应头部添加了Accept-Encoding: gzipgzip_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

问题

欢迎大家留言说说Gzip功能还有哪些常用场景~

nginx 带宽_Nginx的Gzip功能相关推荐

  1. nginx 带宽_Nginx优化配置,轻松应对十万并发

    Nginx现在已经是最火的web服务器之一,尤其在静态分离和负载均衡方面,性能十分优越.接下来我们主要看下Nginx在高并发环境下的优化配置,主要是针对 nginx.conf 文件的属性设置.我们打开 ...

  2. nginx 带宽_Nginx日志如何分析 GoAccess

    " 如何进行Nginx日志的分析呢?如获得topN 来源IP.URL,以及PV.UV等. " 认识下GoAccess GoAccess[1]支持对所有Web日志格式实现快速实时的分 ...

  3. 配置nginx的Gzip功能实现网页的压缩和图片的压缩

    1.为什么要用GZIP实现网页和图片的压缩?nginx怎么实现压缩的? 使用Gzip压缩可以提高CPU 使用率,可以减少服务器发送的字节数量.这就使人们觉得页速度加快了,并且还减少了带宽的用量. 根据 ...

  4. nginx 接收报文_Nginx代理缓存功能

    Nginx代理缓存功能 Nginx缓存主要是用于减轻后端服务器的负载,提高网站并发量,提升用户体验度. 注意:Nginx反向代理的缓存功能是由ngx_http_proxy_module提供,在使用缓存 ...

  5. nginx 带宽_谈谈Nginx和LVS各自的优缺点以及使用

    在最开始呢,咱们先说一下什么叫负载均衡,负载均衡呢,就是将一批请求,根据请求的内容,分发到不同的后端去进行相应的处理,从而提供负载分担,主备切换等功能. 对于不同的负载均衡软件,有不同的流量分发算法, ...

  6. Nginx的功能特性及常用功能

    Nginx提供的基本功能服务从大体上归纳为"基本HTTP服务"."高级HTTP服务"和"邮件服务"等三大类. 基本HTTP服务 Nginx可 ...

  7. Nginx使用brotli代替gzip

    最近几年出现了很多新的压缩算法, brotli是google开源的新的压缩算法之一,我的另外一篇文章做了一下收集整理. http://blog.csdn.net/chenhaifeng2016/art ...

  8. nginx 电子书_Nginx最详细的反向代理配置步骤,拿去不谢

    点击"蓝字"关注我们 #今日份技术干货# 使用Nginx实现Web反向代理功能,实现如下功能: ◆后端Web服务器两台,可以使用httpd实现 ◆Nginx采用轮询的方式调用后端W ...

  9. 开放Nginx在文件夹列表功能

    nginx在列出的默认同意整个文件夹.你怎么转Nginx在文件夹列表功能? 打开nginx.conf文件.在location server 要么 http段增加  autoindex on; 另外两个 ...

最新文章

  1. Xcode10:Implicit declaration of function '' is invalid in C99
  2. android 头像球_Android一行代码实现圆形头像
  3. 1岁确诊脑瘫,“轮椅博士”,毕业了!
  4. ansible 模块_您需要了解的Ansible模块
  5. base | 使用apply族函数进行向量化运算
  6. 女生学电气or计算机,8个女生可以学习的工科专业,高三毕业生了解一下,值得报考...
  7. 23种设计模式(十四)接口隔离之代理模式
  8. ros 开源物体检测_开源机器人动力学仿真软件:V-REP简介
  9. MOOC 浙江大学C语言翁恺(第一、二章 满分答案)
  10. DM8整合java的jpa框架(附整合源码)
  11. 前端开发SEO搜索引擎优化方案
  12. YY淘宝商品数据库设计
  13. linux显示一列数据的首尾行,tail从文件内容的尾行开始查看命令
  14. 如何在win10 安装ADS1.2
  15. 剑道第一仙 第一千六百三十七章 何须解释
  16. Ubuntu 下配置 Typora 图片上传到 smms
  17. 二补数(2’scomplement)乘法算法及其Verilog实现 - 固定系数h
  18. 如何往虚拟机里面复制文件(末尾附带视频教程)
  19. x86、i386、IA-32、amd64、x64、x86-64、IA-64的区别
  20. antd 给input设置值_React中input框设置value报错解析

热门文章

  1. u盘分为windows和linux启动,【电脑软件】Ventoy 官方版,一个U盘,同时拥有启动win+linux+Ubuntu...
  2. hadoop实训报告总结及体会_管理工程学院举办电子商务实训表彰大会
  3. 关于gedit的编码问题
  4. oracle sql优化指导,基于Oracle的sql优化(1)
  5. Ubuntu 18.04 安装OpenCV C++
  6. linuxpython升级3.5_linux升级python3.5到3.6
  7. 计算机不能进入桌面,电脑开机无法进入桌面,请高手解决。
  8. java仿qq gui_Java仿QQ登入页面
  9. 保留小数点后三位_【Meta分析】Stata制作森林图时,如何保留三位小数?
  10. mysql执行计划性能_MySQL SQL性能分析Explain执行计划