Problem mit mehreren Sites auf demselben VPS mit Haproxy

Problem mit mehreren Sites auf demselben VPS mit Haproxy

Aufstellen

Ich habe einen VPS, den ich verwende docker. Ich habe derzeit 3 ​​Container. 1 für Haproxy und die anderen 2 Container enthalten ihre einzelnen Sites (auf Port 8080 wird ein NodeJS-HTTP-Server ausgeführt).

Ich habe die folgende Domäne und Subdomänen.

  • meinedomain.com
  • deus.ex.machina.meinedomain.com
  • fela.meinedomain.com

Ich möchte mydomain.comzum ersten der beiden Knotenserver und fela.mydomain.comdann zum anderen Knotenserver gehen. Die dritte Domäne deus.ex.machina.mydomain.comsollte zu einer IP-Adresse führen, die nicht existiert, um einen Serverausfall zu simulieren, damit ich sicherstellen kann, dass die 503-Seite angezeigt wird.

Hier ist mein 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 funktioniert (nodejs auf Port 8080)
  • 172.17.0.59:8080 funktioniert (nodejs auf Port 8080)
  • 172.17.0.99:8080 funktioniert nicht (simuliert NodeJS-Ausfall)

Alle Anfragen an alle drei kommen von der gleichen IP-Adresse (dem gleichen Gerät), das ist der Grund, warum ich das habe option http-server-close.

Problem

Bleibt die Frage:was ist das Problem?

Die Weiterleitung erfolgt in etwa 90 % der Fälle korrekt.

  • Wenn ich eine Verbindung herstelle mydomain.comund die Schaltfläche „Aktualisieren“ drücke, wird in 90 von 10 Fällen die richtige Seite angezeigt (172.17.0.50:8080). In einem ungewöhnlichen Fall wird 503 angezeigt (als ob die Seite an den Server weitergeleitet wurde deus.ex.machina.mydomain.comoder war es vielleicht der Server? Ich weiß nicht, wie ich das überprüfen kann).

  • Wenn fela.mydomain.comSie auf die Schaltfläche „Aktualisieren“ klicken, wird in 90 von 10 Fällen die richtige Seite angezeigt (172.17.0.59:8080), und in einem ungewöhnlichen Fall wird die mydomain.comSeite (nicht Seite 503) (172.17.0.50:8080) angezeigt.

  • Und das Gleiche gilt, deus.ex.machina.mydomain.comwenn Sie auf die Schaltfläche „Aktualisieren“ klicken. In 90 von 10 Fällen wird die richtige Seite angezeigt (Fehler 503), in einem ungewöhnlichen Fall wird die mydomain.comSeite (keine 503-Seite) angezeigt (172.17.0.50:8080).

Durch das Hinzufügen option httpclosewird es noch schlimmer: Die Wahrscheinlichkeit einer Weiterleitung auf die falsche Seite ist 50/50.

Ich habe alle 3 Domänen in Tabs im selben Chrome-Browser geöffnet, wechsle zwischen ihnen und aktualisiere sie.

Ich vermute, dass Haproxy die Anfragen durcheinanderbringt? Vielleicht wird zwischengespeichert, an welches Backend eine IP-Anfrage gehen soll? Wie man sieht, verwende ich Cookies, die die Anfrage an den richtigen Server weiterleiten sollten (ich habe die Client-Cookies überprüft und sie sind alle in Ordnung). Ich bin jetzt schon seit Stunden dabei und weiß nicht wirklich, was ich sonst noch versuchen soll.

verwandte Informationen