有关 HTTP/2 的更多信息,请观看我们热门网络研讨会“HTTP/2 有什么新功能?”的录音。
历史悠久的超文本传输协议( HTTP )标准现已更新。 HTTP/2 标准于 2015 年 5 月获得批准,目前正在浏览器和 Web 服务器(包括NGINX Plus和NGINX Open Source )中实施。 目前,近三分之二的网络浏览器都支持 HTTP/2,并且这一比例每月增长几个百分点。
HTTP/2 建立在 Google 的 SPDY 协议之上,在 2016 年初Google Chrome 浏览器对 SPDY 的支持结束之前,SPDY 仍然是一种选择。 NGINX 是 SPDY 的先驱支持者,现在在 HTTP/2 中扮演着同样的角色。 我们的综合白皮书《面向 Webapplication开发人员的 HTTP/2》 (PDF)描述了 HTTP/2,展示了它如何在 SPDY 上构建,并解释了如何实现它。
HTTP/2 的主要特性与 SPDY 相同:
现在您需要决定是否继续使用 HTTP/2——其中一部分就是了解如何充分利用它。 这篇博文将指导您了解决策和实施过程中与绩效相关的方面。 查看有关 HTTP/2 性能的 7 个技巧:
笔记: 严格来说,SPDY 和 HTTP/2 都不需要 TLS,但两者在与 SSL/TLS 一起使用时主要有益,并且只有在使用 SSL/TLS 时浏览器才支持 SPDY 或 HTTP/2。
实现 HTTP/2 很容易,正如我们在白皮书《面向 Web应用开发人员的 HTTP/2》 (PDF)中所讨论的那样。 然而,HTTP/2 并不是灵丹妙药;它对某些 Web应用有用,但对其他 Web 应用程序则没那么有用。
如果您使用 SSL/TLS(以下简称 TLS),使用 HTTP/2 可能会提高网站性能。 但如果您还没有,则需要先添加 TLS 支持才能使用 HTTP/2。 在这种情况下,预计使用 TLS 的性能损失将大致被使用 HTTP/2 的性能优势所抵消,但在做出实施决定之前,请测试这是否确实适用于您的网站。
以下是 HTTP/2 的五个主要潜在优势:
以下是你会遇到的五个相应缺点:
一切都取决于表现——在这方面,我们有好消息也有坏消息。
好消息是,我们在 NGINX 上运行的初步内部测试显示了理论预测的结果:对于通过具有典型互联网延迟的连接请求的混合内容网页,HTTP/2 的表现优于 HTTP/1.x 和 HTTPS。 根据连接的典型往返时间 (RTT),结果分为三类:
该图显示了首次绘制的时间——即用户第一次看到网页内容出现在屏幕上的时间。 该测量通常被认为对于用户对网站响应能力的感知至关重要。
有关我们测试的详细信息,请观看我在 nginx.conf 2015 中的演示文稿《NGINX 中的 HTTP/2 模块》 。
然而,每个网页都是不同的,并且每个用户会话实际上也是不同的。 如果您有流媒体或大型可下载文件,或者您已经对 HTTP/1.x 优化进行了科学改良(向The Martian致歉),您的结果可能会有所不同,甚至是相反的。
底线是:您可能会发现成本效益权衡不明确。 如果是这样,请尽可能多地学习,对自己的内容进行性能测试,然后拨打电话。 (如需指导,请观看我们的网络研讨会“HTTP/2 有什么新功能? ”。)
终止协议意味着客户端使用所需的协议(例如 TLS 或 HTTP/2)连接到代理服务器。 然后,代理服务器连接到应用服务器、数据库服务器等,而不一定使用相同的协议,如图所示。
使用单独的服务器进行终止意味着转向多服务器架构。 这些服务器可能是独立的物理服务器、虚拟服务器或AWS等云环境中的虚拟服务器实例。 与单个服务器甚至应用服务器/数据库服务器组合相比,这在复杂性上有所提升。 但它确实带来了很多好处,而且实际上——这不是双关语——对于繁忙的站点来说,它是一种必需品。
一旦将服务器或虚拟服务器放置在现有设置前面,许多事情就皆有可能。 新的服务器卸载了其他服务器的客户端通信任务,并且可用于负载均衡、静态文件缓存和其他用途。 根据需要可以轻松添加和替换应用服务器和其他服务器。
NGINX 和 NGINX Plus 通常用于所有这些目的 - 终止 TLS 和 HTTP/2、负载均衡等。 现有环境根本不需要改变,除了使用 NGINX 服务器“前端”它之外。
编辑——自这篇博文发布以来,SPDY 已不再得到主流浏览器的支持。 从 SPDY 开始不再是一种广泛部署的选择。
SPDY是HTTP/2的前身协议,整体性能差不多。 因为它已经存在好几年了,所以支持 SPDY 的网络浏览器比支持 HTTP/2 的还多。 然而,在撰写本文时,差距正在缩小;大约三分之二的网络浏览器支持 HTTP/2,而大约五分之四的网络浏览器支持 SPDY。
如果您急于实施新式 Web 传输协议,并且想要支持尽可能多的用户,那么您可以先提供 SPDY。 然后,在 2016 年初,当 SPDY 支持开始被移除时,您可以切换到 HTTP/2——这是一个快速的变化,至少对于 NGINX 来说是这样。到那时,更多的用户将使用支持 HTTP/2 的浏览器,因此您将在这次过渡期间为最多的用户做最好的事情。
在决定实施 HTTP/2 之前,您需要确定代码库中有多少针对 HTTP/1.x 进行了优化。 有四种类型的优化需要注意:
最后三种优化都将小文件合并为大文件,以减少新连接和初始化握手,这对于 TLS 来说尤其昂贵。
第一个优化,域分片,则起到相反的作用——通过涉及更多域来强制打开更多连接。 总之,这些看似矛盾的技术可以相当有效地提高 HTTP/1.x 网站的性能。 然而,它们都需要时间、精力和资源来设计、实施、管理和运行。
在实施 HTTP/2 之前,请确定这些优化存在的位置以及它们当前如何影响组织中的应用设计和工作流程,以便您可以在迁移到 HTTP/2 之后修改或撤消它们。
实际上部署 HTTP/2 或 SPDY 并不难。 如果您是 NGINX 用户,您只需在 NGINX 配置中“打开”协议,正如我们在白皮书《面向 Webapplication开发人员的 HTTP/2》(PDF)中详细介绍的 HTTP/2 。 然后,浏览器和服务器将协商选择一种协议,如果浏览器也支持 HTTP/2(并且正在使用 TLS),则选择 HTTP/2。
一旦您在服务器级别实现 HTTP/2,使用支持 HTTP/2 的浏览器版本的用户将通过 HTTP/2 与您的 Web 应用进行会话。 使用旧版本浏览器的用户的会话将在 HTTP/1.x 上运行,如图所示。 如果您为繁忙的站点实施 HTTP/2 或 SPDY,您将需要制定流程来测量前后的性能,并在更改产生重大负面影响时撤销更改。
笔记: 随着 HTTP/2 及其单一连接的使用,NGINX 配置的某些细节变得更加重要。 检查您的 NGINX 配置,特别注意调整和测试诸如output_buffers
、 proxy_buffers
和ssl_buffer_size
等指令的设置。 有关一般配置说明,请参阅 NGINX Plus 管理指南中的NGINX SSL/TLS 终止。 您可以在我们的博客《使用 NGINX 进行 SSL 卸载、加密和证书》和《如何使用 HTTPS 和 NGINX 改善 SEO》中获取更多具体提示。我们的白皮书《NGINX SSL 性能》探讨了服务器密钥大小、服务器协议和批量密码的选择如何影响性能。
笔记: 使用 HTTP/2 的密码可能需要额外注意。 HTTP/2 的 RFC 中列出了需要避免的密码套件,您可能更愿意自己配置密码列表。 在 NGINX 和 NGINX Plus 中,考虑调整ssl_ciphers
指令并启用ssl_prefer_server_ciphers
,并使用流行的浏览器版本测试配置。 Qualys SSL 服务器测试分析了 SSL 网络服务器的配置,但(截至 2015 年 11 月)它对于 HTTP/2 握手并不可靠。
令人惊讶的是,撤消或修改 HTTP/1.x 优化实际上是 HTTP/2 实现中最有创意的部分。 有几个问题需要考虑,而且对于做什么有很多自由度。
在开始进行更改之前,请考虑旧版浏览器的用户是否会受到影响。 考虑到这一点,有三种主要的策略可以撤消或修改 HTTP/1.x 优化:
缓存有点像通配符。 理论上,当存在大量小文件时,缓存运行效果最佳。 然而,这需要大量的文件 I/O。 对于工作流程和应用性能来说,将一些密切相关的文件串联起来可能是有意义的。 仔细考虑您自己的经验以及其他开发人员在实施 HTTP/2 时分享的经验。
域名分片可能是最极端的,也可能是最成功的 HTTP/1.x 优化策略。 您可以使用某个版本的域分片,它仍然可以提高 HTTP/1.x 的性能,但对于 HTTP/2 来说基本上被忽略,并且是有益的。 (由于使用单个连接,因此通常不会从域分片中受益。)
对于 HTTP/2 友好的分片,需要做以下两件事:
有关详细信息,请参阅RFC 7540 ,超文本传输协议版本 2 (HTTP/2) 。
如果这些条件满足,HTTP/1.x 就会发生分片——域名足够不同,从而触发浏览器创建额外的连接集——而 HTTP/2 则不会;单独的域名将被视为一个域名,单个连接可以访问所有域名。
HTTP/2 和 TLS 可能会提高您的网站性能,并让用户知道他们与您网站的交互是安全的。 无论您是第一个实现 HTTP/2 的人,还是正在追赶竞争对手,您都可以快速、良好地添加 HTTP/2 支持。
使用这些技巧可以帮助您以最少的持续努力实现最高的 HTTP/2 性能,这样您就可以专注于创建易于维护和运行的快速、有效、安全的应用。
“这篇博文可能引用了不再可用和/或不再支持的产品。 有关 F5 NGINX 产品和解决方案的最新信息,请探索我们的NGINX 产品系列。 NGINX 现在是 F5 的一部分。 所有之前的 NGINX.com 链接都将重定向至 F5.com 上的类似 NGINX 内容。”