我可以在Nginx上为特定服务器块(虚拟主机)启用HTTP / 2吗?

时间:2016-12-06 03:59:15

标签: http nginx http2

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

我可以HTTP/2特定虚拟主机启用nginx吗?

当我为虚拟主机启用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 个答案:

答案 0 :(得分:4)

简短回答:您当前的设置无法实现。

启动时,nginx首先为侦听同一 IP:port 组合的每组虚拟主机创建一个单独的进程,然后将该进程的功能设置为由该流程处理的该组中每个虚拟主机的所有功能的总和。

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

为了实现您的目标,您需要让nginx在单独的 IP:端口组合上生成不具有http2功能的其他进程

对于您希望通过http2访问的虚拟主机,您必须:

  • 使用其他端口 - 琐碎,只需为其使用另一个端口(例如listen 8443 ssl http2;)并从其他端口删除http2 (例如`listen 443 ssl;)
  • 使用其他IP - 您需要将另一个IP添加到使用当前IP的同一NIC并相应地修改您的虚拟主机 (例如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;
  ...
}