HAProxy 1.8配置HTTP/2报unknown keyword 'alpn'错误
问题原因
该报错和OpenSSL版本无关,核心原因是HAProxy 1.8版本的server指令不支持直接配置alpn参数:
- 你当前使用的HAProxy 1.8.8中,alpn参数仅支持在frontend段的
bind指令上配置,作用是和客户端做TLS握手时协商ALPN协议。 - 后端server段配置alpn实现端到端HTTP/2转发的特性,是HAProxy 2.0及之后版本才正式加入的,1.8分支的代码根本没有实现后端server侧的alpn参数解析逻辑,因此无论OpenSSL版本多高,都会触发unknown keyword的报错。
额外说明:HAProxy 1.8本身就不支持向后端转发HTTP/2请求,就算绕开参数校验强行配置,HAProxy和后端通信时也只会走HTTP/1.1协议,无法实现全链路HTTP/2。
解决方法
根据实际部署需求二选一即可:
方案1:升级HAProxy到2.0及以上稳定版本(推荐,支持完整端到端HTTP/2)
升级完成后,你当前编写的负载均衡配置可以直接通过合法性校验,HAProxy会在和后端Flask服务器建立TLS连接时主动协商h2协议,实现客户端到HAProxy、HAProxy到后端服务的全链路HTTP/2通信。
方案2:不升级HAProxy,调整架构适配1.8版本特性
如果暂时无法升级HAProxy版本,可以将HTTP/2的TLS终结放在HAProxy侧处理:
- 调整后端Flask服务配置,改为监听普通HTTP端口(比如8080),不需要为后端服务单独配置证书、启用TLS和HTTP/2。
- 修改HAProxy的backend段配置,删除server行中的
ssl alpn h2,http/1.1参数,改为普通HTTP转发,参考配置如下:
backend web-backend mode http balance roundrobin server flask-server1 10.141.1.160:8080 server flask-server2 10.141.1.163:8080
该模式下HAProxy负责和客户端建立基于HTTP/2的TLS连接,HAProxy和后端服务之间走明文HTTP/1.1转发,绝大多数业务场景下性能足够,也不会触发配置报错。
内容的提问来源于stack exchange,提问作者SrGrace
相关产品推荐
相关产品推荐

