Segurança, escalabilidade, performance, são preocupações de muitos desenvolvedores. Geralmente nós, desenvolvedores, pensamos em soluções mirabolantes para apaziguar tais preocupações . O que poucos utilizam e que, na maioria dos casos, resolveria diversos problemas seria a implementação de um proxy reverso. Sua implementação é simples e independente do seu web server. Um proxy reverso é um proxy que estão instalados em um servidor ou equipamento de rede e que geralmente são servidores web (web servers).
Proxy Reverso nada mais é do que um servidor "burro" que apenas recebe requisições e delega as mesmas ou então faz algo simples,como devolver uma página pré processada, mas ele é "burro" não sabe executar aquela requisição por completo, ele é um proxy não é o servidor de verdade . Veja a imagem abaixo:
Fonte: http://www.codeproject.com/KB/web-security/HTTPReverseProxy/reverse-proxy.png
O HttpProxy seria o proxy reverso que é a "porta de entrada" das minha requisições e o web server é onde efetivamente contém sua aplicação. Vou fazer uma analogia com o mundo real para que se ter uma idéia melhor de quanto utilizar um proxy: Você já foi a uma loja de celulares bastante cheia e teve que pegar uma senha certo? Essa senha serve como uma"porta de entrada", você deseja fazer alguma coisa (requisição) então você não vai direto no atendente (web server) você primeiro vai até aquelas máquinas de gerar senha (proxy reverso) e só depois vai ao atendente. As vezes existe um pseudo atendente (cache) perto das máquinas de senha, esse pseudo atendente dependendo do que você deseja já pode lhe dar uma resposta, não sendo necessário ir até o atendente.
Imagine se não houvesse essa máquina de senha e minha loja de celulares ficasse lotada, seria uma tremenda bagunça, não saberia quem chegou primeiro, eu até poderia fazer uma fila certo? Mas, mesmo assim, as pessoas que chegaram apenas para pedir uma informação (que o meu pseudo atendente poderia dar) teriam que ficar esperando 2 horas na fila, o que não é legal certo?
Trazendo isso para o mundo de software, se você tivesse essa pessoa que desse as senhas para a requisição não seria muito mais organizado ? É exatamente isso que um proxy reverso vem oferecer, uma "porta de entrada" para sua aplicação.
Entendido o que é o "proxy reverso" vamos ver alguns de seus benefícios:
Segurança
Se você tem uma camada antes de chegar ao seu servidor, você pode incluir um firewall ou algo do gênero para verificar se tal requisição é ou não segura o suficiente para chegar ao ser web server. Outro benefício é que o seu proxy reverso é isolado do seu web server, assegurando que a requisição não sabe para onde ela vai a seguir.
Balanceamento de Carga (Escalabilidade e disponibilidade)
Um proxy reverso é inteligente o suficiente para fazer o que chamamos de Balanceamento de Carga isso. Imagine que você possui diversos web servers rodando a mesma aplicação e você deseja distribuir as requisições para aquele servidor web que não está ocupado. Um proxy reverso fica responsável por essa delegação. Ou seja uma requisição chega ao Proxy Reverso e ele sabe para qual servidor enviar ela.
Com o uso do proxy reverso com load balance caso um servidor web trave nosso sistema ainda ficará disponível para outros usuários visto que, o que irá acontecer é que o proxy reverso irá delegar para um web server disponível garantindo disponibilidade. Outra coisa interessante é a escalabilidade, caso meu sistema agora receba 1 milhão de requisições ao invés de 100 mil basta eu adicionar um novo servidor por trás do proxy reverso que ele poderá receber as requisições (claro que isso vai depender da sua arquitetura e do seu Banco de Dados).
Cache
Como eu disse na minha analogia, você pode colocar um cache no seu proxy reverso, para que, caso a requisição que ele devolva não necessite de nenhum processamento no web server, o próprio proxy já devolva a resposta, aumentando a performance da sua aplicação.
Estes foram apenas alguns benefícios porém existem outros como por exemplo compressão de arquivos, você pode comprimir a requisição de alguma forma para que quando ela chegue no web server ela fique menor, ou então criptografar ela, existem várias brincadeiras possíveis para se fazer com um proxy reverso.
Como eu disse no inicio pense simples, instalar um proxy reverso é simples e pode resolver diversos dos seus problemas, mas sempre tenha em mente que não existe "bala de prata", então essa não será a solução para todos os seus problemas. Além disso também devemos tomar alguns cuidados, como por exemplo garantir a disponibilidade do servidor onde o proxy reverso está instalado, e também verificar se o seu banco de dados aguenta a quantidade de requisições, entre outras preocupações.
Existem diversos proxy reversos dentre eles temos: Perlbal, Pound, Squid, Stunnel, Varnish, HAProxy, entre outros.
E você leitor qual sua experiência com Proxy Reverso? Você teria alguma sugestão a fazer para quem deseja começar a utilizar um proxy no seu web server?