使用 haproxy 将多个子域定向到单个后端

Hub*_* OG 10 proxy load-balancing haproxy

我正在使用 haproxy 为在单个服务器上运行的多个应用程序直接路由。对于正在使用的域之一,有几十个子域应该指向少数应用程序之一。

目前,我在单独的一行中列出了所有这些子域。我的前端配置如下所示:

frontend http-in
    bind *:80

    acl alpha     hdr(host) -i alpha.com
    acl beta      hdr(host) -i beta.com
    acl gamma00   hdr(host) -i apple.gamma.com
    acl gamma01   hdr(host) -i banana.gamma.com
    acl gamma02   hdr(host) -i cherry.gamma.com
    acl gamma03   hdr(host) -i durian.gamma.com
    acl gamma04   hdr(host) -i elderberry.gamma.com
    acl gamma05   hdr(host) -i fig.gamma.com
    acl gamma06   hdr(host) -i grapefruit.gamma.com
    acl gamma     hdr(host) -i gamma.com

    use_backend a if alpha
    use_backend b if beta
    use_backend sub1 if gamma00
    use_backend sub1 if gamma01
    use_backend sub1 if gamma02
    use_backend sub2 if gamma03
    use_backend sub2 if gamma04
    use_backend sub2 if gamma05
    use_backend sub2 if gamma06
    use_backend g if gamma

    default_backend default
Run Code Online (Sandbox Code Playgroud)

有没有办法以更简洁的形式实现类似的结果?这样的列表是否有效,还是在某个时候切换到正则表达式会更好?

Nic*_*ver 15

为了最大限度地保持性能(避免每次命中都使用正则表达式)但仍然清理配置,我会在此处为您的 ACL 使用外部文件。例如,假设您有一个名为 的文件/etc/haproxy/sub1urls,它正是这样的:

apple.gamma.com
banana.gamma.com
cherry.gamma.com
Run Code Online (Sandbox Code Playgroud)

然后在您的配置中,ACL 可能只是:

acl is_sub1 hdr(host) -i -f /etc/haproxy/sub1urls
Run Code Online (Sandbox Code Playgroud)

sub2urls相同的方式将其他主机放在一个文件中可以将您的配置减少到:

frontend http-in
    bind *:80

    acl alpha     hdr(host) -i alpha.com
    acl beta      hdr(host) -i beta.com
    acl is_sub1   hdr(host) -i -f /etc/haproxy/sub1urls
    acl is_sub2   hdr(host) -i -f /etc/haproxy/sub2urls
    acl gamma     hdr(host) -i gamma.com

    use_backend a if alpha
    use_backend b if beta
    use_backend sub1 if is_sub1
    use_backend sub2 if is_sub2
    use_backend g if gamma

    default_backend default
Run Code Online (Sandbox Code Playgroud)

这使得维护那些其他文件变得非常容易,因为它们只是主机列表。它打开了谁可以编辑它们的列表并降低了风险。例如,我们有人在 puppet 中像这样编辑这些 ACL 列表,他们根本不需要知道 HAProxy 配置语法。