NGINX中的HTTP/2模块

NGINX | 2016年1月19日

本博文改编自演讲,该演讲由Valentin V. Bartenev于9月在旧金山举行的nginx.conf 2015大会上发表。

目录

几天前,我们发布了NGINX的HTTP/2模块。本次演讲将简要介绍这一新模块。

0:20 协议概述

HTTP/2并非HTTP/1.x的替代方案,也不是解决所有问题的灵丹妙药;它是HTTP/1的另一种传输层,各有利弊,基本上与SPDY相同

首先,我想澄清一些关于新协议的误解。

许多人认为,HTTP/2是HTTP/1更先进、更出色的后继者。我并不认同这一观点,原因如下。实际上,HTTP/2只是HTTP/1的另一种传输层。这并非坏事,因为您无需更改应用程序即可使用HTTP/2,它使用相同的标头。只需在NGINX中启用HTTP/2,NGINX就会妥善处理所有协议相关事务。

但HTTP/2并非万能。它确实有优点,也有缺点。在某些用例中表现良好,但在另一些场景中表现不佳。

1:40 HTTP/2 的主要特性

HTTP/2的主要特性包括二进制协议、多路复用、HPACK标头压缩和复杂的优先级机制

可以将HTTP/2视为SPDY的新版本,因为它以SPDY为基础,两者的协议非常相似。SPDY是Google几年前开发的一种协议,旨在加快Web内容交付。

NGINX支持SPDY已有两年,因此可以使用SPDY模块来了解HTTP/2的优势。有人认为,HTTP/2只是SPDY 3.1的改进版。

如果您不熟悉SPDY,下面将介绍几个要点。这些要点也适用于HTTP/2,因为两者基本上是同一种协议,只是在细节上有所不同。

第一个要点是,该协议本身采用二进制格式。我喜欢二进制协议,因为它们更易于编码,而且设计良好的二进制协议在性能方面具有一定优势。不过,我也了解这种方式的缺点。

3:08 HTTP/2 内部机制:二进制

幻灯片展示了HTTP/2请求的有效载荷采用二进制格式,而HTTP/1.1请求采用人类可读的文本格式

这是一个HTTP/2请求。看起来很酷,而且如您所见,调试起来非常容易。开个玩笑,其实它很难调试。这正是二进制协议的缺点之一。

您可能需要使用工具来解码请求。不过,有时工具可能会出故障,或者无法显示隐藏在各个位中的所有细节,因此可能需要手动调试二进制数据。

好在大多数情况下,只需在NGINX中使用HTTP/2,完全不必理会其二进制特性。另一个好消息是,大多数请求都将由机器处理,而机器读取二进制协议的能力远胜于人类。

4:26 深入了解HTTP/2:多路复用

HTTP/2通过单个连接多路复用请求和响应

HTTP/2的下一个要点是多路复用。HTTP/2不再通过多个连接,以独立数据流的形式发送和接收响应与请求,而是将它们复用到同一个字节流或数据流中。它会将不同请求和响应的数据分割成片段,每个片段都有自己的标识和大小字段,以便端点确定数据属于哪个请求。

这里的缺点是,每个数据块都有自己的标识和字段,因此除了实际数据外,还需要传输一些元数据,从而产生一定的额外开销。因此,如果只有一个数据流,例如观看电影时,HTTP/2就不是合适的协议,因为它只会增加额外开销。

多路复用有哪些优势?其主要优势在于,只需使用一个连接,就能省去使用HTTP/1.x创建新请求时握手所需的全部时间。

处理TLS时,此类延迟尤其令人头疼。因此,目前大多数客户端仅支持通过TLS使用HTTP/2。据我所知,目前没有计划支持通过纯TCP使用HTTP/2,因为这样做的收益不大。这是因为TCP握手的开销不如TLS握手高,所以避免建立多个连接并不能节省多少时间。

7:09 HTTP/2的主要功能:标头压缩

HTTP/2使用专门设计的HPACK算法压缩标头

HTTP/2的下一个要点是标头压缩。如果Cookie很大,每个请求或响应可因此减少数百字节,但通常在大多数情况下,标头压缩带来的收益并不明显。因为即使单独考虑每个请求,最终仍需通过网络的数据包层传输。发送100字节还是150字节并没有太大区别,最终仍会形成一个数据包。

HTTP/2标头压缩的缺点是它具有状态[编者:指用于存储压缩和解压缩信息的表]。因此,对于每个连接,服务器和客户端都需要保留某种状态,这比保留HTTP/1连接的状态占用更多内存。因此,每个HTTP/2连接都会占用更多内存。

8:40 HTTP/2的主要功能:优先级

HTTP/2中的优先级机制解决了只有一个通道时需要优先发送最重要数据的问题

HTTP/2的最后一个要点是其优先级机制。该机制解决了多路复用带来的问题。当只有一个连接时,也就只有一条传输通道,因此需要谨慎决定接下来通过这条通道发送哪个响应。

优先级机制在HTTP/2中是可选的,但如果不使用,性能提升会很有限。NGINX中的HTTP/2模块全面支持优先级机制,包括基于权重和基于依赖关系的优先级。根据目前的观察,我们当前的HTTP/2实现速度表现出色。以上就是HTTP/2的要点。

10:06 HTTP/2的发展历程

概述各版NGINX对SPDY和HTTP/2支持历程的幻灯片

这张简单的幻灯片回顾了HTTP/2的发展历程,内容比较直观。接下来,我们来看看HTTP/2在实践中如何运作。

10:16 测试页面

包含典型资源类型组合的网页,用于测试NGINX HTTP/2模块的性能

为了了解HTTP/2在不同网络条件下的运行情况,我对一个典型网页进行了一些基准测试。这只是我在Github上找到的一个HTTP/2页面。可以看到其中包含的资源数量以及每项资源的大小。我认为它相当具有典型网站的代表性。

10:52 测试环境

介绍测试NGINX HTTP/2模块时所用硬件、软件和NGINX配置的幻灯片

以下是我的测试环境,供您复现测试时参考。

11:02 DOM 加载

比较不同延迟网络中HTTP/1、HTTP/2和HTTPS下载时间的条形图

以下是我得到的结果。可以看到,X轴表示模拟的不同网络延迟,以往返时间(RTT)计,单位为毫秒;Y轴表示测得的下载时间,单位同样为毫秒。本测试以页面所有资源完全加载所需的时间来衡量页面加载时间。

从图中可以看出一个明显趋势:在低延迟情况下,HTTP、HTTPS和HTTP/2之间没有显著差异。在较高延迟情况下,普通HTTP/1.x速度较快,其次是HTTP/2,HTTPS则较慢。

11:48 首次绘制

条形图:比较在不同延迟的网络中,使用HTTP/1、HTTP/2和HTTPS传输网页首个元素所需的时间

那么,“首次绘制”时间呢?在许多情况下,从用户的角度来看,这是非常重要的指标,因为此时用户才真正开始在屏幕上看到内容。相比页面完全加载所需的时间,用户需要等待多久才能看到内容往往重要得多。

这里呈现出相同的趋势,但测试中值得注意的是,当延迟处于30 ms至250 ms的中间范围时,HTTP/2比普通HTTP略快,不过差异很小。

12:45 配置

幻灯片介绍了构建包含HTTP/2模块的NGINX二进制文件所需的条件和命令参数,以及在配置中启用HTTP/2的指令

以上就是我们的基准测试结果。现在来看看如何配置HTTP/2和NGINX。

其实很简单,只需将http2参数添加到listen指令中。这里最复杂的步骤可能是获取最新版本的OpenSSL,因为HTTP/2需要ALPN[应用层协议协商]扩展,而只有OpenSSL 1.0.2支持ALPN扩展。

我们还为HTTP/2实现了NPN[下一协议协商]。目前,它适用于大多数客户端,但随着SPDY于2016年初被弃用,这些客户端将取消对NPN的支持。这意味着,目前可以使用许多Linux发行版自带的OpenSSL版本来运行HTTP/2,但需要注意,这种方式不久后将无法继续使用。

以上就是配置NGINX以支持HTTP/2的全部内容,我的演示到此结束。谢谢。

[参考文档:HTTP/2 模块]

问答

问: 是否也会在上游端支持HTTP/2,还是仅在客户端支持HTTP/2?

答:目前,我们仅在客户端支持HTTP/2。无法使用proxy_pass配置HTTP/2。[编者注:在本文的原始版本中,这句话被错误地转录为“可以使用 proxy_pass配置HTTP/2”。对于由此可能造成的任何困惑,我们深表歉意。]

但在后端使用HTTP/2有什么意义呢?从基准测试可以看出,对于上游连接等低延迟网络,HTTP/2带来的优势并不明显。

此外,NGINX还提供keepalive模块,可用于配置keepalive缓存。HTTP/2的主要性能优势是避免额外的握手,但如果已通过keepalive缓存实现这一点,上游侧就不需要使用HTTP/2。

更多HTTP/2资源

准备好在您的环境中试用NGINX Plus的HTTP/2功能了吗?立即开始30天免费试用,或联系我们,讨论您的使用场景。


分享
标签: F5 NGINX, 2016, Tech

相关博客文章

NGINX Plus R26 正式发布
NGINX | 2022/02/15

NGINX Plus R26 正式发布

NGINX Plus R26通过缓存JSON Web密钥集加快JWT验证,并强化TLS握手,从而提升安全性。NGINX JavaScript的新功能包括增强对异步函数的支持,以及实现WebCrypto API。

使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击
NGINX | 2022/02/10

使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击

gRPC具备开发人员设计和部署现代应用所需的速度与灵活性,但其开放性也使其极易受到第7层DoS攻击。NGINX App Protect DoS可保护gRPC应用免受此类破坏性攻击。

Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划
NGINX | 2021/09/13

Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划

了解选择错误的Ingress控制器可能带来的风险,以及如何从关键方面着手,让您的选择更好地适应未来需求。

NGINX Plus R19 正式发布
NGINX | 2019/09/03

NGINX Plus R19 正式发布

NGINX Plus R19扩展了监控功能,不仅提供更多指标,还新增了指标分析方式;增加试运行模式,用于测试限速效果;增强键值存储,以支持IP地址范围;并使限速更加动态。

NGINX现已正式加入F5
NGINX | 2019/05/09

NGINX现已正式加入F5

NGINX现已正式成为F5的一部分。Gus Robertson现任F5 NGINX业务部门负责人。他阐述了两家公司在人才、文化和愿景方面融合的价值,以及双方将如何携手增强NGINX的开源产品和商业产品。

使用NGINX和NGINX Plus实现高性能缓存
NGINX | 2016/08/24

使用NGINX和NGINX Plus实现高性能缓存

我将介绍NGINX在内容缓存和性能方面的工作原理,并分享一些控制NGINX内容缓存方式的技巧。