Dirija varios subdominios a un solo backend con haproxy

10

Estoy usando haproxy para dirigir la ruta para varias aplicaciones que se ejecutan en un solo servidor. Para uno de los dominios en uso, hay varias docenas de subdominios que deben dirigirse a una de las pocas aplicaciones.

Actualmente, enumero todos esos subdominios en una línea separada. Mi configuración de interfaz se ve así:

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

¿Hay alguna manera de lograr un resultado similar en forma más concisa? ¿Es eficaz este listado, o sería mejor cambiar a una expresión regular en algún momento?

Hubert OG
fuente
Je, su pregunta contiene la palabra clave regex, que de hecho es su respuesta, creo. También tenga en cuenta que puede usar en hdr_beglugar de hdrpara enumerar solo los subdominios. Finalmente, debería ser posible contraer sus gamma00-06ACL en solo dos ACL, una para sub1y otra para sub2, simplemente usando el mismo acl <title>en la línea de ACL.
Felix Frank

Respuestas:

15

Para mantener el rendimiento al máximo (evitando una expresión regular cada golpe) pero aún limpiando la configuración, usaría un archivo externo para sus ACL aquí. Por ejemplo, digamos que tenía un archivo llamado /etc/haproxy/sub1urls, que era exactamente esto:

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

Luego, en su configuración, la ACL podría ser simplemente:

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

Poner los otros hosts en un sub2urlsarchivo de la misma manera reduce su configuración a:

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

Esto hace que sea muy fácil mantener esos otros archivos, ya que son solo listas de hosts. Abre la lista de quién puede editarlos y también expone menos riesgos. Por ejemplo, tenemos personas que editan estas listas de ACL como esta en títeres que no tienen que conocer la sintaxis de configuración de HAProxy.

Nick Craver
fuente