Sticky-Sessions mit Nginx-Proxy

10

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_hashzum 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_hashrichtig? Wie kann ich "klebrige" IP-basierte Sitzungen für externe Server aktivieren?

Himmel
quelle
Ist auf Ihrem Nginx "ngx_http_upstream_module" installiert? Ich weiß nicht, ob es standardmäßig enthalten ist oder nicht. "nginx -V" gibt normalerweise Module aus, mit denen es erstellt wurde. Meins (aus der Quelle gebaut) erwähnt es nicht
Tim

Antworten:

7

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

Mr. Bug
quelle
Können Sie auf diese Dokumentation verlinken?
James Shewey
6

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):

upstream my_app {
    ip_hash;
    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;
}

server {
    server_name my-app.com;

    location / {
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_set_header X-Real_IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;

        # This is necessary to pass the correct IP to be hashed
        real_ip_header X-Real-IP;

        proxy_pass http://my_app/;
        proxy_redirect off;
    }
}
Himmel
quelle