我正在使用粘性会话进行有状态的请求到我们的后端服务器。 Haproxy设置cookie,设置工作正常。 我现在想要通过查询string来设置所需的后端服务器,以便testing和不能使用cookie的客户端。
这两个卷发应该到相同的后端:
curl mysite.com -I --cookie "serverid=app-2" curl mysite.com?serverid=app-2 -I
我已经尝试了许多configuration组合无济于事。
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中可以这样做吗?
是的,这是可能的。
坚持表使客户端 – 服务器持久性成为可能,但是它们不定义给定客户端结束的服务器。 这就是cookie指令所做的事情(与server指令的cookie选项结合使用)。
不幸的是,如果你的客户端不支持cookies,那就没什么用处了。
解决这个问题的方法是通过一组use-server线来捕获这些情况。 这些处理是在cookie路由之前处理的,并且优先于cookie路由,所以如果use-server匹配,它将被使用。
考虑到你的要求,在问题中提到的两个curl命令最终在同一个盒子上,这个configuration适合我在我的testing(尽pipe它可能已经很小)。
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
如果你有三台以上的服务器,那将会变得有点笨拙,但是现在我可以看到,只有这样你才能按照你的需要来运行它。