HAProxy 2.0+支持前端HTTP/2(需TLS+OpenSSL 1.0.2+及ALPN),后端仍用HTTP/1.1与Apache通信;配置需在frontend bind中添加alpn h2,http/1.1,backend保持HTTP/1.1并禁用Apache的mod_http2。

HAProxy 本身从 2.0 版本起原生支持 HTTP/2,但仅限于 客户端到 HAProxy 的连接(frontend);它与后端 Apache 服务器之间仍需使用 HTTP/1.1(因 Apache 目前不支持作为 HTTP/2 后端被代理,且不支持 h2c 明文升级)。因此,典型部署是:浏览器 ⇄ HAProxy(HTTP/2 over TLS) ⇄ Apache(HTTP/1.1)。
启用 HAProxy 前端 HTTP/2 支持
必须满足两个前提:启用 TLS、使用 OpenSSL 1.0.2+(推荐 1.1.1+)并编译时开启 ALPN 支持。配置示例如下:
- 在
global段确认启用了 SSL 相关选项(如ssl-default-bind-ciphers、ssl-default-bind-options no-sslv3 no-tlsv10 no-tlsv11) - 在
frontend的bind行添加alpn h2,http/1.1,例如:bind :443 ssl crt /etc/haproxy/certs/example.com.pem alpn h2,http/1.1 - 确保证书文件包含私钥和完整证书链(PEM 格式),否则 ALPN 协商会失败,降级为 HTTP/1.1
后端保持 HTTP/1.1 与 Apache 通信
HAProxy 不支持将 HTTP/2 请求转发给 Apache(Apache httpd 当前无 h2c 或 h2 backend 能力)。因此后端配置应明确使用 HTTP/1.1:
- 在
backend中使用http-request set-header清除可能干扰的 HTTP/2 特有头(如:method,实际不会出现,但可加容错) - 推荐显式指定协议版本:
option http-server-close(避免连接复用冲突)http-request set-header X-Forwarded-Proto httpsserver apache1 127.0.0.1:8080 check(Apache 监听 HTTP/1.1 端口,如 8080) - 无需在 backend bind 行加 ALPN——后端是纯 HTTP/1.1
验证 HTTP/2 是否生效
仅验证 frontend(浏览器 ↔ HAProxy)是否跑在 HTTP/2 上:
- Chrome/Firefox 开发者工具 → Network 标签 → 刷新页面 → 查看 Protocol 列是否显示
h2 - 命令行检查:
curl -I --http2 https://example.com(返回头中含HTTP/2 200) - 查看 HAProxy 日志或统计页(若启用
stats),确认连接使用了 ALPN 协商结果 - 注意:
curl --http2若报错 “HTTP/2 over TLS was not negotiated on the TLS connection”,说明证书、OpenSSL 或 ALPN 配置有误
Apache 端无需特殊配置(但建议优化)
Apache 仅作为 HTTP/1.1 后端运行,不参与 HTTP/2 处理。不过可做以下配合:
- 确保
mod_proxy和mod_proxy_http已启用 - 在虚拟主机中正确设置
ProxyPreserveHost On和RequestHeader set X-Forwarded-Proto "https" - 如需识别真实客户端 IP,配置
RemoteIPHeader X-Forwarded-For(需启用mod_remoteip) - 禁用 Apache 自身的 HTTP/2(即不要启用
mod_http2),避免监听 443 端口造成端口冲突或协议混淆










