我正在使用粘性会话来向后端服务器发送有状态请求。Haproxy 设置了 cookie,设置工作正常。现在,我想要通过查询字符串设置所需的后端服务器,以用于测试和无法使用 cookie 的客户端。
这两个卷曲都应该转到同一个后端:
curl mysite.com -I --cookie "serverid=app-2"
curl mysite.com?serverid=app-2 -I
我尝试过多种配置组合但都无济于事。
backend myapp
cookie serverid insert indirect nocache
stick-table type string len 32 size 1M
stick on cookie(serverid)
stick on url_param(serverid)
server app-0 111.111.111.111:80 cookie app-0
server app-1 222.222.222.222:80 cookie app-1
server app-2 333.333.333.333:80 cookie app-2
在 haproxy 中可以做到这一点吗?
答案1
是的,有可能。
Stick 表可以实现客户端-服务器持久性,但它们没有定义哪个指定客户端最终所在的服务器。这就是该cookie
指令的作用(与指令cookie
的选项结合使用server
)。
不幸的是,如果你的客户端不支持 cookies,它就没什么用。
解决此问题的方法是使用一组use-server
行来捕获这些情况。这些行在 cookie 路由之前处理,并且优先于 cookie 路由,因此如果匹配use-server
,则会使用它。
考虑到您的要求,问题中提到的两个curl
命令最终出现在同一个框中,这个配置在我的测试中对我来说是有效的(尽管它可能非常小)。
backend myapp
cookie serverid insert indirect nocache
use-server app-0 if { urlp(serverid) -i app-0 }
use-server app-1 if { urlp(serverid) -i app-1 }
use-server app-2 if { urlp(serverid) -i app-2 }
server app-0 142.135.221.205:10001 cookie app-0
server app-1 142.135.221.205:10002 cookie app-1
server app-2 142.135.221.205:10003 cookie app-2
如果您拥有超过 3 台服务器,它就会变得有点笨拙,但目前这是我能看到的唯一能让它按照您需要的方式工作的方法。