Sessões persistentes com o proxy Nginx

10

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 tirar proveito das tecnologias de soquete da Web de uma maneira específica.

Eu tenho duas configurações diferentes que envolvem o uso ip_hashpara ativar essas sessões complicadas.

Na primeira configuração, os processos do aplicativo estão em execução na mesma instância que a 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 instalação, estou apontando para instâncias externas e tentando obter o mesmo efeito. Esta configuração não está 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_hashcorretamente? Como posso ativar sessões baseadas em IP "aderentes" para servidores externos?

Himmel
fonte
O seu Nginx tem o "ngx_http_upstream_module" instalado? Não sei se está incluído por padrão ou não. "nginx -V" normalmente gera módulos com os quais é construído. Mine (construída a partir da fonte) não mencioná-lo
Tim

Respostas:

7

Meu servidor estava atrás do balanceamento de carga da AWS, então eu precisava passar os cabeçalhos corretos para o upstream, para que sempre refletisse o IP do cliente. A seguinte configuração corrigiu meu problema (consulte 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;
    }
}
Himmel
fonte
7

De acordo com a documentação do Nginx, o suporte à sessão pegajosa está disponível apenas para a versão Plus cara. Pesquisei alternativas e, quanto mais perto estiver, esse garfo antigo não é compatível com o Nginx 1.5+ https://github.com/lusis/nginx-sticky-module

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

Balanceamento de carga Nginx Plus

Atualizar

Encontrei outro ótimo módulo, consulte https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/src

Mr. bug
fonte
Você é capaz de vincular a esta documentação?
James Shewey