apache本身不支持后端http/2代理,仅能面向客户端启用http/2(需https+mod_http2),与后端微服务默认仍用http/1.1通信;端到端http/2需envoy等专用网关,apache推荐作为tls终结点+http/1.1内网转发。

Apache 本身不直接处理微服务逻辑,HTTP/2 的启用仅作用于 Apache 与客户端之间的通信链路;后端微服务是否支持 HTTP/2 是独立问题——多数 Java 微服务(如 Spring Boot + Tomcat 8.5.16+)可单独启用 HTTP/2,但 Apache 作为反向代理时,默认仍用 HTTP/1.1 与后端通信。要实现端到端 HTTP/2,需分层配置,且注意兼容性边界。
Apache 端启用 HTTP/2(面向客户端)
这是前提,只影响浏览器到 Apache 的连接:
- 必须使用 HTTPS:HTTP/2 在主流浏览器中强制要求 TLS,Apache 需加载
mod_ssl并配置有效证书(自签名证书可用于测试,但需手动信任) - 启用
mod_http2:Apache 2.4.17+ 内置该模块,确认已加载:LoadModule http2_module modules/mod_http2.so - 在虚拟主机或主配置中添加:
Protocols h2 http/1.1
(顺序重要,h2 优先;若兼容老客户端,保留 http/1.1) - 验证方式:Chrome 开发者工具 → Network → 刷新页面 → 查看 Protocol 列是否显示
h2
Apache 与后端微服务的协议选择
Apache 默认通过 HTTP/1.1 转发请求给后端(如 Tomcat、Spring Boot),即使客户端用了 HTTP/2:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
mod_proxy_http不支持后端 HTTP/2 —— 它只讲 HTTP/1.x,这是当前稳定版 Apache 的限制 - 若后端是 gRPC 或支持 HTTP/2 Server Push 的服务,不能依赖 Apache 做中间代理来透传 HTTP/2 流帧;应改用支持 h2c(HTTP/2 without TLS)或 h2 的专用网关(如 Envoy、APISIX)
- 常见安全做法:Apache 终结 TLS(HTTPS → HTTP/1.1),再以明文 HTTP/1.1 转发给内网微服务集群,既简化后端配置,又避免证书管理扩散
微服务侧启用 HTTP/2(如 Tomcat 8.5.16+)
这是可选增强,与 Apache 无关,但提升微服务自身直连能力:
- 确保 JDK 8u201+(含 ALPN 支持),并使用 BoringSSL 或 Jetty ALPN boot(Tomcat 官方推荐)
- 在
server.xml的 Connector 中启用:<connector port="8443" protocol="org.apache.coyote.http11.Http11Nio2Protocol"> maxThreads="150" SSLEnabled="true" scheme="https" secure="true"<br> keystoreFile="conf/keystore.jks" keystorePass="123456"<br> sslEnabledProtocols="TLSv1.2,TLSv1.3"<br> upgradeProtocol="org.apache.coyote.http2.Http2Protocol" /></connector>
- 启动后访问
https://localhost:8443,用 curl -I --http2 或 Chrome DevTools 验证是否协商成功
真实场景下的典型组合建议
不追求全链路 h2,而重在稳定性与可观测性:
- 客户端 ⇄ Apache(HTTPS + HTTP/2):提升首屏速度、减少连接数、支持 Server Push(静态资源)
- Apache ⇄ 微服务(HTTP/1.1 + KeepAlive):通过
ProxyPass+ProxySet keepalive=On复用连接,降低后端开销 - 流控与聚合交给下游网关:Apache 只做 TLS 终结和路径路由,把
/api/v1/order代理到 Spring Cloud Gateway 或 APISIX,由它们完成限流、鉴权、多服务编排










