Skieruj kilka subdomen do jednego zaplecza za pomocą haproxy

10

Używam haproxy do kierowania trasą dla kilku aplikacji działających na jednym serwerze. Dla jednej z używanych domen istnieje kilkadziesiąt subdomen, które powinny być skierowane do jednej z kilku aplikacji.

Obecnie wymieniam wszystkie te subdomeny w osobnej linii. Moja konfiguracja interfejsu wygląda następująco:

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

Czy istnieje sposób na uzyskanie podobnego wyniku w bardziej zwięzłej formie? Czy taka lista jest skuteczna, czy może lepiej w pewnym momencie przejść do wyrażenia regularnego?

Hubert OG
źródło
Heh, twoje pytanie zawiera słowo kluczowe regex, które, jak sądzę, jest twoją odpowiedzią. Pamiętaj też, że możesz użyć hdr_begzamiast hdr, aby wyliczyć tylko subdomeny. Wreszcie, powinno być możliwe zwinięcie gamma00-06list ACL do dwóch list ACL, jednej dla sub1i jednej dla sub2, po prostu przy użyciu tego samego acl <title>w linii ACL.
Felix Frank

Odpowiedzi:

15

Aby utrzymać maksymalną wydajność (unikając wyrażenia regularnego przy każdym trafieniu), ale nadal czyszcząc konfigurację, użyłbym tutaj zewnętrznego pliku dla twoich list ACL. Załóżmy na przykład, że masz plik o nazwie /etc/haproxy/sub1urls, który był dokładnie taki:

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

Następnie w twojej konfiguracji ACL może po prostu być:

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

Umieszczenie innych hostów w sub2urlspliku w ten sam sposób ogranicza konfigurację do:

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

Ułatwia to zarządzanie tymi innymi plikami, ponieważ są to tylko listy hostów. Otwiera listę osób, które mogą je edytować, a także zmniejsza ryzyko. Na przykład mamy osoby edytujące takie listy ACL w marionetce, które wcale nie muszą znać składni konfiguracji HAProxy.

Nick Craver
źródło