Проблема с несколькими сайтами на одном vps с haproxy

Проблема с несколькими сайтами на одном vps с haproxy

Настраивать

У меня есть , 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? Как видно, я использую куки, которые должны направлять запрос на правильный сервер (я проверил клиентские куки, и они все в порядке). Я занимаюсь этим уже несколько часов, не знаю, что еще попробовать.

Связанный контент