使用haproxy将几个子域指向单个后端

我正在使用haproxy来指导在单个服务器上运行的多个应用程序的路由。 对于其中一个正在使用的域,有几十个子域应该被引导到几个应用程序之一。

目前,我列出了所有这些子域在一个separte行。 我的前端configuration如下所示:

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 

有没有办法以更简洁的forms获得类似的结果? 这样的列表是否有效,或者在某个时候切换到正则expression式会更好吗?

为了保持最佳性能(避免每次命中的正则expression式),但仍然清理configuration,我会在这里使用外部文件作为ACL。 例如,假设您有一个名为/etc/haproxy/sub1urls ,正是这个文件:

 apple.gamma.com banana.gamma.com cherry.gamma.com 

那么在你的configuration中,ACL可以简单地为:

 acl is_sub1 hdr(host) -i -f /etc/haproxy/sub1urls 

将其他主机放在一个sub2urls文件中,同样的方法将你的configuration降低到:

 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 

这使得维护这些其他文件变得非常容易,因为它们只是主机列表。 它打开了谁可以编辑他们的名单,并显示较less的风险。 例如,我们让人们在puppet中编辑这些ACL列表,而不必知道HAProxyconfiguration语法。