HAProxy 无法识别主机头?

HAProxy 无法识别主机头?

我一直在尝试配置 HAProxy,使其根据主机名将流量发送到不同的后端服务器。我尝试使用如何使用 HAProxy 根据主机名转移流量?但不幸的是我的运气不佳。

我试图让客户端访问 bk1.domain.com:80,流量将被发送到“backend1”后端。同样,如果有人访问 bk2.domain.com:80,流量应被发送到“backend2”后端。所有其他流量应发送到“默认”后端。需要澄清的是,domain.com、bk1.domain.com、bk2.domain.com 都解析为同一个 IP 地址。

不幸的是,当访问 bk1.domain.com 或 bk2.domain.com 时,所有请求都使用“默认”后端。看来 HAProxy 无法识别主机标头,因此无法将请求转发到适当的后端。

以下是当前的 haproxy.cfg。任何帮助都值得感激。

global
    log 127.0.0.1   local0
    maxconn 4096
    user haproxy
    group haproxy
    daemon

defaults
    log     global
    retries 3
    option redispatch
    maxconn 2000
    timeout http-request 5s 
    timeout connect      5s
    timeout client       30s
    timeout server       10s

frontend all_clients
    bind 0.0.0.0:80
    acl back1 hdr(host) -i bk1.domain.com
    acl back2 hdr(host) -i bk2.domian.com
    use_backend backend1 if back1
    use_backend backend2 if back2
    default_backend default

backend default
    balance roundrobin
    server  a1 192.168.0.1:8080
    server  a2 192.168.0.2:8080
    server  a3 192.168.0.3:8080

backend backend1
    balance roundrobin
    server  b1 10.0.0.1:8080
    server  b2 10.0.0.2:8080

backend backend2
    balance roundrobin
    server  c1 172.16.0.1:8080
    server  c2 172.16.0.2:8080

答案1

这是一个老问题,但答案很简单:字符串bk1.example.com:80与字符串不同bk1.example.com。大多数(但不是全部)现代客户端在发送主机头之前会从其主机头中删除端口号(如果它是协议的默认端口)。

如果客户端确实在其主机头中明确发送了端口号,则您需要为这种情况添加额外的 ACL,除非您想采用不太安全的使用方式hdr_beg(Host)

换句话说,准确捕获两个标头的正确语法可能看起来像这样:

frontend all_clients
    bind 0.0.0.0:80
    acl back1 hdr(Host) -i bk1.domain.com
    acl back1 hdr(Host) -i bk1.domain.com:80
    acl back2 hdr(Host) -i bk2.domian.com
    acl back2 hdr(Host) -i bk2.domian.com:80
    use_backend backend1 if back1
    use_backend backend2 if back2
    default_backend default

答案2

剪切了您的代码并进行了编辑。您需要做的是定义一个 acl,然后根据 acl 进行路由:

frontend all_clients
    bind 0.0.0.0:80
    default_backend default
    acl back1 if hdr_beg(host) -i bk1.
    acl back2 if hdr_beg(host) -i bk2.
    use_backend bk1 if back1
    use_backend bk2 if back2

相关内容