
Configurar
Eu tenho um VPS
que estou usando docker
. Atualmente tenho 3 contêineres. 1 para haproxy e os outros 2 contêineres contêm seus sites individuais (executando um servidor http nodejs na porta 8080).
Eu tenho o seguinte domínio e subdomínios.
- meudominio.com
- deus.ex.machina.meudominio.com
- fela.meudominio.com
Eu gostaria de mydomain.com
ir para o primeiro dos dois servidores de nó e fela.mydomain.com
ir para o outro servidor de nó. O terceiro domínio deus.ex.machina.mydomain.com
deve ir para um endereço IP que não existe, para simular a queda de um servidor para que eu possa ter certeza de que a página 503 será exibida.
Aqui está o meu 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 na porta 8080)
- 172.17.0.59:8080 está funcionando (nodejs na porta 8080)
- 172.17.0.99:8080 não está funcionando (simula nodejs inativo)
Todas as solicitações para todos os três vêm do mesmo endereço IP (mesmo dispositivo), razão pela qual eu tenho option http-server-close
.
Problema
Isso deixa a questão:qual é o problema?
Eles estão redirecionando corretamente aproximadamente 90% das vezes.
Se eu conectar
mydomain.com
e apertar o botão de atualização 9 em cada 10 vezes, a página correta será exibida (172.17.0.50:8080), o 1º momento ímpar exibirá 503 (como se fosse direcionadodeus.ex.machina.mydomain.com
ou talvez fosse o servidor? Eu não sei como verificar isso).Pois
fela.mydomain.com
ao apertar o botão de atualização, 9 em cada 10 vezes a página correta aparecerá (172.17.0.59:8080), a 1 vez ímpar exibirá amydomain.com
página (não a página 503) (172.17.0.50:8080).E o mesmo vale para
deus.ex.machina.mydomain.com
quando você pressiona o botão de atualização, 9 em cada 10 vezes a página correta aparecerá (erro 503), a 1 vez ímpar exibirá amydomain.com
página (não a página 503) (172.17.0.50:8080).
Adicionar option httpclose
torna ainda pior a chance de 50/50 de redirecionar para a página errada.
Tenho todos os três domínios abertos em guias no mesmo navegador Chrome, alterno entre eles e os atualizo.
Suspeito que o haproxy está confundindo as solicitações. Talvez armazenando em cache para qual back-end uma solicitação IP deve ir? Como visto estou usando cookies que devem direcionar a solicitação para o servidor correto (verifiquei os cookies do cliente e estão todos em ordem). Estou nisso há horas, não sei mais o que tentar.