
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.com
zum ersten der beiden Knotenserver und fela.mydomain.com
dann zum anderen Knotenserver gehen. Die dritte Domäne deus.ex.machina.mydomain.com
sollte 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.com
und 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 wurdedeus.ex.machina.mydomain.com
oder war es vielleicht der Server? Ich weiß nicht, wie ich das überprüfen kann).Wenn
fela.mydomain.com
Sie 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 diemydomain.com
Seite (nicht Seite 503) (172.17.0.50:8080) angezeigt.Und das Gleiche gilt,
deus.ex.machina.mydomain.com
wenn 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 diemydomain.com
Seite (keine 503-Seite) angezeigt (172.17.0.50:8080).
Durch das Hinzufügen option httpclose
wird 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.