Eu tenho várias perguntas sobre ssl, sessões locais e balanceamento de carga que parecem estar interconectados, então peço desculpas antecipadamente pela duração desta pergunta.
Eu tenho um site que usa sessões baseadas em arquivo. A natureza do site é que a maioria é http, mas algumas seções são ssl. Atualmente, devido às sessões baseadas em arquivo, é necessário que qualquer solicitação de SSL atinja o mesmo servidor que qualquer solicitação de HTTP anterior.
Devido a restrições de tempo, desejo fazer o mais fácil possível para equilibrar o carregamento do aumento do tráfego HTTP e SSL.
Parece haver duas opções para algoritmos de balanceamento de carga persistente:
- baseado em ip
- baseado em cookies
A solução baseada em IP provavelmente funcionará, mas o algoritmo de hash poderá alterar potencialmente o servidor ao qual um usuário acessa quando um servidor fica inativo ou é adicionado, o que é indesejável na configuração atual da sessão baseada em arquivo. Suponho também que seja tecnicamente possível para um usuário alterar legitimamente ips enquanto navega em um site.
O algoritmo baseado em cookies parece melhor, mas a incapacidade de inspecionar o cookie quando criptografado pelo SSL aparentemente apresenta seus próprios problemas.
Eu tenho pesquisado no Google por exemplos de como carregar o SSL de equilíbrio, e não consigo encontrar exemplos explícitos de configurações que possam fazer o balanceamento de carga baseado em cookie E que podem lidar com o aumento da carga de SSL adicionando outro decodificador de SSL.
A maioria dos exemplos explícitos que eu vi tem o decodificador ssl (geralmente hardware, apache_mod_ssl ou nginx) entre o cliente do navegador e o balanceador de carga. Os exemplos geralmente parecem ter algo assim (modificado em http://haproxy.1wt.eu/download/1.3/doc/architecture.txt ):
192.168.1.1 192.168.1.11-192.168.1.14 ------- + ----------- + ----- + ----- + ----- + | | | | | + - + - + + - + - + + - + - + + - + - + + - + - + | LB1 | A | B | C | D + ----- + + --- + + --- + + --- + + --- + servidores web apache 4 baratos mod_ssl haproxy
A parte de decodificação ssl no exemplo acima parece ser um gargalo em potencial que não é escalável horizontalmente.
Eu olhei para haproxy, e parece ter uma opção 'mode tcp' que permitiria algo assim, o que permitiria que você tivesse vários decodificadores ssl:
haproxy | ------------- | | decodificador-ssl-1 decodificador-ssl2 | | ------------------- | | | web1 web2 web3
No entanto, nessa configuração, parece que você perderia o IP do cliente porque o haproxy não está decodificando o ssl: https://cloud-support.engineyard.com/discussions/problems/335-haproxy-not-passing-x-forwarded -para
Também observei o nginx e também não vejo exemplos explícitos de decodificadores ssl horizontalmente escaláveis. Parece haver muitos exemplos de pessoas tendo o nginx como um gargalo em potencial. E pelo menos esse link parece sugerir que o nginx nem sequer tem a opção de configuração do tipo haproxy, onde você perderia o ip dizendo que o nginx "não suporta a passagem transparente de conexões TCP a um back-end" Como passar o Apache Tráfego SSL através do proxy nginx? .
Questões:
- Por que não parece haver mais exemplos de configurações adicionando mais decodificadores SSL para lidar com o aumento do tráfego?
- É porque a etapa de decodificação do SSL é apenas um gargalo teórico e, na prática, um decodificador será essencialmente suficiente, exceto em sites com tráfego ridículo?
- Outra solução possível que me vem à mente é que talvez alguém com essas necessidades de ssl aumentadas também tenha um armazenamento de sessão centralizado, portanto, não importa em qual servidor da Web o cliente acessa em solicitações sequenciais. Então você pode ativar o mod_ssl ou equivalente em todos os servidores da web.
- A solução haproxy citada acima parece funcionar (além do problema de IP do cliente), mas alguém encontrou uma solução de balanceador de carga de software baseada em cookie pegajoso que funcionaria aumentando o número de decodificadores enquanto mantinha o IP do cliente, ou talvez isso não seja tecnicamente possível (porque você precisa decodificar a solicitação para obter o IP do cliente; nesse caso, temos um gargalo no decodificador).
Supondo que tudo o que eu disse seja verdade, essas são as minhas opções:
- use hash ip (ruim para usuários que potencialmente alteram legitimamente ips e para cenários de adição e remoção de servidores)
- use nginx ou mod_ssl como o primeiro programa a tocar na solicitação ssl, este será um gargalo em potencial de decodificação ssl
- use haproxy como o primeiro programa a tocar na solicitação ssl, ganhando escalabilidade ssl horizontal, mas viva sem ips registrados no nível do servidor da web para solicitações ssl (provavelmente temporariamente ok)
- a longo prazo, vá para um armazenamento de sessão móvel ou centralizado, tornando desnecessárias as sessões persistentes