![使用“模式 tcp”时如何根据 URI 选择不同的后端](https://linux22.com/image/671137/%E4%BD%BF%E7%94%A8%E2%80%9C%E6%A8%A1%E5%BC%8F%20tcp%E2%80%9D%E6%97%B6%E5%A6%82%E4%BD%95%E6%A0%B9%E6%8D%AE%20URI%20%E9%80%89%E6%8B%A9%E4%B8%8D%E5%90%8C%E7%9A%84%E5%90%8E%E7%AB%AF.png)
我正在使用 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
如何使 path_beg 和 http2 再次工作?或者有没有办法在不使用 tcp 模式的情况下启用 http2?
答案1
要使用协议特定功能,您必须使用适当的模式。模式 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 版开发周期内)支持它。