apache默认不支持http/2明文传输(h2c),必须通过tls加密通道(h2)启用;若curl或浏览器回落至http/1.1,是因机制限制而非配置遗漏,需确认mod_http2已加载、tlsv1.2+与alpn启用、证书有效且protocols h2 http/1.1在443虚拟主机中正确配置。

Apache 默认不支持 HTTP/2 的明文传输(h2c),必须走 TLS 加密通道(h2)才能启用。如果你在浏览器或 curl 中看到连接回落到 HTTP/1.1,或者 curl -I --http2 https://your-site.com 报错“HTTP/2 over TLS is not supported”,那不是配置漏了,而是根本机制限制——HTTP/2 在 Apache 中无法在纯 HTTP 下工作。
确认 Apache 是否启用了 mod_http2
HTTP/2 模块不是默认开启的,尤其在 CentOS 7 + httpd 2.4.6 这类旧版本中压根不带。先验证:
- 运行
httpd -M | grep http2或apachectl -M | grep http2,无输出说明模块未加载; - 检查是否安装了
mod_ssl和mod_http2:RHEL/CentOS 7 需手动启用 SCL 或升级到 2.4.37+(如 IUS 或 Software Collections 提供的 httpd24); - 若使用 Certbot 自动配置,它不会帮你启用 mod_http2,需手动在
/etc/httpd/conf.modules.d/00-base.conf或独立文件中加入:
LoadModule http2_module modules/mod_http2.so
检查 SSL/TLS 配置是否满足 HTTP/2 前提
HTTP/2 要求 TLS 协议和加密套件达标,任意一项不满足都会静默降级:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- Apache 必须启用 TLS 1.2 或更高版本(
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1); - 必须启用 ALPN(Application-Layer Protocol Negotiation),这是 HTTP/2 握手的关键,2.4.26+ 默认开启,但若编译时禁用 OpenSSL 支持则无效;
- 避免使用已废弃的加密套件,例如
SSL CipherSuite中含RC4、DES、MD5会触发降级;推荐用:
SSL CipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
验证协议协商是否实际生效
别只信配置文件,要看真实握手结果:
- 用
curl -I --http2 -k https://your-site.com,如果返回HTTP/2 200表示成功;若显示HTTP/1.1,说明协商失败; - 用浏览器开发者工具 → Network → 点开任意请求 → 查看 Headers 标签页中的
:scheme或protocol字段(Chrome 显示为 “h2”); - 服务端日志加调试:在虚拟主机中临时添加
LogLevel http2:trace3,重启后查/var/log/httpd/error_log,搜索ALPN protocol或negotiated h2。
特别注意:不要尝试 h2c(明文 HTTP/2)
Apache 官方明确不支持 h2c 生产部署,H2Direct on 仅用于本地测试,且需额外配置 Protocols h2c http/1.1 并监听非标准端口(如 8009)。公网环境强行启用会导致:
- 浏览器完全忽略 h2c(Chrome/Firefox 已移除对 h2c 的支持);
- 反向代理(如 Nginx)或 CDN(Cloudflare、阿里云全站加速)直接阻断 h2c 请求;
- 证书验证逻辑失效,私钥暴露风险上升。










