在Nignx增加http2模块顺便聊聊HTTP的八卦

Posted 沛沛老爹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Nignx增加http2模块顺便聊聊HTTP的八卦相关的知识,希望对你有一定的参考价值。

安装http2

在安装openresty或者nginx的时候。默认是不会安装http2模块的。

所以我们用的还是http1.1。要想用http2,是需要自己安装的。

安装命令比较简单。

进入到对应的openresty的解压目录里面。

然后执行下面语句


./configure --prefix=/usr/local/openresty --with-http_v2_module  
make
sudo make install

--prefix这个是安装后的文件路径。如果不需要的话,是放在默认的位置,即可执行文件和配置文件分开了。

如果您时间比较忙,可以省下下面这段文字。下面主要是讲下http的历史的。

为什么要安装http2?

Http的发展情史

初恋期(Http1.0)

 刚开始之初,对于http,大家看到的都是好的,都是新的。

在当时,物质条件(硬件)极度缺乏的状态下。

能够保持最基本的温饱就谢天谢地了。

所以,在刚开始的时候,只要能传递信息。

至于好不好用,那都是后面的话题了。

热恋期(Http1.1)

 经过一段时间的摸索。

大家感情迅速升温,碰上了国家的好政策。

改革开发的春风吹满了祖国的大地。

然后大量的商品(图片和视频)的涌入。

大量的热钱和商品的涌入,让HTTP的身体有点吃不消了。

HTTP1.1 的虚火

高延迟 — 队头阻塞

队头阻塞是指当顺序发送的请求序列中的一个请求因为某种原因被阻塞时,在后面排队的所有请求也一并被阻塞,会导致客户端迟迟收不到数据。

无状态 — 阻碍交互

无状态是指协议对于连接状态没有记忆能力。每一个连接都是一个新的连接。上一次请求验证了用户名密码,而下一次请求服务器并不知道它与上一条请求有何关联,换句话说就是掉登录态。

明文传输 — 不安全性

传输内容没有加密,中途可能被篡改和劫持。

不支持服务端推送

 服务的推送即可以让服务端主动把资源文件推送给客户端。当然客户端也有权利选择是否接收。

求婚期(SPDY)

久病思良药。于是SPDY大神上场了。

SPDY何人也

SPDY 出身于名门正派:Google。

SPDY是Google在Http1.1的基础上,进行了优化改进:

  1. 降低延迟,针对HTTP高延迟的问题,SPDY优雅的采取了多路复用(multiplexing)。多路复用通过多个请求stream共享一个tcp连接的方式,解决了HOL blocking的问题,降低了延迟同时提高了带宽的利用率。

  2. 请求优先级。多路复用带来一个新的问题是,在连接共享的基础之上有可能会导致关键请求被阻塞。SPDY允许给每个request设置优先级,这样重要的请求就会优先得到响应。比如浏览器加载首页,首页的html内容应该优先展示,之后才是各种静态资源文件,脚本文件等加载,这样可以保证用户能第一时间看到网页内容。

  3. header压缩。前面提到HTTP1.x的header很多时候都是重复多余的。选择合适的压缩算法可以减小包的大小和数量。

  4. 基于HTTPS的加密协议传输,大大提高了传输数据的可靠性。

  5. 服务端推送

SPDY构成图:

婚姻期(Http2.0)

Http2.0基于SPDY,但是结婚的男人怎么能用未婚的标准来考核呢?

HTTP2.0和SPDY的区别:

  1. HTTP2.0 支持明文 HTTP 传输,而 SPDY 强制使用 HTTPS。

  2. HTTP2.0 消息头的压缩算法采用 HPACK ,而非 SPDY 采用的 DEFLATE

HTTP2.0和HTTP1.X相比的新特性

  • 新的二进制格式(Binary Format),HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。

  • 多路复用(MultiPlexing),即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。

  • header压缩,如上文中所言,对前面提到过HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。

  • 服务端推送(server push),同SPDY一样,HTTP2.0也具有server push功能。

HTTP2.0的升级改造

  • 前文说了HTTP2.0其实可以支持非HTTPS的,但是现在主流的浏览器像chrome,firefox表示还是只支持基于 TLS 部署的HTTP2.0协议,所以要想升级成HTTP2.0还是先升级HTTPS为好。

  • 当你的网站已经升级HTTPS之后,那么升级HTTP2.0就简单很多,如果你使用NGINX,只要在配置文件中启动相应的协议就可以了,可以参考NGINX白皮书,NGINX配置HTTP2.0官方指南 https://www.nginx.com/blog/nginx-1-9-5/。

  • 使用了HTTP2.0那么,原本的HTTP1.x怎么办,这个问题其实不用担心,HTTP2.0完全兼容HTTP1.x的语义,对于不支持HTTP2.0的浏览器,NGINX会自动向下兼容的。

以上是关于在Nignx增加http2模块顺便聊聊HTTP的八卦的主要内容,如果未能解决你的问题,请参考以下文章

nignx 基本模块

HTTP2试用小记

如何使用 nodejs 模块 http2 将 http2 与 ExpressJS 集成?

Http2需要PageSpeed模块吗?

HTTP2和HTTPS来不来了解一下?

ExperimentalWarning:http2 模块是一个实验性 API