it-swarm.com.de

Sticky Sessions mit Nginx Proxy

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, bei denen beide ip_hash Verwenden, um diese Sticky-Sitzungen zu aktivieren.

Beim ersten Setup werden die App-Prozesse auf derselben Instanz wie die Nginx-Konfiguration ausgeführt. Dies ist 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 Einstellung ist 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?

10
Himmel

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 Load Balancing

Update

Ich habe ein weiteres großartiges Modul gefunden, siehe https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/src

7
Mr. bug

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 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;
    }
}
6
Himmel