Proxy

使用 haproxy 將多個子域定向到單個後端

  • June 11, 2014

我正在使用 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

有沒有辦法以更簡潔的形式實現類似的結果?這樣的列表是否有效,還是在某個時候切換到正則表達式會更好?

為了最大限度地保持性能(避免每次點擊都使用正則表達式)但仍然清理配置,我會在此處為您的 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 配置語法。

引用自:https://serverfault.com/questions/604041