Leiten Sie mehrere Subdomains mit Haproxy an ein einzelnes Backend

10

Ich verwende Haproxy, um die Route für mehrere Anwendungen zu steuern, die auf einem einzelnen Server ausgeführt werden. Für eine der verwendeten Domänen gibt es mehrere Dutzend Subdomänen, die an eine der wenigen Anwendungen gerichtet werden sollten.

Derzeit liste ich alle diese Subdomains in einer separaten Zeile auf. Meine Frontend-Konfiguration sieht folgendermaßen aus:

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

Gibt es eine Möglichkeit, ein ähnliches Ergebnis in präziserer Form zu erzielen? Ist eine solche Auflistung effektiv oder wäre es besser, irgendwann zu einem regulären Ausdruck zu wechseln?

Hubert OG
quelle
Heh, deine Frage enthält das Schlüsselwort regex, das tatsächlich deine Antwort ist, glaube ich. Beachten Sie auch, dass Sie hdr_begstattdessen verwenden können, um hdrnur die Subdomains aufzulisten. Schließlich sollte es möglich sein, Ihre gamma00-06ACLs auf nur zwei ACLs zu reduzieren, eine für sub1und eine für sub2, indem Sie diese einfach acl <title>in der ACL-Zeile verwenden.
Felix Frank

Antworten:

15

Um die Leistung auf einem Maximum zu halten (wobei bei jedem Treffer ein regulärer Ausdruck vermieden wird) und dennoch die Konfiguration bereinigt wird, würde ich hier eine externe Datei für Ihre ACLs verwenden. Nehmen wir zum Beispiel an, Sie hatten eine Datei mit dem Namen /etc/haproxy/sub1urls: Genau das war:

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

Dann könnte die ACL in Ihrer Konfiguration einfach sein:

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

Wenn Sie die anderen Hosts auf sub2urlsdie gleiche Weise in eine Datei einfügen, reduziert sich Ihre Konfiguration auf:

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

Dies macht es sehr einfach, diese anderen Dateien zu verwalten, da es sich nur um Listen von Hosts handelt. Es öffnet die Liste, wer sie bearbeiten kann, und birgt auch weniger Risiken. Zum Beispiel haben wir Leute, die diese ACL-Listen wie diese in Puppet bearbeiten und die die HAProxy-Konfigurationssyntax überhaupt nicht kennen müssen.

Nick Craver
quelle