使用HTTP/2提高性能的7个技巧HTTP/2于2015年5月获得批准,目前在许多Web浏览器和服务器(包括NGINXPlus和开源NGINX)中实施。大约三分之二的浏览器已经支持HTTP/2,而且这个百分比每个月都在增加。HTTP/2建立在Google的SPDY协议之上,Chrome将在2016年初停止支持该协议。NGINX是第一个支持SPDY的,现在它也是第一个支持HTTP/2的。为此,我们还发布了一份详尽的白皮书(PDF),其中介绍了HTTP/2及其构建在SPDY上的方式,并展示了如何实施这一新协议。HTTP/2的重要特性完全源自SPDY。HTTP/2是二进制(和文本)协议,因此更简洁高效;每个域只使用一个多路复用连接,而不是每个文件一个连接;标头使用特殊的HPACK协议(而不是SPDYgzip)压缩;HTTP/2设计了复杂的优先级规则来帮助浏览器首先请求最急需的文件,而NGINX已经支持了(SPDY的解决方案更简单)。现在,您需要决定是否迁移到HTTP/2,关键是知道如何充分利用它。本文将向您介绍为什么要从性能角度做出这个决定,以及如何实现它。接下来我们将一一讨论关于HTTP/2性能的7条小建议。现在是否需要迁移到HTTP/2终止HTTP/2和TLS考虑从SPDY开始寻找针对HTTP/1.x优化的代码部署HTTP/2或SPDY谈谈HTTP/1.x优化实现智能分域注意:Strict一般来说,SPDY和HTTP/2都不需要TLS,但它们在使用SSL/TLS时最有用,而浏览器仅在使用SSL/TLS时支持SPDY或HTTP/2。建议一:现在是否有必要迁移到HTTP/2来实现HTTP/2很简单,看我们的白皮书就可以了。然而,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也有五个不足。单连接开销比较大。HPACK数据压缩算法更新两端的查找表。这使得连接是有状态的,破坏状态意味着重建查找表,单个连接占用更多内存。您可能不需要SSL。如果您的数据不需要保护,或者已经受到DRM或其他编码的保护,那么TLS的安全性对您来说可能无关紧要。需要放弃对HTTP/1.x的优化。HTTP/1.x优化会影响支持HTTP/2的浏览器的性能,因此删除它们并重新开始可能需要一些时间。不适合下载大文件。如果你的应用主要提供大文件下载或者流媒体播放,你可能不想使用TLS,而且在只有一个流的情况下,多路复用并没有体现出太大的优势。您的客户可能不在乎。您的客户很可能不关心他分享的关于他的猫的视频是否受TLS和HTTP/2保护。简而言之,一切都取决于性能。在这方面,有好消息也有坏消息。好消息是我们已经在内部测试了NGINX,结果是理论上的:HTTP/2优于HTTP/1。基于连接的RTT,结果可以分为三种情况。RTT极低(0-20ms):HTTP/1.x、HTTP/2、HTTPS基本没有区别。典型网络RTT(30-250ms):HTTP/2比HTTP/1.x快,它们都比HTTPS快。美国两个相邻城市之间的RTT约为30毫秒,东西海岸(约3000英里)之间的RTT约为70毫秒。东京和伦敦之间最短路径的RTT约为240毫秒。高RTT(300毫秒及以上):HTTP/1.x比HTTP/2快,后者又比HTTPS快。此图显示首次呈现的时间,即用户首次在屏幕上看到Web内容的时间。这个时间一般被认为与用户对网站响应速度的感知有关。要详细了解我们测试的内容,请观看来自nginx.conf2015的关于HTTP/2的介绍性视频。但是,每个网页都是不同的,实际上每个用户会话都是不同的。如果您托管流媒体或提供大文件下载,您的决定可能会有所不同,甚至相反。您可能最终会发现投资回报率并不明显。如果是这样,请多学习一点,对您的内容进行一些测试,然后我们可以聊天。(寻找一些信息?查看NGINX网络研讨会:HTTP/2中的新功能?)。建议二:终止HTTP/2和TLS终止协议是指客户端使用期望的协议连接代理服务器,比如TLS或者HTTP/2,代理服务器再连接应用服务器、数据库服务器等,但不需要使用相同的协议,如下所示。使用独立的服务器终止协议意味着使用多服务器架构。多个服务器可以是多个物理服务器、多个虚拟服务器或云环境(如AWS)中的多个虚拟服务器实例。多个服务器比单个服务器或组合的应用程序服务器/数据库服务器更复杂。但是,多服务器架构有很多好处,很多高流量的网站也必须采用这种架构。配置服务器或虚拟服务器后,许多事情都变得可能。新服务器可以卸载其他服务器,并可用于负载平衡、静态文件缓存和其他目的。它还可以更轻松地添加和替换应用程序服务器或其他服务器。NGINX和NGINXPlus常用于终止TLS和HTTP/2协议,负载均衡。现有环境不需要改动,除非把NGINX服务器搬到前端。建议三:考虑入手SPDYSPDY是上一代HTTP/2,整体性能相同。因为它已经存在好几年了,所以有很多浏览器支持SPDY但不支持HTTP/2。然而,在撰写本文时,这种支持差距正在缩小。具体来说,三分之二的浏览器支持HTTP/2,五分之四的浏览器支持SPDY。如果你急于采用一种新的网页传输协议,想覆盖尽可能多的用户,可以从SPDY入手。然后在2016年初,当谷歌停止支持SPDY时,切换到HTTP/2很容易,至少在NGINX中是这样。到那时,更多用户将拥有支持HTTP/2的浏览器,而您已经为其中的大多数用户提供了出色的性能。提示#4:找出哪些代码针对HTTP/1.x进行了优化在决定采用HTTP/2之前,您必须首先了解代码的哪些部分针对HTTP/1.x进行了优化。大约有四个优化。域存储。为了并行请求文件,您可以将文件分散到不同的域,CDN会自动执行此操作。但是,特定于域的存储会影响HTTP/2的性能。推荐使用HTTP/2-friendlydomain-specificstorage(见建议7),仅针对HTTP/1.x用户域划分。图像精灵。图片精灵将多张图片组合成一个文件,然后通过代码按需获取每张图片。图像精灵在HTTP/2环境中不是很有用,但它们仍然很有用。串联的代码文件。类似于使用图像精灵的原因,许多单独的文件也被组合成一个,然后浏览器从中找到并执行所需的文件。内联文件。CSS代码、JavaScript代码,甚至图像都直接插入到HTML文件的内容中。这以更大的初始HTML文件为代价减少了文件传输。后三个优化都是将小文件塞进一个大文件,以减少新连接的初始化和握手,这对TLS来说是非常耗时的。第一个优化,domain-specificstorage,恰恰相反,强制打开多个连接,以便从不同的域并行获取文件。这两种看似矛盾的技术对于HTTP/1.x下的站点却非常有效。但是,要用好这两项技术,必须在实施、管理和运维上投入大量的时间、精力和资源。在采用HTTP/2之前,您需要找出应用这些优化的代码,并分析它们是否会影响您的应用程序设计和工作流程。这样,在迁移到HTTP/2之后,您可以开始对它们进行转换,甚至可以取消一些优化。建议五:部署HTTP/2或SPDY其实部署HTTP/2或SPDY并不难。如果你使用NGINX,只需要在配置文件中启用相应的协议即可,参见这里如何启用HTTP/2。浏览器和服务器协商使用什么协议,如果浏览器支持HTTP/2(并且也在使用TLS),它将使用HTTP/2。配置好服务器后,使用支持HTTP/2的浏览器的用户将基于HTTP/2运行你的应用,而使用旧浏览器的用户将继续使用HTTP/1.x来运行你的应用,如下图所示。如果您的网站流量很大,您应该监控更改前后的性能,并且可能必须在性能下降时撤消更改。注意:在使用了HTTP/2及其单连接之后,NGINX的一些配置的重要性就会很明显。特别要注意output_buffers、proxy_buffers和ssl_buffer_size等指令。多测试一下。请参阅一般配置提示、特定SSL建议(此处和此处)以及有关SSL性能的NGINX白皮书。注意:使用HTTP/2传输密文时应格外小心。HTTP/2的RFC有一长串要避免的密码套件。建议大家自己做一个表,开启ssl_buffer_size,在所有常用的浏览器版本下测试你要使用的密码套件。建议6:再说说HTTP/1.x的优化。奇怪的是,撤销和修改为HTTP/1.x优化的代码实际上是实现HTTP/2最有创意的部分。这里有几个问题需要注意,因为很多事情可以用任何方式来完成。在开始工作之前,您必须考虑使用旧版浏览器的用户是否会过得更好。之后,可以使用三种策略来撤销和修改HTTP/1.x优化。没做什么。如果你没有针对HTTP/1.x的优化,或者只有少量优化,你几乎可以直接迁移到HTTP/2。有选择地做。第二种情况是少合并一些文件,而不是完全不合并。例如,涉及很多场景的图像精灵不需要移动,而填充的HTML可能需要分离。完全取消HTTP/1.x优化(但请先参考建议7中关于域特定存储的建议)。之前所做的任何优化都无法再进行。缓存仍然很普遍。理论上,缓存操作非常适合小文件比较多的情况。然而,更多的小文件也意味着更多的文件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)。在CanIuse网站上,您可以查看浏览器对各种前端技术的支持,包括SPDY和HTTP/2。有关我们测试的详细信息,请参阅此HTTP/2演示文稿。NGINX有一个网络研讨会:HTTP/2有什么新功能?讨论核心功能并给出实施建议。有关NGINX的性能建议,请参阅我们的博客:10条提高应用程序性能的10个技巧。
