Product
Atualização semanal de produto: dicas para configurar a terminação SSL no Cloud Load Balancers
Gostamos de manter você por dentro do que acontece na Mailgun todas as semanas, mas, às vezes, os projetos em que estamos trabalhando estão todos na fase de Pesquisa & Desenvolvimento e não temos muito para compartilhar. Isso aconteceu esta semana, então não temos grandes novidades para relatar. Mas isso não significa que não estivemos ocupados. Como os clientes da Mailgun são profissionais de desenvolvimento como nós, pensamos em compartilhar o que aprendemos realizando uma tarefa de manutenção comum: adicionar a terminação SSL aos nossos Cloud Load Balancers, que lidam com o tráfego do painel de controle e do site. Descobrimos algumas coisas interessantes, especialmente em relação ao desempenho, que podem ser úteis na sua própria aplicação. Se isso não for do seu interesse, não se preocupe, volte na próxima semana para mais novos recursos e melhorias.
Adicionar a terminação SSL ao Rackspace Cloud Load Balancers
Um requisito comum para provedores de SaaS (como a Mailgun e muitos dos nossos clientes) é o rastreamento das sessões pelo endereço IP. Ao passar o tráfego por um balanceador de carga, existem diferentes maneiras de garantir que o endereço IP original seja preservado. No passado, usávamos um balanceador de carga F5 que transmite uma variável $remoteaddr que usamos na nossa configuração do nginx. Essa variável era o endereço de um cliente obtido a partir das opções de soquete. Quando mudamos recentemente para o Rackspace Cloud Load Balancers para atender o tráfego do nosso site e do painel de controle, notamos que o Cloud Load Balancers fornece o IP do balanceador de carga para a $remoteaddr, em vez do endereço IP do cliente. Portanto, precisávamos de outra maneira de preservar essas informações.
O Cloud Load Balancers pode adicionar um cabeçalho X-Forwarded-For com o valor do IP do cliente, no entanto, essa opção não funciona com o SSL que usamos no nosso painel de controle. Por que não funcionaria? Simples. Para adicionar um cabeçalho ao arquivo enviado via SSL, o balanceador de carga precisa primeiro descriptografar o arquivo. Por padrão, um balanceador de carga não está equipado para fazer isso e o cabeçalho não é adicionado. Felizmente, o Cloud Load Balancers oferece uma opção de terminação SSL que permite descriptografar o tráfego SSL antes de passá-lo para os servidores de destino. Ele tem certas vantagens em relação à redução da carga nos servidores de aplicação. Para que funcione, você só precisa habilitar a terminação SSL no seu balanceador de carga e fornecer a ele uma chave privada e um certificado SSL.
Na verdade, esse é um exemplo muito legal de separação de responsabilidades. Em vez de ter todas as configurações relacionadas ao SSL nos seus arquivos de configuração do servidor, você as coloca no balanceador de carga e simplesmente funciona.
Uma coisa importante que você deve ter em mente é que, depois de habilitar a terminação SSL, todo o tráfego HTTPS que passa pelo balanceador de carga se tornará HTTP. Parece óbvio, mas é muito comum esquecer esse pequeno detalhe. Nós mesmos nos deparamos com esse problema ao testarmos no nosso ambiente de homologação. A solução é usar o cabeçalho X-Forwarded-Proto, que o balanceador de carga define como “https” para o tráfego HTTPS. Aqui está um bom exemplo de como fazer isso no nginx.
Um resultado de desempenho surpreendente ao usar a terminação SSL
Antes de implementarmos a mudança, queríamos ter certeza de que o desempenho não seria prejudicado com o uso da terminação SSL. Para verificar isso, executamos alguns testes de desempenho no nosso ambiente de homologação e obtivemos alguns resultados inesperados: em média, os balanceadores de carga com terminação SSL apresentaram um desempenho melhor do que os balanceadores de carga sem ela.
Para executar o teste, realizamos um GET em três URLs diferentes:
GET /cpGET /cp/logGET /cp/domains[/list]
Cada GET recuperou páginas HTML com e sem todos os recursos incorporados, ou seja, analisou o arquivo HTML e enviou solicitações HTTP/HTTPS para todas as imagens, miniaplicativos Java, arquivos JavaScript, CSSs, etc. referenciados no arquivo.
Embora tenha havido uma instância em que o desempenho com SSL foi mais lento, em média, o desempenho foi surpreendentemente melhor: reduzindo o tempo de carregamento médio de 3.957 milissegundos para 3.811 milissegundos, uma redução de 3,7%. Nada mal, considerando que a terminação SSL adiciona etapas ao processo de transferência de um arquivo do cliente para o servidor e vice-versa.
Por esta semana é só. Esperamos que, da próxima vez que você precisar adicionar a terminação SSL aos seus balanceadores de carga, ache essas informações úteis. Até a próxima semana.
Bons envios,
Os Mailgunners