历史悠久的超文本传输协议,即HTTP标准,最近版本升级了。HTTP/2在2015年5月被批准,目前已经在不少Web浏览器和服务器中获得实现(包括NGINX Plus和开源NGINX)。大约有三分之二的浏览器已经支持HTTP/2,并且这个比例每个月都在增长。html
HTTP/2构建在Google SPDY协议基础之上,Chrome将在2016年年初中止对后者的支持。NGINX是最先支持SPDY的,现在一样率先支持了HTTP/2。为此,咱们还发布了详尽的白皮书(PDF),介绍了HTTP/2以及它如何基于SPDY构建,并展现了如何实现这个新协议。前端
HTTP/2的重要特性彻底源自SPDY。nginx
- HTTP/2是二进制(而文本)协议,所以更简洁高效;
- 它针对每一个域只使用一个多路复用的链接,而不是每一个文件一个链接;
- 首部使用特制的HPACK协议(而非SPDY中使用的gzip)压缩;
- HTTP/2设计了复杂的优先级排定规则,帮助浏览器首先请求最急需的文件,而NGINX已经支持(SPDY的方案要简单一些)。
如今,你须要决定是否迁移到HTTP/2,而其中关键是知道如何最大限度地利用它。这篇文章会带你了解从性能角度考虑为何要作这个决定,以及如何实现。接下来咱们要逐一讨论关于HTTP/2性能的7个小建议。web
注意:严格来说,SPDY和HTTP/2都不须要TLS,但它们在使用SSL/TLS的时候用处最大,并且浏览器只在使用SSL/TLS时才支持SPDY或HTTP/2。算法
建议一:如今是否须要迁移到HTTP/2
实现HTTP/2很简单,看看咱们的白皮书就明白了(PDF)。不过,HTTP/2并非万能的银弹,它只对某些Web应用有用,对另一些则没那么有用。数据库
若是你使用SSL/TLS(之后简称TLS),那么HTTP/2能够提高网站性能。若是你没有,那在使用HTTP/2以前要先支持TLS。这时候,使用TLS的性能损耗大体能够被使用HTTP/2的性能提高抵销。不过仍是建议你在实际应用以前先测试一下。浏览器
HTTP/2有五大优点。缓存
- 每一个服务器只用一个链接。HTTP/2对每一个服务器只使用一个链接,而不是每一个文件一个链接。这样,就省掉了屡次创建链接的时间,这个时间对TLS尤为明显,由于TLS链接费时间。
- 加速TLS交付。HTTP/2只需一次耗时的TLS握手,而且经过一个链接上的多路利用实现最佳性能。HTTP/2还会压缩首部数据,省掉HTTP/1.x时代所需的一些优化工做,好比拼接文件,从而提升缓存利用率。
- 简化Web应用。使用HTTP/2可让Web开发者省不少事,由于不用再作那些针对HTTP/1.x的优化工做了。
- 适合内容混杂的页面。HTTP/2特别适合混合了HTML、CSS、JavaScript、图片和有限多媒体的传统页面。浏览器能够优先安排那些重要的文件请求,让页面的关键部分先出现,快出现。
- 更安全。经过减小TLS的性能损失,可让更多应用使用TLS,从而让用户信息更安全。
HTTP/2的多路复用示意图安全
相应地,HTTP/2也有五个不足之处。服务器
- 单链接开销比较大。HPACK数据压缩算法会更新两端的查找表。这样可让链接有状态,而破坏状态就意味着要重建查找表,另外单链接占用内存较多。
- 你可能不须要SSL。若是你的数据不须要保护,或者已经使用DRM或其余编码进行保护了,那么TLS的安全性对你可能无所谓。
- 须要抛弃针对HTTP/1.x的优化。HTTP/1.x优化在支持HTTP/2的浏览器中会影响性能,所以可能须要花时间把它们推倒重来。
- 对下载大文件不利。若是你的应用主要提供大文件下载或者流媒体播放,那可能不想用TLS,并且在只有一个流的状况下,多路复用也体现不出什么优点。
- 你的客户也许不在意。你的客户极可能不在意他分享的自家猫咪的视频是否受到TLS和HTTP/2的保护。
总之,一切要看性能。这方面,有好消息也有坏消息。
好消息是咱们在内部对NGINX作过测试,结果从理论上可以获得印证:对于要经过典型网络延迟请求的混合内容网页,HTTP/2的性能好于HTTP/1.x和HTTPS。基于链接的RTT,结果能够分三种状况。
- 很低的RTT(0-20ms):HTTP/1.x、HTTP/2和HTTPS基本无差异。
- 典型网络RTT(30-250ms):HTTP/2比HTTP/1.x快,并且它们都比HTTPS快。美国两个相邻城市间的RTT约为30 ms,而东西海岸间(约3000英里)则约为70 ms。东京到伦敦间最短路径的RTT大约240 ms。
- 高RTT(300ms及以上):HTTP/1.x比HTTP/2快,后者又比HTTPS快。
这张图显示了首次渲染的时间,也就是用户第一次在本身屏幕上看到网页内容的时间。这个时间通常认为关系到用户对网站响应速度的感知。
要想了解咱们测试的更多内容,请看这个HTTP/2的介绍视频,来源是nginx.conf 2015。
然而,每一个网页都不相同,实际上每一个用户的会话也不同。若是你托管流媒体或提供大文件下载,那你的决定可能不同,甚至相反。
你最终可能发现投入产出比并不明显。若是是这样,那你得多学习一下,针对本身的内容多作一些测试,而后我们能够聊一聊。(想找点资料?能够看看NGINX网络研讨:What’s New in HTTP/2?)。
建议二:终止HTTP/2和TLS
终止协议意味着客户端使用指望的协议链接代理服务器,好比TLS或HTTP/2,而后代理服务器再去链接应用服务器、数据库服务器等,但不须要使用相同的协议,以下图所示。
使用独立的服务器终止协议意味着使用多服务器架构。多服务器多是多个物理服务器、多个虚拟服务器,或者AWS这样的云环境中的多个虚拟服务器实例。多服务器就比单服务器复杂,或者比应用服务器/数据库服务器的组合复杂。不过,多服务器架构有不少好处,并且不少流量大的网站也必须用这种架构。
配置了服务器或者虚拟服务器以后,不少事情都成为可能。新服务器能够分担其余服务器的负载,可用于负载平衡、静态文件缓存和其余用途。另外,也可让添加和替换应用服务器或其余服务器更容易。
NGINX和NGINX Plus常常被用来终止TLS和HTTP/2协议、负载平衡。已有环境没必要改动,除非要把NGINX服务器挪到前端。
建议三:考虑从SPDY开始
SPDY是HTTP/2的上一代,整体性能相同。由于它已经出现好几年了,因此有不少浏览器支持SPDY却不支持HTTP/2。不过,在本文写做时,这个支持上的差距正在缩小。具体来讲,有三分之二的浏览器支持HTTP/2,而有五分之四的浏览器支持SPDY。
若是你着急采用新的Web传输协议,又想尽量覆盖更多用户,能够先从SPDY开始。而后到2016年初,即谷歌再也不支持SPDY的时候,再切换到HTTP/2,很简单,至少在NGINX中如此。那时候,更多用户会拥有支持HTTP/2的浏览器,而你已经为其中大部分用户提供了很好的性能。
建议四:找出为HTTP/1.x优化的代码
在决定采用HTTP/2以前,首先得知道你的代码有哪些是针对HTTP/1.x优化过的。大概有四方面的优化。
- 分域存储。为了实现并行请求文件,你可能把文件分散到了不一样的域里,CDN会自动这么作。但分域存储会影响HTTP/2的性能,建议使用HTTP/2友好的分域存储(建议七),只针对HTTP/1.x用户分域。
- 雪碧图。雪碧图把不少图片拼成一个文件,而后经过代码按需取得每一个图片。雪碧图在HTTP/2的环境下没太大用处,但仍是有点用的。
- 拼接的代码文件。与使用雪碧图的缘由相似,不少独立的文件也会被弄成一个,而后浏览器再从其中找到并运行须要的文件。
- 插入行内的文件。CSS代码、JavaScript代码,甚至图片等被直接插到HTML文件中的内容。这样能够减小文件传输,代价是初始HTML文件较大。
后面三种优化都涉及把小文件塞进一个较大的文件里,目的是减小新建链接的初始化和握手,这些操做对TLS而言很是费时间。
第一种优化即分域存储偏偏相反,强制打开多个链接,目的是并行地从不一样的域获取文件。这两种看似矛盾的技术对于HTTP/1.x下的站点却十分有效。然而,要用好这两种技术,必须投入大量时间、精力和资源,用于实现、管理和运维。
在采用HTTP/2以前,须要找出应用了这些优化的代码,分析一下它们会不会影响你的应用设计和工做流程。这样在迁移到HTTP/2以后,就能够着手改造它们,甚至撤销某些优化。
建议五:部署HTTP/2或SPDY
事实上,部署HTTP/2或SPDY并不难。若是你使用NGINX,只要在配置文件中启动相应的协议就能够了,参见这里了解如何启用HTTP/2(PDF)。浏览器和服务器会协商采用什么协议,若是浏览器支持HTTP/2(并且也在使用TLS),就会使用HTTP/2。
配置完服务器后,使用支持HTTP/2浏览器的用户就会基于HTTP/2运行你的应用,而使用旧版本浏览器的用户则会继续使用HTTP/1.x运行你的应用,以下图所示。若是你的网站流量很是大,那么应该监测改变先后的性能,对于性能下降的状况,可能就得撤销更改。
注意:使用HTTP/2及其单链接以后,NGINX某些配置的重要性会很明显,特别要注意的是output_buffers
、proxy_buffers
和ssl_buffer_size
等指令,多测试一下。参见general configuration notes,特定的SSL建议(在这里 and here),以及NGINX关于SSL性能的白皮书(PDF)。
注意:使用HTTP/2传输密文要格外注意。HTTP/2的RFC中有一个长长的列表,列出了要避免的加密套件。建议你本身也搞一个表格,启用ssl_buffer_size
,而后在全部经常使用的浏览器版本下测试你想用的加密套件。
建议六:再谈HTTP/1.x优化
你说奇怪不,撤销和修改针对HTTP/1.x优化的代码竟然是实现HTTP/2最有创意的部分。这里面有几个问题要注意,由于不少事怎么作都是能够的。
在开始运做以前,必须考虑旧版本浏览器用户是否好过。以后,能够采起三个策略撤销和修改HTTP/1.x的优化。
- 什么也不用作。假如你并无针对HTTP/1.x作过优化,或者只作过少许优化,那么你几乎什么也不用作,就能够直接迁移到HTTP/2。
- 有选择地去作。第二种状况是减小合并某些文件,而不是彻底不合并。好比,牵扯到不少场景的雪碧图就不用动,而被塞得满满的HTML可能就要分离出来一些。
- 彻底撤销HTTP/1.x优化(不过请先参考建议七中关于分域存储的建议)。能够再也不作之前作过的任何优化。
缓存仍是普适的。理论上,缓存操做很是适合小文件特别多的状况。可是,小文件多也意味着文件I/O多。所以一些相近文件的合并仍是必要的,一方面要考虑工做流程,另外一方面要考虑应用性能。建议多关注一下其余人在过渡到HTTP/2过程当中的一些经验。
建议七:实现智能分域
分域存储多是最极端但也最成功的HTTP/1.x优化策略。它可以提高HTTP/1.x下的应用性能,但在HTTP/2之下,其性能提高能够忽略不讲(由于只有一个链接。)
对HTTP/2友好的分域,要保证如下两点。
- 让多个域名解析到同一个IP。
- 确保证书包含通配符,以便全部分域名均可以使用,适当的多域证书固然也能够。
具体细节,请参考这里。
有了这些保障,分域还会继续对HTTP/1.x有效,即域名仍然能够触发浏览器建立更多链接,但对HTTP/2则无效,由于这些域名会被当作同一个域,一个链接就能够访问全部域名了。
小结
HTTP/2和TLS组合能够提高你的站点性能,而且让用户以为你的网站很安全。不管你是率先在本身的应用里实现HTTP/2,仍是要赶超竞争对手,均可以又快又好地实现对HTTP/2的支持。
但愿这篇文章能让你以最少的努力得到最大的HTTP/2性能收益,并且今后你能够把注意力集中到编写更快、更有效、更安全的应用上,让本身的应用更容易维护和运维。
参考资源
- 要全面了解HTTP/2,能够看看NGINX的白皮书(PDF)。
- 在Can I use网站中能够查到浏览器对各类前端技术的支持状况,包括SPDY和HTTP/2。
- 要了解咱们测试的细节,参考这里HTTP/2 presentation。
- NGINX有一个Web研讨班:What’s New in HTTP/2?,讨论了核心特性并给出了实现建议。
- 要了解NGINX关于性能的建议,请参考咱们的博客:10 Tips for 10x Application Performance。