Apache前端启用HTTP/2并终止协议,后端用HTTP/1.1或AJP通信;必备条件为Apache≥2.4.26、启用mod_http2、强制HTTPS;配置含Protocols h2 http/1.1、ProxyPass至balancer组。

Apache 本身不直接处理 HTTP/2 的负载均衡分发逻辑,而是由前端 Apache 实例启用 HTTP/2 协议,并通过 mod_proxy + mod_proxy_http(或 mod_proxy_ajp)将请求代理到后端服务器。关键点在于:HTTP/2 终止在 Apache 前端,后端通信仍用 HTTP/1.1 或 AJP(推荐),不强制要求后端也支持 HTTP/2。
启用 HTTP/2 并接入负载均衡的必备条件
需同时满足以下三点:
- Apache 版本 ≥ 2.4.26(且编译时启用了 nghttp2 支持)
- 启用
mod_http2模块(不是 mod_ssl 自带的,需单独加载) - SSL/TLS 必须开启(HTTP/2 在 Apache 中仅支持 HTTPS 场景)
核心配置写法(含 HTTPS + HTTP/2 + 负载均衡)
在虚拟主机配置中(如 /etc/httpd/conf.d/ssl.conf 或独立 vhost 文件)写入:
<virtualhost>
ServerName example.com
SSLEngine on
SSLCertificateFile /path/to/cert.pem
SSLCertificateKeyFile /path/to/privkey.pem
SSLCertificateChainFile /path/to/chain.pem
<pre class="brush:php;toolbar:false;"># 启用 HTTP/2(必须放在 SSL 配置之后)
Protocols h2 http/1.1
# 关闭正向代理,只做反向代理
ProxyRequests Off
# 负载均衡组定义
<proxy balancer:>
BalancerMember https://192.168.1.10:8443 route=node1 retry=60
BalancerMember https://192.168.1.11:8443 route=node2 retry=60
# 注意:后端用 HTTPS 是可选的;若用 HTTP,地址写成 http://...
ProxySet lbmethod=byrequests
</proxy>
# 反向代理规则(所有请求走 balancer)
ProxyPass / balancer://myapp/
ProxyPassReverse / balancer://myapp/
# 可选:透传原始 Host 和协议信息给后端
ProxyPreserveHost On
RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-Port "443"
PHP中文网提供Apache 2.4.62 官方 tar.gz 源码包下载,通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
模块加载确认(确保已启用)
检查 /etc/httpd/conf.modules.d/00-base.conf 或主配置中包含以下行(无注释):
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule proxy_balancer_module modules/mod_proxy_balancer.so LoadModule http2_module modules/mod_http2.so LoadModule ssl_module modules/mod_ssl.so
若使用 AJP(如对接 Tomcat),则替换 mod_proxy_http 为 mod_proxy_ajp,后端地址写成 ajp://192.168.1.10:8009 —— 此方式性能更优、无需后端 HTTPS。
后端注意事项
- 后端服务(如 Tomcat、Node.js)无需开启 HTTP/2;Apache 已完成协议降级/适配
- 若后端用 HTTPS,建议关闭其 HTTP/2(避免嵌套 TLS 开销),专注用 HTTP/1.1 接收代理流量
- 会话粘性(sticky session)仍通过
route+sessionid或stickysession=JSESSIONID实现,与 HTTP/2 无关
实际部署时,先验证 curl -I --http2 https://your-domain.com 返回 HTTP/2 200,再观察访问日志确认请求被分发到不同后端节点。不复杂但容易忽略 SSL 和 Protocols 指令的顺序。










