我有一个在nginx代理后面运行的node.js服务器. node.js在端口3000上运行HTTP 1.1(无SSL)服务器.两者都在同一服务器上运行.
我最近设置nginx使用HTTP2和SSL(h2).似乎HTTP2确实启用并正常工作.
但是,我想知道代理连接(nginx< - > node.js)使用HTTP 1.1的事实是否会影响性能.也就是说,我在速度方面缺少HTTP2优势,因为我的内部连接是HTTP 1.1?
解决方法:
通常,HTTP / 2的最大直接好处是multiplexing为浏览器连接提供的速度增加,这通常受到高延迟(即慢速往返速度)的阻碍.这些也减少了多个连接的需求(和费用),这是尝试在HTTP / 1.1中实现类似性能优势的一种方法.
对于内部连接(例如,充当反向代理的Web服务器和后端应用服务器之间),延迟通常非常非常低,因此HTTP / 2的速度优势可以忽略不计.此外,每个应用服务器通常已经是一个单独的连接,所以再次没有收获.
因此,只需在边缘支持HTTP / 2,您将获得大部分性能优势.这是一种相当常见的设置 – 类似于HTTPS通常在反向代理/负载均衡器上终止而不是一直完成的方式.
但是,一直支持HTTP / 2有潜在的好处.例如,它可以允许服务器从应用程序一直推送.由于HTTP / 2的二进制特性和报头压缩,最后一跳的数据包大小减少也带来了潜在的好处.虽然像延迟一样,带宽通常不是内部连接的问题,因此这一点的重要性是有争议的.最后有人争辩说,反向代理连接HTTP / 2连接到HTTP / 2连接的工作少于对HTTP / 1.1连接的连接,因为不需要将一个协议转换为另一个协议,尽管如果这是偶然的话我会持怀疑态度因为它们是单独的连接是显而易见的(除非它仅仅作为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连接是否会引入缓慢(强调我的)提出了一个有趣的观点:
Is HTTP/2 proxy support planned for the near future?
Short answer:
No, there are no plans.
Long answer:
There is almost no sense to implement it, as the main HTTP/2 benefit
is that it allows multiplexing many requests within a single
connection, thus [almost] removing the limit on number of
simalteneous requests – and there is no such limit when talking to
your own backends. Moreover, things may even become worse when using
HTTP/2 to backends, due to single TCP connection being used instead
of multiple ones.On the other hand, implementing HTTP/2 protocol and request
multiplexing within a single connection in the upstream module will
require major changes to the upstream module.Due to the above, there are no plans to implement HTTP/2 support in
the upstream module, at least in the foreseeable future. If you
still think that talking to backends via HTTP/2 is something needed –
feel free to provide patches.
最后,还应该注意的是,虽然浏览器需要HTTPS for HTTP / 2(h2),但大多数服务器都不需要,因此可以通过HTTP(h2c)支持最后一跳.因此,如果节点部分不存在端口加密,则不需要端到端加密(因为它通常不存在).但是,根据后端服务器相对于前端服务器的位置,即使对于此连接也使用HTTPS,如果流量将通过不安全的网络(例如,通过互联网的CDN到源服务器),则应该考虑这一点.