我一直在尝试配置 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