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

标签 http nginx http2

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

我能否在 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 指令是服务器级别的吗?

最佳答案

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

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

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

为了实现您想要的效果,您需要让 nginx 在单独的 IP 上生成一个不具有 http2 功能的不同进程:端口组合。

对于您希望通过 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;
  ...
}

关于http - 我可以在 Nginx 上仅为特定服务器 block (虚拟主机)启用 HTTP/2 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40987592/

相关文章:

apache - 如何生成和配置 ETag?

rest - 如何删除远程地址?

api - REST API 的 Nginx 缓存

google-chrome - 我们应该在 HTTP/2 中复用多少并发请求

带有 cURL 的 PHP7、HTTP2

nginx - 在 Windows 上的 Nginx 上启用 http2

iphone - iPhone 应用程序和 Web 服务器之间的安全连接?

java - 使用 HttpCore 实现自定义 HTTP 方法

java - http请求如何设置源IP?

Spring RestTemplate PostforObject : Unsupported Media Type