我能为特定的Nginx服务器块(虚拟主机)启用HTTP/2吗?

7

我在nginx上有几个虚拟主机。

我能否仅为特定的虚拟主机启用HTTP/2?

当我像下面这样为虚拟主机启用HTTP/2时:

server {
  listen        443 ssl http2;
  server_name   a.b.com;
  ...
}

我可以通过HTTP2.0访问a.b.com。

但是现在同一台nginx上的每个其他虚拟主机也支持HTTP/2。 但我只想通过HTTP/1.1访问它们。

http2指令是否在服务器级别?

1个回答

10

简短回答:在您当前的设置下不可能实现。

在启动时,nginx 首先为每个监听相同 IP:端口 组合的虚拟主机创建一个单独的进程,然后将该进程的能力设置为该组中所有虚拟主机的能力之和。

在您的情况下,只有一个处理绑定到 *:443 的所有虚拟主机的进程,因此该进程包含 http2 能力。

为了实现您想要的功能,您需要使 nginx 生成一个不具备 http2 能力的不同进程,并在单独的 IP:端口 组合上运行。

对于您想要通过 http2 访问的虚拟主机,您必须执行以下操作:

  • 使用不同的端口 - 很简单,只需为它们使用另一个端口(例如 listen 8443 ssl http2;)并从所有其他端口中删除 http2(例如 listen 443 ssl;
  • 使用不同的 IP - 您需要向使用当前 IP 的相同NIC 添加另一个 IP,并相应地修改您的虚拟主机(例如 listen new_ip:443 ssl http2;listen current_ip:443 ssl;

多个 IP 的示例配置:

server {
  listen        current_ip:443 ssl;
  server_name   http11-host.example.com;
  ...
}

server {
  listen        current_ip:443 ssl;
  server_name   another-http11-host.example.com;
  ...
}

...
...

server {
  listen        new_ip:443 ssl http2;
  server_name   http2-host.example.net;
  ...
}

server {
  listen        current_ip:443 ssl http2;
  server_name   another-http2-host.example.org;
  ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接