
Configuración
Tengo un VPS
que 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.com
ir al primero de los dos servidores de nodo e fela.mydomain.com
ir al otro servidor de nodo. El tercer dominio deus.ex.machina.mydomain.com
debe 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.com
y 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 adeus.ex.machina.mydomain.com
o tal vez fuera el servidor? No sé cómo comprobarlo).Al
fela.mydomain.com
presionar 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á lamydomain.com
página (no la página 503) (172.17.0.50:8080).Y lo mismo ocurre
deus.ex.machina.mydomain.com
cuando presiona el botón Actualizar, 9 de cada 10 veces aparecerá la página correcta (error 503), la única vez se mostrará lamydomain.com
página (no la página 503) (172.17.0.50:8080).
Agregarlo option httpclose
empeora 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.