Sessions persistantes avec proxy Nginx

10

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 ip_hashd'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. Cela fonctionne , 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 ne fonctionne pas . En d'autres termes, les sessions sont toujours équilibrées en 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 ip_hashtrain d' utiliser correctement? Comment puis-je activer des sessions IP «persistantes» pour les serveurs externes?

Himmel
la source
Votre Nginx a-t-il installé "ngx_http_upstream_module"? Je ne sais pas si c'est inclus par défaut ou non. "nginx -V" génère généralement les modules avec lesquels il est construit. La mienne (construite à partir de la source) ne le mentionne pas
Tim

Réponses:

7

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;
    }
}
Himmel
la source
7

Selon la documentation 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

Mr. bug
la source
Êtes-vous en mesure de créer un lien vers cette documentation?
James Shewey