使用现有cookie进行路由

时间:2014-01-11 21:39:58

标签: haproxy

如何使用在应用服务器上设置的cookie在haproxy中路由请求?

示例:SESS=<hash-of-username>

haproxy在任何情况下都不应自行插入cookie。

3 个答案:

答案 0 :(得分:8)

为了测试haproxy背后的特定服务器,我可以推荐这种方法:

frontend http
   acl is_cookie_hack_1 hdr_sub(cookie) server_test_hack=server1
   acl is_cookie_hack_2 hdr_sub(cookie) server_test_hack=server2
   ... insert your normal acl rules here

   use_backend bk_server_1 if is_cookie_hack_1
   use_backend bk_server_2 if is_cookie_hack_2
   ... insert your normal use_backend expressions here

backend bk_server_1
   ...

backend bk_server_2
   ...

我通过这个脚本在我的浏览器的js控制台中通过javascript插入server_test_hack cookie:

document.cookie="server_test_hack=server1";

答案 1 :(得分:2)

如果您只是想在请求中读取cookie并相应地路由,您可以在配置中执行以下操作:

frontend http
   acl cookie_found hdr_sub(cookie) COOKIENAME
   use_backend app_server if cookie_found

backend app_server
   balance roundrobin  
   server channel1 X.X.X.X:PORT #Host1
   server channel2 Y.Y.Y.Y:PORT #Host2

答案 2 :(得分:2)

您无法使用现有Cookie进行平衡,也无法使用URI参数。你不能只是采用md5()或构建cookie的哈希表,至少没有记录。您可以使用前缀参数来实现不同的结果。它可能是您正在寻找的(如果您想避免创建另一个cookie)。

所以在你的情况下,配置看起来像这样:

backend bk_web
    balance roundrobin
    cookie SESS prefix indirect nocache
    server s1 192.168.10.11:80 check cookie s1
    server s2 192.168.10.21:80 check cookie s2

当请求到达时没有cookie,任何服务器都通过循环选择,请求被重定向到它。当响应从后端到达时,HAProxy会检查SESS cookie,如果已设置,它会将服务器名称(sX)添加到cookie并将其发送到客户端。在浏览器中,cookie看起来像 sX~ ,但是当使用该cookie发送下一个请求时,后端服务器只会在cookie中看到 ,因为HAProxy会剥离< em> sX~ part

来源:load balancing, affinity, persistence, sticky sessions: what you need to know