Apache启用HTTP/2需满足TLS加密、OpenSSL 1.0.2+、Apache≥2.4.17等前提,仅支持HTTPS下的h2协议,通过SNI机制实现多域名共用*:443端口,配置中需加载mod_http2与mod_ssl模块、设置Protocols h2 http/1.1并确保证书有效。

Apache 支持 HTTP/2,但需满足几个硬性前提:启用 TLS(HTTPS)、使用 OpenSSL 1.0.2+ 或更高版本、Apache 版本 ≥ 2.4.17(推荐 ≥ 2.4.38)。HTTP/2 在 Apache 中不支持纯 HTTP(即非加密的 h2c),仅通过 HTTPS 启用 h2 协议。多域名配置在此基础上仍沿用基于 SNI 的虚拟主机机制,而非端口或 IP 区分。
以下是关键配置逻辑和实操步骤:
确认环境与模块加载
确保以下条件全部满足:
- 已安装并启用 mod_ssl 和 mod_http2(Apache 2.4.17+ 自带,但默认可能未启用);
- 运行
a2enmod ssl http2(Debian/Ubuntu)或检查/etc/httpd/conf.modules.d/00-base.conf中LoadModule http2_module modules/mod_http2.so已取消注释(RHEL/CentOS); - SSL 证书已为每个域名正确部署(Let’s Encrypt 或商业证书均可,必须有效且覆盖所有
ServerName和ServerAlias); - Apache 启动时无
http2: module not found或SSL library does not support ALPN报错。
单 HTTPS 端口 + 多域名(SNI 基础)
HTTP/2 依赖 TLS 的 ALPN 扩展,而 ALPN 由客户端在握手时协商,服务器根据域名(SNI)选择对应证书和虚拟主机。因此,多个域名可共用 *:443,无需额外端口。
示例配置(放入 sites-available/example.com.conf):
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com shop.example.com
<pre class='brush:php;toolbar:false;'>DocumentRoot /var/www/example
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
# 启用 HTTP/2(仅对当前虚拟主机生效)
Protocols h2 http/1.1
<Directory "/var/www/example">
Require all granted
AllowOverride All
</Directory>
ErrorLog ${APACHE_LOG_DIR}/example-error.log
CustomLog ${APACHE_LOG_DIR}/example-access.log combined</VirtualHost>
注意:Protocols h2 http/1.1 表示优先协商 h2,降级到 http/1.1;不能写成 h2 单独一项(会拒绝非 h2 客户端)。
多个独立域名共存(各自 VirtualHost)
每个域名需独立 <VirtualHost *:443> 块,各自绑定证书和目录。Apache 依靠 SNI 匹配域名 → 加载对应证书 → 启用 h2。
- 域名 A:
example.com→ 证书example.com.pem→/var/www/a; - 域名 B:
demo.org→ 证书demo.org.pem→/var/www/b; - 两者都必须含
Protocols h2 http/1.1,且监听同一*:443。
只要证书有效、SNI 正常、ALPN 可用,浏览器访问任一域名都会自动升级到 HTTP/2(可在 Chrome DevTools → Network → Headers 查看 :scheme: h2)。
验证与调试要点
- 执行
sudo apachectl configtest确保语法无误; - 重启服务:
sudo systemctl reload apache2(或httpd); - 用
curl -I --http2 https://example.com检查响应头是否含HTTP/2 200; - 若返回
HTTP/1.1,检查 OpenSSL 版本(openssl version)、mod_http2 是否加载(apachectl -M | grep http2)、证书链完整性(尤其 Let’s Encrypt 的 fullchain.pem 是否包含中间证书); - 禁用旧协议(如 SSLv3/TLS 1.0)可避免协商失败,推荐在全局 SSL 配置中设置:
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1。

















