Utilizando Nginx como proxy reverso para otimizar sua aplicação

Em sistemas escaláveis, é importante manter uma infraestrutura adequada, de maneira que a aplicação possa suportar grandes quantidades de acesso. O aumento da capacidade do hardware pode se tornar inevitável, entretanto, é interessante avaliar se não há outras alternativas, como por exemplo, a modificação da arquitetura existente. Neste post, veremos como a utilização de um proxy reverso, nos ajuda a gerenciar os recursos de um servidor, para que possam ser aproveitados de melhor maneira, aumentando assim sua performance e segurança.

Proxy Reverso

Em primeiro lugar, precisamos entender do que se trata um proxy reverso. Um proxy reverso é um servidor de rede geralmente instalado para ficar na frente de um servidor Web. Todas as conexões originadas externamente são endereçadas para um dos servidores Web através de um roteamento feito pelo servidor proxy, que pode tratar ele mesmo a requisição ou encaminhar a requisição toda ou parcialmente a um servidor Web, que tratará dela.

Um proxy reverso repassa o tráfego de rede recebido para um ou mais servidores, tornando-o a única interface para as requisições externas. Por exemplo, um proxy reverso pode ser usado para balancear a carga de um cluster de servidores Web. O que é exatamente o oposto de um proxy convencional, que age como um despachante para o tráfego de saída de uma rede, representando as requisições dos clientes internos para os servidores externos à rede a qual o servidor proxy atende.

Configurando

É importante conhecer bem a sua atual infraestrutura de servidores, pois a configuração irá variar de ambiente para ambiente. No caso aqui apresentado, será utilizado o Nginx como proxy reverso para um servidor web, apache.

Para começar, será necessário realizar a instalação o Nginx. No sistema operacional ubuntu 18.04, é possível o fazer executando os seguintes comandos:

sudo apt-get update

sudo apt-get install nginx

 

Caso você seja usuário do docker, dentro do  meu repositório, eu disponibilizei um arquivo para configuração inicial dos serviços. Ele se encontra aqui:

https://github.com/goodeath/absamPosts/tree/master/proxy-reverso.

Basta alterá-lo de maneira que se adeque ao seu ambiente, quer seja de desenvolvimento ou em produção.

Uma vez que o nginx esteja instalado, você pode checar o status do serviço utilizando o seguinte comando:

 service nginx status

O mesmo deve retornar uma mensagem:

 

Ao acessar o navegador e digitar o endereço(domínio ou ip) em que o servidor foi instalado, a tela inicial do nginx deverá estar visível:

Como o Nginx vai ser a porta de entrada para os nossos serviços, é necessário que o mesmo fique alocado na porta 80 (por padrão ele é configurado nessa porta durante a instalação) do seu servidor, que é a mesma porta padrão de acesso às páginas web. Consequentemente seu servidor web, caso esteja no mesmo endereço de ip, entrará em conflito e então precisará ter sua porta de acesso alterada. Basta escolher qualquer porta que não seja destinada a nenhum outro serviço. Você pode conferir o conjunto de portas reservadas neste link:

https://pt.wikipedia.org/wiki/Lista_de_portas_dos_protocolos_TCP_e_UDP.

É aconselhável que, mesmo que os servidores estejam em endereços de ip diferentes, seja alterada a porta, pois torna o seu servidor menos visível para acessos externos.

Vamos fazer com que nosso nginx, faça o redirecionamento para o nosso servidor apache. Abra o arquivo /etc/nginx/conf.d/default.conf e altere o location para que ele se pareça mais com este:

Onde temos http://173.20.0.2 alterar para o endereço de ip do seu servidor. e execute o comando:

service nginx reload

Caso não haja nenhum erro após executar o comando, ao acessar o mesmo endereço, verá que não aparece mais a tela inicial do Nginx mas sim a do seu servidor. Além disso,  é possível modificar as configurações de forma que o Nginx possa servir diretamente os arquivos estáticos como html, css e javascript tornando a resposta mais rápida. Todas as requisições dinâmicas tais como as realizadas para servidores php, python, nodejs, outras apis, podem ser encaminhadas para os seus respectivos servidores, devidamente processadas e retornadas.

Vantagens

  • Como existe uma camada a mais entre o cliente e a sua aplicação, ela adquire uma “camuflagem”, não sendo diretamente visível por quem acessa externamente.
  • É simples de implementar e proporcionar ao usuário segurança de ponta contra ataques a servidores web como DDoS e DoS
  • O Proxy Reverso Nginx ajuda a criar uma carga equilibrada entre vários servidores back-end e proporciona cache para um servidor back-end mais lento
  • O Nginx não exige a configuração de um novo processo para cada nova solicitação da web vinda do cliente. Ao invés disso, a configuração padrão é para incluir apenas um processo de trabalho por CPU
  • Pode agir como um servidor Proxy Reverso para vários protocolos como HTTP, HTTPS, TCP, UDP, SMTP, IMAP e POP3
  • Ele pode operar mais de 10000 conexões com uma pequena pegada de memória. O Nginx pode operar múltiplos servidores da internet através de um único endereço de IP e entregar cada solicitação para o servidor dentro de uma LAN
  • O Nginx é um dos melhores servidores da web para melhorar o desempenho de conteúdo estático. Adicionalmente, pode ser útil servir conteúdo em cache e executar criptografia SSL para diminuir a carga do servidor
  • Pode ser útil na hora de otimizar conteúdos ao comprimi-los para melhorar o tempo de carregamento
  • O Nginx pode executar experimentos aleatórios ou testes A/B sem posicionar códigos JavaScript nas páginas.

Conclusão

Como toda e qualquer outra técnica ela precisa ser aplicada de maneira correta. Dentro de uma aplicação com 100 requisições por minuto e outra com 10 mil, a visibilidade do ganho de performance, é bem diferente, apesar de continuar existindo. Ao querer expor novos serviços, ganhamos uma simplicidade no processo, pois, basta que os mesmos sejam configurados e posteriormente alterar as configurações no proxy reverso de forma que os tornem visíveis, oferecendo assim um controle centralizado e performático.