我正在提供 http 还是 http2



Background

一段时间以来,我一直在单个VPS上托管多个节点.js应用程序,一切都很好。

我能够通过使用nginx将流量路由到节点应用程序所需的不同端口来做到这一点.js。

升级到 http2

随着最近对http2的推动,我一直在尝试通过启用http2来支持我的应用程序。在nginx上,我能够按照nginx的指南做到这一点。

问题所在

进行基准测试时,在为主页获取 47 个请求的测试网站上使用 http2 时,性能似乎没有提高

http 和 http2 的性能似乎相似。

理论

可能是由于nodejs服务于http1而不是http2吗?

我必须在nginx和我的nodejs应用程序之间设置任何东西吗?例如proxy_http_version: 2.0但是,proxy_http_version 2.0似乎还没有。

我的 nodejs 应用程序使用快速服务,所以我真的得到了 http2 连接还是获得了 http 连接?

当我使用 http2 指示器时,它通过指示蓝灯告诉我该网站正在使用 http2。我必须使用molnarg的http2模块还是nginx http2模块就足够了?

希望有更多开发运营经验的人可以帮助我和许多其他开发人员解决这个问题。

所以有几件事需要注意。

首先,值得回到http/2与http/1.1的不同之处,它将有所帮助,以及它不会。

Http/2 将主要有利于延迟以及需要通过低延迟连接下载大量资源的情况。还有其他一些好处,但这是主要的性能优势。

在 http/1.1 下,如果你请求一个页面(比如 index.html),并且它加载了 10 个 CSS 资源和 10 个 JavaScript 资源,那么浏览器将依次请求这 20 个资源中的每一个,等待请求从浏览器一直到服务器再返回,直到它可以请求下一个资源。服务器可能可以非常快速地获取资源(特别是对于像css和javascript这样的静态资源),所以大部分时间将花在互联网上来回旅行,而不是在两端处理它。这些数字很小(例如 100ms 往返),但将它们加起来的多个请求乘以(例如,此示例为 2,000ms 或 2 秒 - 忽略任何一侧的处理时间)。浏览器试图通过向服务器打开多个请求(通常为 4-6 个)来解决这个问题,因此当存在请求队列(如这里的 20 个请求)时,它们可以并行获取 4-6 个请求,而不是等待每个请求串行完成。因此,在此示例中,我们可能能够将其拆分为在 4 个连接中的每个连接上加载 20 个资源中的 5 个,因此下载所有资源可能只需要 500 毫秒 - 这是对单个连接的良好改进。但它有点捏造,在设置和管理这些额外连接方面有其自身的问题。

Http/2 旨在通过允许通过单个连接以任何顺序发送请求来减少这种影响,而不必等待响应。因此,浏览器可以通过单个连接一个接一个地请求这 20 个资源,而不必等待每个资源返回。因此,请求同时在互联网上并行传输。因此,在最好的情况下,我们只需要等待一次往返的长度(100ms)即可交付所有 20 个资源。

关键的一点是,对于单个资源来说,http/2本身并不"更快"。对于许多资源来说,它只是更快。在完全最佳的情况下(例如延迟为 0 毫秒),http/1.1 和 http/2 请求将几乎相同,没有真正的性能改进。

因此,有了这个理论,让我们指出您的特定场景的一些事情:

    Nginx->
  1. Node连接的重要性不如Browser->Nginx重要。这是因为该连接的延迟会更糟(假设您的 Nginx 和 Node 位于足够接近的服务器上(甚至可能是同一台服务器),因此它们之间的延迟最小)。我想你的Nginx->Node连接仍然是http/1.1,但这不是一个真正的问题,因为这个原因,也因为Nginx将能够同时打开到不同节点服务器的多个连接(甚至多个连接到同一节点服务器)。

  2. 您从哪里进行测试,到您的网络服务器的跃点数是多少?例如,如果在公司网络上进行测试,并且在与数据中心相同的网络上进行测试,则延迟将很低,因此改进可能不会明显。我从您的屏幕截图中看到您在开发人员工具中将连接设置为"Wi-Fi",但这仍然可能不够慢,无法看到性能提高。

  3. 延迟是您的网页/应用程序的问题吗?可能是您的网站非常优化,以至于它按照所需的顺序获得了所需的资源,并且几乎无法跟上所有 20 个请求。然后,处理这些请求/响应需要时间 - 要么在浏览器中解析和渲染CSS/JavaScript,要么在服务器中提供请求(例如,因为它必须进行大量处理或连接到数据库以返回该资源)。因此,网络延迟实际上可能不是您的网站的问题(尽管,但对于除最简单的网站之外的所有网站来说,这是一个问题)。

  4. 鉴于http/2仍然相当前沿,如何衡量改进?我听说有轶事证据表明,Chrome Developer 工具尚未准确报告 http/2 次,并且正在销售这些好处。其他性能测试工具甚至可能根本无法识别http/2,因此可能会回退到HTTP/1.1。顺便说一句,以下是http/2测试资源的列表,但是,就像Chrome开发人员工具一样,大多数似乎都有助于测试您是否正在使用HTTP/2,而不是它的任何性能优势:https://blog.cloudflare.com/tools-for-debugging-testing-and-using-http-2/

最新更新