Sesiones fijas con proxy Nginx

10

Tengo una aplicación que se ejecuta en dos instancias diferentes de AWS y me gustaría habilitar sesiones "permanentes" o "persistentes" basadas en IP para poder aprovechar las tecnologías de socket web de una manera particular.

Tengo dos configuraciones diferentes que ambas implican usar ip_hashpara habilitar estas sesiones fijas.

En la primera configuración, los procesos de la aplicación se ejecutan en la misma instancia que la configuración de Nginx. Esto está funcionando , las sesiones son persistentes como se esperaba.

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

En la segunda configuración, estoy apuntando a instancias externas y tratando de lograr el mismo efecto. Esta configuración no funciona . En otras palabras, las sesiones todavía están siendo balanceadas en carga.

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

¿Estoy usando ip_hashcorrectamente? ¿Cómo puedo habilitar sesiones "fijas" basadas en IP para servidores externos?

Himmel
fuente
¿Su Nginx tiene instalado "ngx_http_upstream_module"? No sé si está incluido por defecto o no. "nginx -V" generalmente genera módulos con los que está construido. El mío (construido a partir de la fuente) no lo menciona
Tim

Respuestas:

7

Mi servidor estaba detrás del equilibrio de carga de AWS, por lo que necesitaba pasar los encabezados correctos a la parte superior para que siempre reflejara la IP del cliente. La siguiente configuración solucionó mi problema (vea la línea comentada):

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
fuente
7

De acuerdo con la documentación de Nginx, el soporte de sesión fija solo está disponible para su costosa versión Plus. He estado investigando alternativas y cuanto más cerca he estado es este viejo tenedor que no es compatible con Nginx 1.5+ https://github.com/lusis/nginx-sticky-module

También he intentado construir un módulo LUA pero no hay enlaces API para la selección por pares, solo para enumeración y bloqueo.

Equilibrio de carga Nginx Plus

Actualizar

He encontrado otro gran módulo, consulte https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/src

Bicho
fuente
¿Puede vincular a esta documentación?
James Shewey