在 nginx 反向代理和后端 Web 服务器之间使用 HTTP/2.0

在 nginx 反向代理和后端 Web 服务器之间使用 HTTP/2.0

我使用 nginx 作为能够执行 HTTP/2.0 的后端 Web 服务器前面的反向 SSL 代理。

我注意到 nginx 通过 HTTP/1.1 而不是 HTTP/2.0 将请求代理到后端服务器。是否可以告诉 nginx 使用未加密的 HTTP/2.0 连接?这会提高性能吗?

答案1

发现了这个:https://trac.nginx.org/nginx/ticket/923

在可预见的未来,没有计划在代理模块中实现 HTTP/2 支持

票证中引用的一封邮件摘录:

几乎没有任何意义去实现它,因为 HTTP/2 的主要优点是它允许在单个连接中多路复用多个请求,从而 [几乎] 消除了同时请求数量的限制 - 并且在与您自己的后端通信时没有这样的限制。此外,当使用 HTTP/2 连接后端时,情况甚至可能变得更糟,因为使用的是单个 TCP 连接而不是多个连接。

答案2

遗憾的是,nginx 不支持代理到 http/2 后端服务器,参考自https://www.nginx.com/blog/http2-module-nginx/#QandA

问:你们是否也会在上游支持 HTTP/2,还是仅在客户端支持 HTTP/2?

答:目前,我们仅支持客户端的 HTTP/2。您无法使用 proxy_pass 配置 HTTP/2。[编辑 - 在这篇文章的原始版本中,这句话被错误地转录为“您可以使用 proxy_pass 配置 HTTP/2”。对于由此可能造成的任何混淆,我们深表歉意。]

但是 HTTP/2 在后端的意义何在?因为正如你从基准测试中看到的那样,HTTP/2 对于低延迟网络(例如上游连接)没有太大的好处。

此外,在 NGINX 中,您有 keepalive 模块,并且可以配置 keepalive 缓存。HTTP/2 的主要性能优势是消除了额外的握手,但如果已经使用 keepalive 缓存实现了这一点,则上游不需要 HTTP/2。

答案3

从 1.13.9 版本开始,http2 支持服务器推送。

一种方法是使用语句定义您希望在请求时推回到特定位置的资产列表http2_push

第二种方法是让 nginx 拦截响应并使用语句推送具有 preload 属性的链接标签http2_push_preload

更多详细信息请参阅博客文章@malix 在 OP 的评论中引用了

相关内容