Sessões adesivas com proxy Nginx

6

Eu tenho um aplicativo que está sendo executado em duas instâncias diferentes da AWS e gostaria de ativar sessões "persistentes" ou "persistentes" com base no IP, para que eu possa aproveitar as tecnologias de soquete da Web de uma maneira específica.

Eu tenho duas configurações diferentes que envolvem o uso de ip_hash para ativar essas sessões fixas.

Na primeira configuração, os processos do aplicativo estão sendo executados na mesma instância da configuração do Nginx. Isso está funcionando , as sessões são persistentes conforme o esperado.

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

Na segunda configuração, estou apontando para instâncias externas e tentando obter o mesmo efeito. Esta configuração está não funcionando . Em outras palavras, as sessões ainda estão sendo balanceadas.

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

Estou usando ip_hash corretamente? Como posso ativar sessões baseadas em ip "fixas" para servidores externos?

    
por Himmel 15.02.2017 / 22:34

2 respostas

5

De acordo com a documentação do Nginx, o suporte à sessão aderente só está disponível para a sua cara versão Plus. Eu tenho pesquisado alternativas e quanto mais perto eu estive é este garfo velho que não é compatível com Nginx 1.5 + link

Eu também tentei criar um módulo LUA, mas não há ganchos de API para a seleção de pares, apenas para enumeração e bloqueio.

Balanceamento de carga Nginx Plus

Atualizar

Eu encontrei outro ótimo módulo, veja link

    
por 22.03.2017 / 20:55
3

Meu servidor estava por trás do balanceamento de carga do AWS, então eu precisava passar os cabeçalhos corretos para o upstream para que ele sempre refletisse o IP do cliente. A seguinte configuração corrigiu meu problema (veja a linha 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;
    }
}
    
por 16.02.2017 / 00:05