使用“mode tcp”时如何根据URI选择不同的后端

for*_*own 1 http https tcp haproxy

我正在使用 haproxy 版本 1.6.2

我已经使用下面的配置启用了 http2,我需要使用“模式 tcp”。但是一旦我从“模式 http”切换到“模式 tcp”,我就无法使用 acl path_beg

frontend websocks
    mode tcp
    bind *:443 ssl crt /etc/certs/domain.pem alpn h2,http/1.1 ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH; no-sslv3
    timeout client 1h
    acl is_api path_beg /api
    acl is_xmpp path_beg /chat
    use_backend api_backend if is_api
    use_backend xmpp_backend if is_xmpp
    use_backend fe_public_tcp if { ssl_fc_alpn -i h2 }
    default_backend fe_public

fe_public
    server fe1 localhost:444 weight 1 maxconn 4096 check inter 10000 ssl verify none        

fe_public_tcp
    mode tcp
    server fe1 localhost:445

api_backend
    server api1 localhost:9966

xmpp_backend
    server xmpp1 localhost:9955
Run Code Online (Sandbox Code Playgroud)

如何让 path_beg 和 http2 再次工作?或者有没有办法在没有模式tcp的情况下启用http2?

Ste*_*ich 5

要使用协议特定功能,您必须使用适当的模式。模式 tcp 使您只能访问特定于 tcp 的功能,但要获得特定于 http 的功能,例如根据 URI 选择后端,您需要使用模式 http。

不幸的是,HTTP/2 看起来与 HTTP/1.x 非常不同,目前不支持模式 http,因此您必须使用模式 tcp。这也意味着只要您想支持 HTTP/2,就不能根据 URI 做出任何决定。

haproxy 1.7 版有望更好地支持 HTTP/2。来自http://www.haproxy.org/news.html

2015 年 5 月 15 日:HTTP/2 发布!

今天,HTTP/2 正式以 RFC7540 和 RFC7541 的形式存在。... 1.6 版尚不支持 HTTP/2 ... 我们希望在年底前在 1.7 开发周期内支持它。