O problema é que o proxy do usuário remoto vê que ambos, mydomain.com e l3.mydomain.com, são o mesmo endereço IP e tentam reutilizar a conexão. A adição da opção http-server-close resolveu o problema.
Estou usando o HAProxy 1.4.22. Eu tenho o seguinte arquivo haproxy.conf:
global
maxconn 100000
daemon
defaults
mode http
retries 1
contimeout 8000
clitimeout 120000
srvtimeout 120000
stats enable
stats uri /haproxy-stats
stats auth admin:****************
option httpchk
frontend http-in
bind 16.9.13.39:80
maxconn 100000
acl is_l1 hdr_end(host) -i l1.mydomain.com
acl is_l2 hdr_end(host) -i l2.mydomain.com
acl is_l3 hdr_end(host) -i l3.mydomain.com
acl is_l0 hdr_end(host) -i mydomain.com
use_backend lora1 if is_l1
use_backend lora2 if is_l2
use_backend lora3 if is_l3
use_backend lora0 if is_l0
default_backend lora0
backend lora0
balance roundrobin
option forwardfor except 127.0.0.1 # stunnel already adds the header
server s0 127.0.0.1:5000 check inter 60000
backend lora1
balance source
option forwardfor except 127.0.0.1 # stunnel already adds the header
server s1 127.0.0.1:5001 check inter 60000
backend lora2
balance source
option forwardfor except 127.0.0.1 # stunnel already adds the header
server s2 127.0.0.1:5002 check inter 60000
backend lora3
balance source
option forwardfor except 127.0.0.1 # stunnel already adds the header
server s3 127.0.0.1:5003 check inter 60000
Tudo funciona bem. Exceto, para alguns 0,2% dos clientes. Às vezes, quando a solicitação chega para l1, l2 ou l3. Por exemplo:
http://l3.mydomain.com/something
e o HAProxy não coincide com o nome do domínio por algum motivo e usa back-end padrão.
Eu configurei o log em meu aplicativo e ele relata que o nome do host no terminal de recebimento é, na verdade, "l3.mydomain.com". Aqui estão os cabeçalhos que meu aplicativo recebe:
host: 'l3.mydomain.com',
'user-agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4',
accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
referer: 'http://mydomain.com/menu/2034414/e2e1abb5500ed51391d6351b1cf03695',
'accept-encoding': 'gzip,deflate,sdch',
'accept-language': 'en-US,en;q=0.8',
'accept-charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
'x-proxy-id': '1407537728',
'x-forwarded-for': '10.201.4.168',
via: '1.1 10.201.255.254 (Mikrotik HttpProxy)'
Perguntas:
Eu estou usando hdr_end () corretamente, e há algum caso especial quando a correspondência pode falhar?
Existe alguma forma de registrar os leitores HTTP reais recebidos pelo HAProxy, mas somente quando nada é correspondido e a regra default_backend é usada?
O problema é que o proxy do usuário remoto vê que ambos, mydomain.com e l3.mydomain.com, são o mesmo endereço IP e tentam reutilizar a conexão. A adição da opção http-server-close resolveu o problema.
Tags haproxy