我刚刚调试了一个网站(使用 Lighthouse 3.2.0),我在 nginx(1.15.9 / 官方 docker 镜像)代理上启用了 http/2,
listen 443 ssl http2;
但是 Lighthouse 仍然说所有资源都是通过 http/1.1 加载的,而我发现几乎所有其他网站(也是通过这个 nginx 代理传送的)都通过了 http2 测试(事实上,h2
这些网站的所有资源都是通过 http2 传送的)。
然而,他们所有的聆听诗节肯定只有
listen 443 ssl;
并且整个配置中只有一个站点http2
。
那么这里可能发生了什么?我更感兴趣的是为什么h2
虽然我从未配置过它,但似乎已启用,而不是一个未提供它的站点(这可能是因为在另一端有一个 node.jsproxy_pass
或其他东西......)。无论 listen 节如何,新 nginx 版本都是默认设置
吗http2
?我在文档中找不到类似的东西......
答案1
基本上,一旦你在一个指令上启用 HTTP/2,listen
同一 ip/port 中的所有指令都会获得 HTTP/2。理论上,SNI 允许服务器查看请求的虚拟主机(至少对于 TLSv1 或更高版本上启用 SNI 的客户端),然后使用适合该虚拟主机的 ALPN 设置进行响应,但这很复杂,实际上大多数服务器不会以这种方式区分,而是在该 IP/端口上的所有共享虚拟主机上重复使用相同的 SSL/TLS 设置。
但是,至少在没有更多信息的情况下,我无法解释为什么灯塔认为你的 HTTP/2 vhost 只是 HTTP/1.1。