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

S1l*_*0rm 33 nginx reverse-proxy http2

我在能够执行 HTTP/2.0 的后端网络服务器前使用 nginx 作为反向 ssl 代理。

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

S1l*_*0rm 28

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

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

来自票证中引用的邮件的摘录:

几乎没有实现它的意义,因为 HTTP/2 的主要好处是它允许在单个连接中多路复用多个请求,因此 [几乎] 消除了对同时请求数量的限制 - 并且在与之交谈时没有这样的限制你自己的后端。此外,在后端使用 HTTP/2 时,情况可能会变得更糟,因为使用的是单个 TCP 连接而不是多个 TCP 连接。

  • 看起来这意味着如果您使用 nginx 代理,则不能使用 HTTP/2 服务器推送,即使后端服务器如果直接访问它也会支持它。 (11认同)
  • 我通过慢速连接对非本地站点使用 nginx 反向代理,因此 HTTP/2 可以帮助我。很遗憾 nginx 开发人员没有考虑过这个用例:-(。 (5认同)

小智 7

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

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

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

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

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


小智 5

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

一种方法是定义一个资产列表,您希望使用该http2_push语句根据请求将其推回到特定位置。

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

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