
Настраивать
У меня есть , VPS
который я использую docker
. В настоящее время у меня есть 3 контейнера. 1 для haproxy, а остальные 2 контейнера содержат их отдельные сайты (работающие на http-сервере nodejs на порту 8080).
У меня есть следующий домен и поддомены.
- мойдомен.com
- deus.ex.machina.mydomain.com
- fela.mydomain.com
Я хотел бы mydomain.com
перейти на первый из двух узловых серверов и fela.mydomain.com
перейти на другой узел сервера. Третий домен deus.ex.machina.mydomain.com
должен перейти на несуществующий IP-адрес, чтобы сымитировать падение сервера, чтобы я мог убедиться, что отображается страница 503.
Вот мой 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 работает (nodejs на порту 8080)
- 172.17.0.59:8080 работает (nodejs на порту 8080)
- 172.17.0.99:8080 не работает (симулирует падение nodejs)
Все запросы ко всем трем адресам поступают с одного и того же IP-адреса (одного и того же устройства), поэтому у меня option http-server-close
.
Проблема
Остается вопрос:в чем проблема?
Они выполняют перенаправление правильно примерно в 90% случаев.
Если я подключусь
mydomain.com
и нажму кнопку обновления, то 9 раз из 10 будет отображаться правильная страница (172.17.0.50:8080), один раз будет отображаться 503 (как будто это было перенаправленоdeus.ex.machina.mydomain.com
или, может быть, это был сервер? Я не знаю, как это проверить).При
fela.mydomain.com
нажатии кнопки обновления в 9 случаях из 10 будет отображаться правильная страница (172.17.0.59:8080), а в 1 нечетном случае будет отображатьсяmydomain.com
страница (не 503) (172.17.0.50:8080).То же самое происходит
deus.ex.machina.mydomain.com
при нажатии кнопки обновления: в 9 случаях из 10 будет отображаться правильная страница (ошибка 503), а в 1 нечетном случае будет отображаться страницаmydomain.com
(не страница 503) (172.17.0.50:8080).
Добавление option httpclose
еще больше ухудшает ситуацию: вероятность перенаправления на неправильную страницу составляет 50/50.
У меня все 3 домена открыты во вкладках в одном браузере Chrome, я переключаюсь между ними и обновляю их.
Подозреваю, что haproxy путает запросы? Возможно, кэширование того, на какой бэкенд должен идти запрос IP? Как видно, я использую куки, которые должны направлять запрос на правильный сервер (я проверил клиентские куки, и они все в порядке). Я занимаюсь этим уже несколько часов, не знаю, что еще попробовать.