Problema con varios sitios en el mismo vps con haproxy

Problema con varios sitios en el mismo vps con haproxy

Configuración

Tengo un VPSque estoy usando docker. Actualmente tengo 3 contenedores. 1 para haproxy y los otros 2 contenedores contienen sus sitios individuales (ejecutando un servidor http nodejs en el puerto 8080).

Tengo el siguiente dominio y subdominios.

  • midominio.com
  • deus.ex.machina.midominio.com
  • fela.midominio.com

Me gustaría mydomain.comir al primero de los dos servidores de nodo e fela.mydomain.comir al otro servidor de nodo. El tercer dominio deus.ex.machina.mydomain.comdebe ir a una dirección IP que no existe, para simular un servidor que falla y poder asegurarme de que se muestre la página 503.

Aquí está mi haproxy.cfg:

global
    log 127.0.0.1 local0 notice
    maxconn 2000
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin
    stats timeout 30s
    user haproxy
    group haproxy

defaults
    log     global
    mode    http
    option  httplog
    option  dontlognull
    retries 3
    option http-server-close
    timeout connect 5000
    timeout client  10000
    timeout server  10000

listen stats
    bind       :1988
    stats uri /

frontend http-in
        bind *:80

        # define hosts
        acl host_deusexmachina  hdr_beg(host) -i deus.ex.machina.mydomain.com
        acl host_fela           hdr_beg(host) -i fela.mydomain.com
        acl host_mydomain       hdr_beg(host) -i mydomain.com

        # figure out which one to use
        use_backend deusexmachina_cluster   if host_deusexmachina
        use_backend fela_cluster            if host_fela
        use_backend mydomain_cluster        if host_mydomain

backend deusexmachina_cluster

        balance roundrobin
        cookie SERVERID insert indirect nocache

        server deusexmachina_s1 172.17.0.99:8080 check cookie deusexmachina_s1

backend fela_cluster

        balance roundrobin
        cookie SERVERID insert indirect nocache

        server fela_s1 172.17.0.59:8080 check cookie fela_s1

backend mydomain_cluster

        balance roundrobin
        cookie SERVERID insert indirect nocache

        server mydomain_s1 172.17.0.50:8080 check cookie mydomain_s1
  • 172.17.0.50:8080 está funcionando (nodejs en el puerto 8080)
  • 172.17.0.59:8080 está funcionando (nodejs en el puerto 8080)
  • 172.17.0.99:8080 no funciona (simula nodejs inactivos)

Todas las solicitudes a los tres provienen de la misma dirección IP (mismo dispositivo), la razón por la que tengo option http-server-close.

Problema

Eso deja la pregunta:¿cual es el problema?

Redireccionan correctamente aproximadamente el 90% del tiempo.

  • Si me conecto mydomain.comy presiono el botón de actualización 9 de cada 10 veces, aparecerá la página correcta (172.17.0.50:8080), la primera vez mostrará 503 (¿como si estuviera dirigido a deus.ex.machina.mydomain.como tal vez fuera el servidor? No sé cómo comprobarlo).

  • Al fela.mydomain.compresionar el botón de actualización, 9 de cada 10 veces aparecerá la página correcta (172.17.0.59:8080), la única vez se mostrará la mydomain.compágina (no la página 503) (172.17.0.50:8080).

  • Y lo mismo ocurre deus.ex.machina.mydomain.comcuando presiona el botón Actualizar, 9 de cada 10 veces aparecerá la página correcta (error 503), la única vez se mostrará la mydomain.compágina (no la página 503) (172.17.0.50:8080).

Agregarlo option httpcloseempeora aún más la posibilidad de 50/50 de que se redirija a la página equivocada.

Tengo los 3 dominios abiertos en pestañas en el mismo navegador Chrome, cambio entre ellos y los actualizo.

Sospecho que haproxy está mezclando las solicitudes. ¿Quizás almacenar en caché a qué backend debería dirigirse una solicitud de IP? Como se ve, estoy usando cookies que deberían dirigir la solicitud al servidor correcto (revisé las cookies del cliente y están todas en orden). He estado en esto durante horas y realmente no sé qué más probar.

información relacionada