我使用 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
有没有办法以更简洁的形式实现类似的结果?这样的列表是否有效,或者在某个时候切换到正则表达式会更好?
答案1
为了保持最佳性能(避免每次命中都使用正则表达式)但仍能清理配置,我会在此处使用外部文件作为 ACL。例如,假设您有一个名为的文件/etc/haproxy/sub1urls
,它正是这样的:
apple.gamma.com
banana.gamma.com
cherry.gamma.com
然后在您的配置中 ACL 可以简单地为:
acl is_sub1 hdr(host) -i -f /etc/haproxy/sub1urls
以同样的方式将其他主机放入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
这使得维护其他文件变得非常容易,因为它们只是主机列表。它打开了谁可以编辑它们的列表,同时也降低了风险。例如,我们让一些人在 puppet 中编辑这些 ACL 列表,而这些人根本不需要知道 HAProxy 配置语法。