Ich habe eine Anwendung, die auf zwei verschiedenen AWS-Instanzen ausgeführt wird, und ich möchte "Sticky" - oder "Persistent" -Sitzungen basierend auf IP aktivieren, damit ich die Web-Socket-Technologien auf bestimmte Weise nutzen kann.
Ich habe zwei verschiedene Setups, die beide ip_hash
zum Aktivieren dieser Sticky-Sessions verwenden.
Beim ersten Setup werden die App-Prozesse auf derselben Instanz wie die Nginx-Konfiguration ausgeführt. Dies funktioniert , die Sitzungen sind erwartungsgemäß persistent.
upstream my_app {
ip_hash;
# local servers
server 127.0.0.1:3001 weight=100 max_fails=5 fail_timeout=300;
server 127.0.0.1:3002 weight=100 max_fails=5 fail_timeout=300;
keepalive 8;
}
Im zweiten Setup zeige ich auf externe Instanzen und versuche, den gleichen Effekt zu erzielen. Diese Einrichtung funktioniert nicht . Mit anderen Worten, die Sitzungen werden immer noch lastausgeglichen.
upstream my_app {
ip_hash;
# external servers
server 111.11.11.11:3001 weight=100 max_fails=5 fail_timeout=300;
server 222.22.22.22:3002 weight=100 max_fails=5 fail_timeout=300;
keepalive 8;
}
Benutze ich ip_hash
richtig? Wie kann ich "klebrige" IP-basierte Sitzungen für externe Server aktivieren?
quelle
Antworten:
Laut Nginx-Dokumentation ist die Unterstützung für Sticky-Sitzungen nur für die teure Plus-Version verfügbar. Ich habe nach Alternativen gesucht und je näher ich gekommen bin, desto älter ist diese alte Gabel, die nicht mit Nginx 1.5+ kompatibel ist. Https://github.com/lusis/nginx-sticky-module
Ich habe auch versucht, ein LUA-Modul zu erstellen, aber es gibt keine API-Hooks für die Peer-Auswahl, nur für die Aufzählung und Blockierung.
Nginx Plus Lastausgleich
Aktualisieren
Ich habe ein weiteres großartiges Modul gefunden, siehe https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/src
quelle
Mein Server befand sich hinter AWS Load Balancing, daher musste ich die richtigen Header an Upstream übergeben, damit sie immer die Client-IP widerspiegeln. Die folgende Konfiguration hat mein Problem behoben (siehe die kommentierte Zeile):
quelle