我提供的是 http 还是 http2?
Posted
技术标签:
【中文标题】我提供的是 http 还是 http2?【英文标题】:Am I serving http or http2? 【发布时间】:2016-04-25 20:46:23 【问题描述】:背景
我已经hosting multiple node.js apps on a single VPS 有一段时间了,一切都很好。
我可以通过使用 nginx 将流量路由到 node.js 应用程序所需的不同端口来做到这一点。
升级到 http2
使用最近的push for http2,我一直在尝试通过启用 http2 来支持我的应用程序。在 nginx 上,我可以通过 nginx 的following the guide 这样做。
问题
在进行基准测试时,性能似乎没有提高,而在测试网站上使用 http2 时会获取 47 个主页请求。
http 和 http2 的性能似乎相似。
理论
可能是因为 nodejs 服务的是 http1 而不是 http2?
我必须在 nginx 和我的 nodejs 应用程序之间设置什么吗?例如proxy_http_version: 2.0
但是,proxy_http_version 2.0
doesn't seem to be available yet。
我的 nodejs 应用程序与 express 一起使用,所以我真的获得了 http2 连接还是获得了 http 连接?
当我使用http2 indicator 时,它通过指示蓝光告诉我该网站正在使用http2。 我必须使用molnarg's http2 module还是nginx http2模块就足够了?
希望有更多开发运维经验的人可以帮助我和许多其他开发人员解决这个问题。
【问题讨论】:
你知道http2其实是https的继承者吗? 【参考方案1】:所以有几点需要注意。
首先,有必要回顾一下 http/2 与 http/1.1 的不同之处,哪些地方会有帮助,哪些地方没有帮助。
Http/2 主要有利于延迟以及需要通过低延迟连接下载大量资源时。还有一些其他好处,但这是主要的性能好处。
在 http/1.1 下,如果你请求一个页面(比如 index.html),它会加载 10 个 CSS 资源和 10 个 javascript 资源,那么浏览器将依次请求这 20 个资源中的每一个,等待请求完成从浏览器到服务器并返回的方式,直到它可以请求下一个资源。服务器可能可以非常快速地获取资源(尤其是对于像 css 和 javascript 这样的静态资源),因此大部分时间将用于在 Internet 上来回移动,而不是在任一端处理它。这些数字很小(例如往返 100 毫秒),但它们加起来是多个请求的倍数(例如,本示例为 2,000 毫秒或 2 秒 - 忽略任何一方的处理时间)。浏览器试图通过向服务器打开多个请求(通常是 4-6 个)来解决这个问题,所以当有一个请求队列(比如这里的 20 个请求)时,它们可以并行获得 4-6 个,而不是等待每个请求完成串行。所以在这个例子中,我们可以将它拆分为在 4 个连接中的每一个上加载 20 个资源中的 5 个,因此下载它们可能只需要 500 毫秒 - 对单个连接来说是一个很好的改进。但这有点做作,并且在设置和管理这些额外的连接方面有其自身的问题。
Http/2 旨在通过允许通过单个连接以任何顺序发送请求来减少这种影响,而无需等待响应。因此,浏览器可以通过一个连接一个接一个地请求这 20 个资源,而无需等待每个资源返回。因此,请求同时在 Internet 上并行传输。因此,在最佳情况下,我们只需要等待单次往返 (100 毫秒) 的长度即可交付所有 20 个资源。
关键是 http/2 对于单个资源本身并不“更快”。对于许多资源来说,它的速度更快。在完全最优的情况下(例如 0 毫秒的延迟),http/1.1 和 http/2 请求将几乎相同,没有真正的性能改进。
因此,根据我们的理论,让我们针对您的特定场景指出一些事情:
Nginx->Node 连接比 Browser->Nginx 更重要。这是因为该连接的延迟会差很多(假设您的 Nginx 和 Node 位于足够靠近的服务器(甚至可能是同一台服务器)上,因此它们之间的延迟最小)。我想你的 Nginx->Node 连接 is 仍然是 http/1.1 但这并不是一个真正的问题,因为 Nginx 将能够同时打开到不同节点服务器的多个连接(甚至与同一节点服务器的多个连接)。
您从哪里进行测试以及到您的网络服务器有多少跃点?例如,如果在公司网络上进行测试,并且在与数据中心相同的网络上进行测试,则延迟会很低,因此改进可能不会很明显。我从您的屏幕截图中看到您在开发者工具中将连接设置为“Wi-Fi”,但速度可能还不够慢,无法看到性能提升。
延迟是您的网页/应用程序的问题吗?可能是您的网站进行了超级优化,以至于它按照所需的顺序获取所需的资源,并且几乎无法跟上所有 20 个请求的原样。然后在任一端都需要时间来处理这些请求/响应 - 在浏览器中解析和呈现 CSS/JavaScript 或在服务器中提供请求(例如,因为它必须进行大量处理或连接到数据库才能返回该资源)。因此,网络延迟实际上可能对您的网站来说不是问题(虽然,但对于除了最简单的网站之外的所有网站都是问题)。
鉴于 http/2 仍然相当先进,如何衡量改进?我听说过一些轶事证据表明 Chrome 开发者工具还没有准确地报告 http/2 次,并且正在销售这些好处。其他性能测试工具甚至可能根本不支持 http/2,因此可能会退回到 http/1.1。顺便说一句,这里是 http/2 测试资源的列表,但是,就像 Chrome 开发者工具可能做的那样,大多数似乎对测试您是否使用 http/2 而不是它的任何性能优势很有用:https://blog.cloudflare.com/tools-for-debugging-testing-and-using-http-2/
【讨论】:
以上是关于我提供的是 http 还是 http2?的主要内容,如果未能解决你的问题,请参考以下文章