nginx 带宽_Nginx的Gzip功能

程序员自由之路 | 作者

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功能还有哪些常用场景~

980fba891f6f4ad4fd37f190d82edf49.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/537455.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分享朋友圈QQ空间需要哪些参数

shareTitle(分享标题 , shareDes(分享描述 , shareImg(分享图片地址, shareUrl(分享地址, shareType(分享类型,微信朋友:WEIXIN、微信朋友圈:WEIXIN_CIRCLE、QQ:QQ)

【今日头条】【抖音火山】前端开发实习生

今日头条成立于2012年,致力于成为最懂你的信息平台,连接人与信息,促进内容的创作和交流。通过技术,来改变整个内容生产、消费领域。 5年的时间内,我们已经成为了一个估值过百亿美元,用户数亿,DA…

程序员真的是吃青春饭的吗?(献给即将进入职场的程序员们)

又有学生问我:程序员真的是吃青春饭的吗?我是不是做到三十岁就该考虑转型了? 我告诉他们: 这是中国的记者们用统计数字造下的一个弥天大谎,当我们看到微软集团内的许多白发程序员在兢兢业业地工作的时候,我…

这一年多来,阿里Blink测试体系如何从0走向成熟?

2019独角兽企业重金招聘Python工程师标准>>> 摘要: 引言 Apache Flink是面向数据流处理和批处理的分布式开源计算框架,2016年阿里巴巴引入Flink框架,改造为Blink。2017年,阿里整合了所有流计算产品,决定以B…

numpy中一些常见计算

文章目录 numpy中的一些常见计算代码方差标准差参考文献numpy中的一些常见计算 代码 import numpy as np from scipy import stats# 示例数据 data = np.array([1, 2,

system函数_自学C++基础教程【函数】

函数的概念一个函数由:函数的返回值类型、函数名、参数表、函数体 这4个部分组成。int Add( int _a , int _b ) {return _a _b; }该函数 Add 完成对两个整型数据的求和功能。函数的调用方式: 函数名(参数表);…

宁波政务云资源的介绍与申请

介绍 如图所示: 宁波政务云分公共服务区与资源共享区。 公共服务区 公共服务区,一般部署允许互联网访问的系统,数据不敏感,不重要的,可对外开发的系统。 该区允许互联网访问,不允许访问资源共享区&…

redis查数据

1 连接服务 12345[rootredis1-20 ~]# telnet 127.0.0.1 6380Trying 127.0.0.1...Connected to 127.0.0.1.Escape character is ^].#用telnet也能登录,但是无法查看key的value12[rootredis1-20 src]# ./redis-cli -p 6380#redis可能有好几个服务,要指定端…

python帮助文档在哪_python文档在哪里

对于Python中一些不清楚的模块,可以通过文档学习如何使用,但是python文档在哪里呢?这个问题我们可以使用Python命令进行查看。方法一 在python命令行输入以下内容help(time) # 很详细的模块文档 help(time.localtime()) # 很详细的函数文档 h…

政务云公共服务区与资源共享区数据交换的方式

上文《宁波政务云资源的介绍与申请》介绍过,公共服务区与资源共享区是不能互访的,只能是资源共享区单向访问公共服务区。 我有一项目,要能互联网访问,又要访问“宁波大数据共享平台”的接口,“宁波大数据共享平台”在…

Java程序员的IntelliJ IDEA使用教程

前言 博主是Java程序员,以前一直都用myeclipse来开发的,说实话感觉myeclipse毫无美感可言,后来经过同事介绍,认识了IDEA,一眼就相中了IDEA黑色的主题风格,自此就抛弃了旧爱myeclipse。当时还不懂IDEA功能上…

python中random函数用法_random函数的用法

展开全部 用法: 1、随2113机生成(0,1)之间的浮点数 random.random() 2、随机生成100-200的整数5261 random.randint(100,200) 3、随机产生范围为410210间隔为2的数 random.randrange(0,11,2) 注:这里输出(0,2,4,6,8,10…

提防易怒的危机

我工作多年,多年来认识一些官场、商场的人。 我与他们相处时,深深体会到太忙、太累的主管,常呈现的状态是“易怒”。 这些人精神绷得太紧,体力透支,睡眠不足,开会太久,长期都在赶进度。 易怒…

2018-2019 ACM-ICPC Pacific Northwest Regional Contest (Div. 1)

2018-2019 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) 思路: A Exam 思路:水题 代码: #include<bits/stdc.h> using namespace std; int main(){int k;scanf("%d",&k);char s1[1010],s2[1010];scanf("%s%s",s1,s2);int same0;int ns…

python random()*10的值不可能是_Python

Python 生成随机数、随机字符串 #!/usr/bin/python # -*- coding: UTF-8 -*- import random import string # 随机整数&#xff1a; print random.randint(1,50) # 随机选取0到100间的偶数&#xff1a; print random.randrange(0, 101, 2) # 随机浮点数&#xff1a; print rand…

Prince2与PMP的区别

p2有7个原则&#xff0c;7个主题&#xff0c;7个流程&#xff0c;即37二十一。 P2有26个管理产品模板。 2009版本是经典版本&#xff0c;2017版本与2009版本内容基本没变&#xff0c;梳理了目录&#xff0c;使内容更加有可读性。 P2是非常好的项目管理方法论&#xff0c;任何…

html实体编码_深入研究浏览器解析和XSS有效负载编码

翻译文章&#xff0c; 原文&#xff1a;Deep dive into browser parsing and XSS payload encoding[1]这篇博客文章将深入探讨HTML&#xff0c;URL和JavaScript的规范和解析器&#xff0c;以及它们之间的交互如何在跨站点脚本转义中有所作为。对于您而言&#xff0c;这可能很难…

2021-02-03-延长一天时间的有效方法

方法1&#xff1a;给对的事情花时间 分清事情轻重缓急&#xff0c;做了对的事情会让人感到开心。有个原则&#xff0c;就是事后回想这件事&#xff0c;会让自己感到开心。 比如玩了一晚上游戏和学习&#xff0c;可能更多人的开心是后者。 比如健身运动与长时间学习&#xff…

[洛谷P1341]无序字母对

题目大意&#xff1a;给一张无向图&#xff0c;找一条字典序最小的欧拉路径 题解&#xff1a;若图不连通或有两个以上的奇数点&#xff0c;则没有欧拉路径&#xff0c;可以$dfs$&#xff0c;在回溯时把这个节点加入答案 卡点&#xff1a;没有在回溯时加入答案&#xff0c;导致出…

产品部门四大角色——PM/PD/UE/UI

按照产品从规划到最终成型的任务流方向&#xff0c;从抽象到具体、商业到技术的过程&#xff0c;涉及产品经理、产品设计师、用户体验师、视觉设计师四个角色。 PM&#xff1a;产品经理&#xff0c;俗称老大。一个产品&#xff0c;首先由PM来分析细分市场、目标客户的诉求&…