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

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

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

例如:

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

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

答案1

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

笔记:这仅检查“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

答案2

嗯,这是一个不典型的请求。我认为你可以用 HAProxy 中的“appsession”命令,但我不知道它的确切算法。我猜你必须在 HAProxy 列表上询问,或者查看 HAProxy 源代码。

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

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

相关内容