Apache SSL perdendo sessão por balanceador de carga

2

Eu tenho dois servidores Apache físicos por trás de um balanceador de carga. O balanceador de carga deveria ser configurado para que um usuário sempre fosse enviado para o mesmo servidor físico após a primeira solicitação, para preservar as sessões.

Isso funcionou bem para nossos aplicativos da web até que adicionamos o SSL à configuração. Agora, o usuário pode fazer login com sucesso, ver a página inicial, mas clicar em qualquer outro link interno faz o logout do usuário. Rastreei o problema até o fato de que, enquanto a autenticação inicial é executada pelo servidor 1, clicar em links internos leva a que a solicitação seja enviada ao servidor 2. O servidor 2 não compartilha sessões com o servidor 1 e o usuário é expulso.

Como posso corrigir isso?

Preciso compartilhar sessões entre os dois servidores? Se assim for, você poderia me indicar um bom guia para fazer isso?

Obrigado.

    
por SaltyNuts 16.03.2011 / 15:54

4 respostas

6

Se você deseja manter a viscosidade da sessão no balanceador de carga, é necessário encerrar o SSL no balanceador de carga. Isso significa que você precisa instalar o certificado SSL no balanceador de carga.

Outra solução é configurar o balanceador de carga para usar a rigidez do IP de origem para SSL (HTTPS).

Uma terceira solução seria manter as sessões em um banco de dados comum (por exemplo, memcached, banco de dados SQL). Para .NET, consulte: link Para ver o PHP: link

    
por 16.03.2011 / 16:03
2

Seu balanceador de carga provavelmente usa os dados do cabeçalho HTTP para determinar para qual caixa está enviando seus usuários (em vez de julgar pelo endereço IP).
[Se você puder nos informar que tipo de balanceador de carga usando informações úteis sobre como configurá-lo pode ir aqui: -)]

Além de reconfigurar seu balanceador de carga, convém considerar o compartilhamento de sessões entre os dois servidores. Você pode fazer isso por:

  1. Colocando as sessões em um compartilhamento NFS montado em ambos os servidores
    (Tradicional e bastante confiável, desde que o servidor NFS não desapareça).
  2. Se você estiver usando PHP, usando session_mysql, session_pgsql ou qualquer número de outros manipuladores de sessão disponíveis.
    (Tão confiável quanto a loja de apoio)

(A vantagem de compartilhar sessões é que seus servidores fornecem redundância contínua: se o servidor 1 estiver inativo para manutenção, o servidor 2 poderá selecionar todas as suas sessões sem forçar os usuários a efetuar login novamente)

    
por 16.03.2011 / 16:02
1

Parece (difícil dizer com certeza sem mais informações) que a persistência não é totalmente implementada na sua configuração do Apache para o balanceador de carga. Dê uma olhada na seção Stickyness do Load Balancer na documentação do Apache para mod_proxy_balancer .

The balancer supports stickyness. When a request is proxied to some back-end, then all following requests from the same user should be proxied to the same back-end. Many load balancers implement this feature via a table that maps client IP addresses to back-ends. This approach is transparent to clients and back-ends, but suffers from some problems: unequal load distribution if clients are themselves hidden behind proxies, stickyness errors when a client uses a dynamic IP address that changes during a session and loss of stickyness, if the mapping table overflows.

The module mod_proxy_balancer implements stickyness on top of two alternative means: cookies and URL encoding. Providing the cookie can be either done by the back-end or by the Apache web server itself. The URL encoding is usually done on the back-end.

A partir dessa documentação, está o seguinte exemplo:

Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<Proxy balancer://mycluster>
BalancerMember http://192.168.1.50:80 route=1
BalancerMember http://192.168.1.51:80 route=2
ProxySet stickysession=ROUTEID
</Proxy>
ProxyPass /test balancer://mycluster
    
por 16.03.2011 / 16:01
0

Você disse que o balanceador de carga foi configurado para continuar enviando o usuário para o mesmo servidor que a primeira solicitação - parece que ele não está funcionando no SSL, mas estava funcionando antes do SSL. Soa como um problema de configuração com o balanceador de carga; você é capaz de fornecer informações sobre o que é e como está configurado?

    
por 16.03.2011 / 15:59