是否可以使用HAproxy代理传入的h2c请求?
我尝试了以下配置using this tutorial:
frontend receiver
mode http
bind *:80
bind *:443 ssl crt-list /some/file alpn h2,h2c,http/1.1
default_backend processor
此配置适用于h2(HTTP / 2安全)请求,并将HTTP / 1.1请求发送到后端。但是,它不适用于通过curl发出的h2c(HTTP / 2明文)请求。我收到以下错误消息:
$ curl --http2-prior-knowledge http://server.com/status
...
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle ...)
> GET /status HTTP/2
...
* http2 error: Remote peer returned unexpected data while we expected SETTINGS frame. Perhaps, peer does not support HTTP/2 properly.
...
curl: (16) Error in the HTTP2 framing layer
我怀疑这是因为HAProxy期望响应中的h2数据(而不是h2c)。有关我需要在HAProxy配置中进行哪些更改以支持传入的h2c请求的建议?
可以在tcp
模式下代理传入请求,前提是您的后端服务器支持h2c。这就是您使用的教程为h2请求所做的,但没有理由它也不适用于h2c。
由于该教程是HAProxy has added HTTP/2 support in v1.8编写的,因此它也可以在http
模式下代理h2请求,但据我所知,不可能为h2c执行此操作。文档没有明确说明,但状态ALPN用于协商HTTP / 2和this question状态h2c支持未添加。
HAProxy 1.9 did add h2c support in the backend,但仍然没有注意它在前端得到支持。
老实说,前端的h2c支持通常用途有限,因为浏览器不支持它,因为它需要升级步骤或假设服务器支持它(两者都不是理想的),不像h2可以协商作为TLS谈判的一部分,没有额外的往返或假设。
是否有一个特殊的原因,你需要在前端支持h2c,因为可能有更好的方法来实现你想要的。
基于HAproxy通道中的discussion,可以使用proto h2
上的bind
设置代理h2c请求。但是,目前无法在同一端口上侦听HTTP / 1.1和HTTP / 2请求。
使h2c
在HAProxy上工作的示例配置:
frontend f_h2c
mode http
option http-use-htx
bind *:8080 proto h2
default_backend local_node
backend local_node
mode http
option http-use-htx
server localhost localhost:9090 proto h2