web-dev-qa-db-fra.com

Sessions persistantes avec proxy Nginx

J'ai une application qui s'exécute sur deux instances AWS différentes et j'aimerais activer des sessions "persistantes" ou "persistantes" basées sur IP afin de pouvoir tirer parti des technologies de socket Web d'une manière particulière.

J'ai deux configurations différentes qui impliquent toutes deux l'utilisation de ip_hash pour activer ces sessions persistantes.

Dans la première configuration, les processus d'application s'exécutent sur la même instance que la configuration Nginx. C'est fonctionnant, les sessions sont persistantes comme prévu.

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

Dans la deuxième configuration, je pointe vers des instances externes et j'essaie d'obtenir le même effet. Cette configuration est ne fonctionne pas. En d'autres termes, les sessions sont toujours en cours d'équilibrage de charge.

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

Suis-je en utilisant ip_hash correctement? Comment puis-je activer des sessions basées sur IP "persistantes" pour les serveurs externes?

10
Himmel

Selon la documentation de Nginx, la prise en charge des sessions persistantes n'est disponible que pour leur version Plus coûteuse. J'ai recherché des alternatives et plus je me suis rapprochée de cette vieille fourche qui n'est pas compatible avec Nginx 1.5+ https://github.com/lusis/nginx-sticky-module

J'ai également essayé de construire un module LUA mais il n'y a pas de hooks API pour la sélection des pairs, juste pour l'énumération et le blocage.

Équilibrage de charge Nginx Plus

Mise à jour

J'ai trouvé un autre excellent module, voir https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/src

7
Mr. bug

Mon serveur était derrière l'équilibrage de charge AWS, donc je devais passer les en-têtes corrects en amont pour qu'il reflète toujours l'adresse IP du client. La configuration suivante a résolu mon problème (voir la ligne commentée):

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