有没有办法将 HAProxy 配置为基于 cookie 发送流量?

9 cookies haproxy

在配置 HAProxy 时,我想根据 cookie 的存在将流量发送到某些服务器。

例如:

  1. 有一个 HAProxy 服务器和 2 个 Web 服务器(serverA 和 serverB)。
  2. 当有人登录时,会创建一个 cookie“loginCreds=user:company”。
  3. 当来自 CompanyA 的 John 进来时,他的 cookie 是“loginCreds=John:CompanyA”。
  4. 然后他的流量将被定向到 serverA。

这可能吗,如果可能,您如何设置?

小智 12

是的,这是可能的,但您需要自己调整/测试此配置。它应该是这样的:

注意:这仅检查“Cookie:”标头是否设置为“CompanyA”或“CompanyB”,区分大小写。您可以使用值,如果您擅长正则表达式,则可以使用 hdr_reg(Cookie) 代替。

frontend read_cookies
    bind    :80
    mode    http

    acl is_companya hdr(Cookie) CompanyA
    acl is_companyb hdr(Cookie) CompanyB

    use_backend company_a if is_companya
    use_backend company_b if is_companyb

    default_backend company_c

backend company_a
        mode    http
        option  forwardfor
        balance source
        option  httpclose
        option  httpchk
        server  web1 172.16.0.11:80 check

backend company_b
        mode    http
        option  forwardfor
        balance source
        option  httpclose
        option  httpchk
        server  web2 172.16.0.12:80 check

backend company_c
        mode    http
        option  forwardfor
        balance source
        option  httpclose
        option  httpchk
        server  web3 172.16.0.13:80 check
Run Code Online (Sandbox Code Playgroud)


小智 1

嗯,这是一个非典型的请求。我认为您可以使用HAProxy 中的“appsession”命令执行类似的操作 ,但我不知道它的确切算法。我的猜测是您必须询问 HAProxy 列表,或者查看 HAProxy 源代码。

难道你不能歧视比饼干更“丰富”的东西吗?例如,创建主机名“premium.company.com”和“standard.company.com”并根据主机名路由流量。

另一个想法可能是了解 HAProxy 自己的粘性会话 cookie 的格式(请参阅文档中的“cookie”部分)。如果您设置一个与 HAProxy 使用的名称和内部数据完全相同的 cookie,那么我猜 HAProxy 会按照您希望的方式路由传入请求...