apache作为http/2服务端需≥2.4.26版本、启用mod_http2模块、配置https(含alpn)及protocols h2 http/1.1;反向代理默认用http/1.1转发,若需http/2上游则须启用实验性mod_proxy_http2模块并确保后端支持tls+alpn。

Apache 本身不直接支持作为 HTTP/2 客户端(即向上游后端发起 HTTP/2 请求),但可以作为 HTTP/2 服务端接收客户端请求,再以 HTTP/1.1(或 HTTP/2,需模块支持)转发给后端。目前稳定生产环境中,Apache 反向代理 + HTTP/2 的典型用法是:前端启用 HTTP/2 接收用户请求,后端仍用 HTTP/1.1 代理(最可靠);若需真正 HTTP/2 上游,则需启用实验性模块并确认后端支持。
启用前端 HTTP/2(客户端到 Apache)
这是最常用、最稳妥的配置——让浏览器通过 HTTP/2 连接 Apache,Apache 内部仍用 HTTP/1.1 代理到后端(如 Node.js/Java/Golang):
- 确保 Apache ≥ 2.4.26,且已编译支持
mod_http2 - 启用模块:
LoadModule http2_module modules/mod_http2.so - 在
<virtualhost></virtualhost>中添加:Protocols h2 http/1.1(必须搭配 HTTPS,HTTP/2 在 Apache 中不支持纯 HTTP) - 配置 SSL(必需):
证书、密钥、TLS 版本(建议 TLSv1.2+)、ALPN 支持(现代 OpenSSL 默认启用)
配置反向代理(HTTP/1.1 到后端,推荐默认方案)
绝大多数后端服务(Express、Spring Boot、Gin 等)默认监听 HTTP/1.1,无需改动。Apache 使用 mod_proxy_http 即可高效代理:
PHP中文网提供Apache 2.4.62 官方 tar.gz 源码包下载,通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
- 启用必要模块:
LoadModule proxy_module modules/mod_proxy.soLoadModule proxy_http_module modules/mod_proxy_http.so - 示例配置(HTTPS 入口 → 本地 Node.js):
<virtualhost><br> ServerName example.com<br> Protocols h2 http/1.1<br> SSLEngine on<br> SSLCertificateFile /path/to/cert.pem<br> SSLCertificateKeyFile /path/to/key.pem<br><br> ProxyPreserveHost On<br> ProxyPass / http://127.0.0.1:3000/<br> ProxyPassReverse / http://127.0.0.1:3000/<br></virtualhost>
尝试 HTTP/2 上游(实验性,仅限特定场景)
若后端明确支持 HTTP/2 清 klart(如用 net/http/http2 启动的 Go 服务,且监听 HTTPS),可启用 mod_proxy_http2(Apache 2.4.33+,模块仍标为 experimental):
- 加载模块:
LoadModule proxy_http2_module modules/mod_proxy_http2.so - 代理时显式指定协议:
ProxyPass / https://backend.example.com/ retry=0
(注意:必须是https://,且后端需提供有效证书或配置SSLProxyVerify none测试用) - 常见问题:
• 后端未启用 ALPN 或 TLSv1.2+ → 连接降级或失败
• 证书不匹配或自签名 → 需加SSLProxyVerify none和SSLProxyCheckPeerCN off(仅测试)
• 模块未加载或版本过低 →ProxyPass忽略或报 500
关键注意事项
避免踩坑的几个实操要点:
-
不要混用
ProxyPass和mod_proxy_http2无 HTTPS 后端 —— HTTP/2 上游必须走 TLS -
WebSocket 不依赖 HTTP/2 —— 用
mod_proxy_wstunnel即可,与 HTTP/2 无关 -
真实 IP 传递不能少:
ProxyPreserveHost OnRequestHeader set X-Forwarded-Proto "https"RequestHeader set X-Forwarded-Port "443" -
超时建议调大(尤其长连接或流式响应):
ProxyTimeout 300ProxyBadHeader ignore










