我有一个在nginx代理后面运行的node.js服务器。 node.js在端口3000上运行HTTP 1.1(无SSL)服务器。两者均在同一服务器上运行。

我最近将nginx设置为将HTTP2与SSL(h2)结合使用。似乎HTTP2确实已启用并且可以正常工作。

但是,我想知道代理连接(nginx node.js)正在使用HTTP 1.1的事实是否会影响性能。也就是说,因为我的内部连接是HTTP 1.1,我是否在速度方面缺少HTTP2的好处?

最佳答案

通常,HTTP/2的最大直接好处是multiplexing为浏览器连接提供了速度提高,而浏览器连接通常受高延迟(即,慢的往返速度)阻碍。这些还减少了多个连接的需求(和费用),可以尝试在HTTP/1.1中获得类似的性能优势。

对于内部连接(例如,充当反向代理的Web服务器与后端应用程序服务器之间),延迟通常非常非常低,因此HTTP/2的速度优势可忽略不计。此外,每个应用程序服务器通常已经是一个单独的连接,因此这里再也没有收获。

因此,仅在边缘支持HTTP/2,您将获得的大部分的性能优势。这是一个相当普遍的设置-与HTTPS通常在反向代理/负载平衡器上终止而不是一直执行的方式类似。

但是,始终支持HTTP/2有潜在的好处。例如,它可以允许服务器从应用程序一直推送。由于HTTP/2的二进制性质和 header 压缩,该最后一跳的数据包大小减小也可能带来好处。尽管像延迟一样,带宽对于内部连接而言通常不是一个大问题,所以这一点的重要性是有争议的。最后有人认为,反向代理将HTTP/2连接到HTTP/2连接的工作比连接HTTP/1.1连接少,因为不需要将一个协议(protocol)转换为另一个协议(protocol),尽管我对此持怀疑态度。引人注意,因为它们是单独的连接(除非它仅充当TCP直通代理的角色)。因此,对我来说,端到端HTTP/2的主要原因是允许端到端服务器推送,但允许even that is probably better handled with HTTP Link Headers and 103-Early Hints due to the complications in managing push across multiple connections

就目前而言,尽管服务器仍在增加支持并且服务器推送使用率很低(并且仍在尝试以定义最佳实践),但我建议仅在终点使用HTTP/2。在撰写本文时,Nginx还不支持ProxyPass连接的HTTP/2(尽管Apache支持),并且具有no plans to add this,并且它们对单个HTTP/2连接是否可能引入慢速提出了一个有趣的观点(强调我的观点)。 :



最后,还应该注意的是,尽管浏览器要求HTTPS为HTTP/2(h2),但大多数服务器不需要,因此可以支持通过HTTP(h2c)进行的最后一跳。因此,如果Node部分中不存在端到端加密(因为通常不存在),则无需端到端加密。但是,根据后端服务器相对于前端服务器的位置而言,即使流量将通过不安全的网络(例如CDN到Internet上的原始服务器)进行传输,甚至对于此连接也应使用HTTPS。

关于node.js - HTTP2与Nginx代理后面的node.js,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41637076/

10-10 00:32
查看更多