抖音上做我女朋友网站,html5网站开发实战,可以做产品宣传的网站,网站加栏目程序员自由之路 | 作者urlify.cn/eyuUVr | 来源什么是HTTP压缩有时候客户端和服务器之间会传输比较大的报文数据#xff0c;这时候就占用较大的网络带宽和时长。为了节省带宽#xff0c;加速报文的响应速速#xff0c;可以将传输的报文数据先进行压缩#xff0c;然后再进行… 程序员自由之路 | 作者urlify.cn/eyuUVr | 来源什么是HTTP压缩有时候客户端和服务器之间会传输比较大的报文数据这时候就占用较大的网络带宽和时长。为了节省带宽加速报文的响应速速可以将传输的报文数据先进行压缩然后再进行传输。HTTP支持多种报文压缩算法下面是一个普通的请求头从Accept-Encoding字段可以看出支持gzip、deflate和br压缩算法。本文我们重点讲使用Gzip算法对报文进行压缩比如Gzip来压缩HTML,Javascript, CSS文件压缩完后能大大减少网络传输的数据量提高了用户显示网页的速度。Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/webp,image/apng,*/*;q0.8Accept-Encoding: gzip, deflate, brAccept-Language: zh-CN,zh;q0.9Cache-Control: max-age0Connection: keep-aliveHost: localhost:8000If-Modified-Since: Tue, 21 Apr 2020 14:09:01 GMTIf-None-Match: 5e9efe7d-264Upgrade-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-AgentUA)进行设置。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功能还有哪些常用场景~