Dirigez plusieurs sous-domaines vers un seul backend avec haproxy

10

J'utilise haproxy pour diriger l'itinéraire pour plusieurs applications s'exécutant sur un seul serveur. Pour l'un des domaines utilisés, plusieurs dizaines de sous-domaines doivent être dirigés vers l'une des quelques applications.

Actuellement, je liste tous ces sous-domaines sur une ligne séparée. Ma configuration frontend ressemble à ceci:

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

Existe-t-il un moyen d'obtenir un résultat similaire sous une forme plus concise? Une telle liste est-elle efficace, ou serait-il préférable de passer à une expression régulière à un moment donné?

Hubert OG
la source
Hé, votre question contient le mot-clé regex, qui est en fait votre réponse, je crois. Notez également que vous pouvez utiliser hdr_begau lieu de hdrafin d'énumérer uniquement les sous-domaines. Enfin, il devrait être possible de réduire vos gamma00-06listes de contrôle d'accès en deux listes de contrôle d'accès, une pour sub1et une pour sub2, simplement en utilisant les mêmes acl <title>dans la ligne ACL.
Felix Frank

Réponses:

15

Pour garder les performances au maximum (en évitant une expression régulière à chaque hit) mais en nettoyant la configuration, j'utiliserais ici un fichier externe pour vos ACL. Par exemple, supposons que vous ayez appelé un fichier /etc/haproxy/sub1urls, qui était exactement le suivant:

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

Dans votre configuration, l'ACL pourrait simplement être:

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

Mettre les autres hôtes dans un sub2urlsfichier de la même manière réduit votre 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

Cela facilite la maintenance de ces autres fichiers, car ce ne sont que des listes d'hôtes. Il ouvre la liste des personnes qui peuvent les modifier et expose également moins de risques. Par exemple, nous avons des gens qui éditent ces listes ACL comme ça dans une marionnette qui n'ont pas du tout besoin de connaître la syntaxe de configuration HAProxy.

Nick Craver
la source