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

kin*_*cky 6 http nginx http2

我有几个虚拟主机nginx

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

当我启用HTTP/2虚拟主机时,例如:

server {
  listen        443 ssl http2;
  server_name   a.b.com;
  ...
}
Run Code Online (Sandbox Code Playgroud)

我可以通过 HTTP2.0 访问 abcom。

但是现在同一台上的所有其他虚拟主机也都nginx支持 HTTP/2。但我只想通过HTTP/1.1.

http2在服务器级别的指令?

ali*_*ndt 7

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

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

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

为了实现您想要的,您需要使nginxspawn 成为一个不同的进程,该进程http2在单独的IP:port组合上没有能力。

对于要通过 访问的虚拟主机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;
  ...
}
Run Code Online (Sandbox Code Playgroud)