Sessioni appiccicose con proxy Nginx


10

Ho un'applicazione in esecuzione su due diverse istanze AWS e mi piacerebbe abilitare sessioni "permanenti" o "persistenti" basate su IP in modo da poter sfruttare le tecnologie dei socket Web in un modo particolare.

Ho due diverse configurazioni che coinvolgono entrambe ip_hashper abilitare queste sessioni appiccicose.

Nella prima configurazione, i processi dell'app sono in esecuzione sulla stessa istanza della configurazione Nginx. Questo si lavora , le sessioni sono persistenti come previsto.

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

Nella seconda configurazione, sto puntando a istanze esterne e sto cercando di ottenere lo stesso effetto. Questa configurazione non funziona . In altre parole, le sessioni sono ancora in fase di bilanciamento del carico.

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

Sto usando ip_hashcorrettamente? Come posso abilitare sessioni "sticky" basate su ip per server esterni?


Nginx ha installato "ngx_http_upstream_module"? Non so se è incluso di default o no. "nginx -V" di solito genera moduli con cui è costruito. Il mio (costruito dalla fonte) non lo menziona
Tim

Risposte:


7

Il mio server era dietro il bilanciamento del carico AWS, quindi dovevo passare le intestazioni corrette a monte in modo da riflettere sempre l'IP del client. La seguente configurazione ha risolto il mio problema (vedere la riga commentata):

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

7

Secondo la documentazione di Nginx, il supporto della sessione Sticky è disponibile solo per la loro costosa versione Plus. Ho cercato alternative e più sono stato vicino a questo vecchio fork che non è compatibile con Nginx 1.5+ https://github.com/lusis/nginx-sticky-module

Ho anche provato a costruire un modulo LUA ma non ci sono hook API per la selezione dei peer, solo per l'enumerazione e il blocco.

Bilanciamento del carico Nginx Plus

Aggiornare

Ho trovato un altro ottimo modulo, vedi https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/src


Sei in grado di collegarti a questa documentazione?
James Shewey,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.