Apache 中未启用 HTTP/2

Apache 中未启用 HTTP/2

我正在尝试在 Apache 2.4.38 中启用 HTTP/2,但失败了。根据灯塔在浏览器中测试。我使用的是官方的HTTP/2 指南适用于 apache,但它不适用于我的情况。我的 SSL apache conf 文件如下:

LoadModule http2_module modules/mod_http2.so
<IfModule mod_ssl.c>
<VirtualHost *:443>

    ServerName mywebsite.com
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

ServerName quizzane.servehttp.com
SSLCertificateFile /etc/letsencrypt/live/quizzane.servehttp.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/quizzane.servehttp.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
Protocols h2
</VirtualHost>
</IfModule>

当我的站点启用加密时(在端口 443 上),将使用此文件。此文件始终会使用,因为我已设置自动重定向到端口 443(成功)。我已按常规a2enmod http2启用 HTTP/2 模式并加载了扩展,如 SSL conf 文件中所示。至于日志,我找不到该文件夹​​,因此如果有人能指出 apache 日志文件夹的方向,将不胜感激(${APACHE_LOG_DIR}不存在)。我也在使用Certbot据我所知,没有其他外部库用于 SSL/TLS。当我尝试curl -v --http2在我的网站上使用 curl 时,服务器似乎接受 HTTP/2,但服务器和客户端最终决定使用 HTTP/1.1,如下所示:

...
* ALPN, offering h2
* ALPN, offering http/1.1
...
* ALPN, server accepted to use http/1.1

我还没有找到任何其他涉及此问题的帖子。

答案1

请注意,您正在包含额外的 TLS 设置,Apache 有时会在重复指令时进行一些违反直觉的合并

   Include /etc/letsencrypt/options-ssl-apache.conf
   Protocols h2

因此 VirtualHost 特定部分中的协议指令可能未生效。(检查/发布所包含的选项)

如果你正在跑步多个 TLS 虚拟主机:在每个 VirtualHost 基础上指定 TLS/SSL 指令是有效的语法,但只有当每个 TLS 虚拟主机在不同的 IP 地址和/或端口上运行时,某些指令才会不同;否则第一个 VirtualHost 的 TLS 设置将应用于所有 VirtualHost在相同的 IP 地址/端口组合上。

因为如果没有 SNI,Apache 直到协商安全连接后才会收到 Host 标头。但需要该 Host 标头来选择允许哪些密码/协议。这是
一个两难问题。
由于一旦建立连接,要求其他虚拟主机使用不同的协议/密码就太晚了,Apache 会默默地使用第一个 TLS VirtualHost 作为 TLS 设置的默认值。

通过在所有 TLS 主机中包含一个通用的 Include,您可以使基于名称的 TLS VirtualHosts 的隐式行为更加明确。

相关内容