web-dev-qa-db-fra.com

Direct plusieurs sous-domaines à un seul backend avec haproxy

J'utilise haproxy pour diriger la route pour plusieurs applications exécutées sur un seul serveur. Pour l'un des domaines utilisés, il existe plusieurs dizaines de sous-domaines qui doivent être adressés à l'une des rares applications.

Actuellement, je liste toutes ces sous-domaines dans une ligne de Séparte. Ma configuration frontale 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 à une forme plus concise? Une telle liste est-elle efficace ou serait-il préférable de passer à une regex à un moment donné?

10
Hubert OG

Pour garder les performances à un maximum (évitant une regex à chaque coup) mais nettoyage toujours la configuration, j'utiliserais un fichier externe pour votre ACLS ici. Par exemple, disons que vous aviez un fichier appelé /etc/haproxy/sub1urls, qui était exactement ceci:

Apple.gamma.com
banana.gamma.com
cherry.gamma.com

Ensuite, dans votre config, l'ACL pourrait simplement être:

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

Mettre les autres hôtes dans un sub2urls Le fichier de la même manière réduit votre configuration jusqu'à:

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 ils ne sont que des listes d'hôtes. Il ouvre la liste de qui peut les modifier et expose moins de risque. Par exemple, nous avons des personnes éditées ces listes d'ACL comme celle-ci dans la marionnette qui n'a pas à connaître la syntaxe de configuration Haproxy.

15
Nick Craver