Haproxy 通过查询字符串设置后端服务器

Haproxy 通过查询字符串设置后端服务器

我正在使用粘性会话来向后端服务器发送有状态请求。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 台服务器,它就会变得有点笨拙,但目前这是我能看到的唯一能让它按照您需要的方式工作的方法。

相关内容