Neste tutorial dedicado ao Nginx, explicarei como configurá-lo para ter um proxy reverso.
Antes de ir ao cerne da questão, apresentarei rapidamente o Nginx e o que é um proxy reverso.
Para este tutorial, usei uma máquina Ubuntu 20.04.
Visão geral do Nginx
Nginx é um servidor web como Apache2 ou IIS que tem a “filosofia” de ser leve e rápido. Está disponível em vários sistemas operacionais (Windows, Linux, etc.).
Hoje existem duas versões:
- Uma versão comunitária de código aberto e gratuita disponível aqui : nginx.org
- Uma versão comercial que inclui recursos avançados de configuração, segurança e administração disponíveis em nginx.com.
O Nginx “nativamente” permite que você configure uma solução de proxy reverso, em seus primeiros dias o Nginx era usado principalmente para isso.
O que é um proxy reverso? e por que usar um?
Um proxy reverso funciona da mesma forma que um proxy interno para acessar a Internet, mas na direção oposta, ou seja, ele captura a solicitação HTTP ao servidor Web da Internet e a processa ele mesmo.
Usar um proxy reverso tem vários benefícios:
- Salvar endereços IP públicos: no mesmo endereço IP público é possível publicar vários sites hospedados em um ou mais servidores na DMZ, por exemplo.
- Para otimizar o desempenho e reduzir a carga nos servidores Web, o servidor proxy pode atuar como cache para a quantidade de solicitações ao servidor que hospeda o site, para sites com alto tráfego também pode ser utilizado como descarregamento SSL.
- Facilite o gerenciamento de certificados SSL, utilizando o offload SSL e gerenciando os certificados a partir do proxy reverso, há apenas um servidor para gerenciar, o que economiza tempo e evita descuidos na hora de renovar um certificado.
- Segurança, que também é uma das principais vantagens, pois permite modificar o cabeçalho HTTP ocultando o servidor atrás dele, aliada ao uso de fail2ban ou crowdsec, você pode proteger todos os servidores publicados. Também é possível, através de diretivas de localização, restringir o acesso a determinadas áreas (/wp-admin para WordPress, acesso PowerShell para Exchange, etc.).
- Distribuição de carga, Nginx permite fazer balanceamento de carga.
Instalando o Nginx
Para ter a versão mais recente do Nginx, é possível configurar o repositório nginx.org
Neste tutorial utilizarei o repositório Ubuntu para ter o pacote nginx-extras, que instala diversos add-ons que veremos neste tutorial.
Na pasta /etc/apt/sources.list.d/ crie um arquivo nginx.list.
sudo touch /etc/apt/sources.list.d/nginx.list
Em seguida, edite o arquivo usando nano (ou outro).
sudo nano /etc/apt/sources.list.d/nginx.list
Adicione as linhas abaixo nele:
deb [arch=amd64] http://nginx.org/packages/mainline/ubuntu/ focal nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ focal nginx
Agora, execute as 2 linhas a seguir para instalar a assinatura do repositório:
wget http://nginx.org/keys/nginx_signing.key
sudo apt-key add nginx_signing.key
Atualize a linha do pacote:
sudo apt update
Na captura de tela acima, vemos que os repositórios Nginx foram consultados.
Agora podemos prosseguir com a instalação do Nginx.
Digite o comando abaixo para instalar o Nginx
sudo apt install nginx nginx-extras
Assim que a instalação for concluída, verifique se o Nginx está funcionando corretamente:
sudo systemctl status nginx
Também é possível, a partir de um navegador, acessar o endereço: http://server-ip. A página de boas-vindas do Nginx deve ser exibida.
Além disso, também é possível instalar o certbot para Nginx para gerar certificados Let’s Encrypt.
sudo apt install python3-certbot-nginx
Nosso servidor agora está pronto, podemos prosseguir com a configuração de nossos diferentes hosts virtuais como proxy reverso.
Configurando o Nginx como proxy reverso
Como você certamente já entendeu, o objetivo aqui não é usar as funcionalidades de proxy reverso do Nginx para servir sites que seriam hospedados no próprio servidor usando um container ou outro servidor Web (Apache, Tomcat…), mas sim servir sites (aplicativos) hospedados em outro servidor.
Em certos casos, podemos ter um problema de registro de DNS, principalmente quando o servidor localizado após o proxy usa virtualhosts e existe um registro e posteriormente apontará para o proxy reverso, encontramos esta configuração principalmente quando o proxy reverso deve resolver a url e aponta para isso.
Para resolver esse problema, codificaremos a resolução correta no servidor proxy no arquivo /etc/hosts, para obter este resultado:
Para adicionar uma gravação abra o arquivo com nano (ou outro).
sudo nano /etc/hosts
Em seguida, adicione a gravação no formato:
ip_adr dns_record
Agora que esse problema foi resolvido, veremos como configurar nosso proxy reverso com Nginx.
Proxy reverso Nginx: configuração “padrão”
Para ilustrar este primeiro tutorial, enviaremos tráfego para um servidor IIS simples, usaremos o nome DNS rproxy.rdr-it.com
Crie um arquivo de configuração para o virtualhost
sudo touch /etc/nginx/sites-available/rproxy-rdr-it-io
Abra o arquivo que você acabou de criar:
sudo nano /etc/nginx/sites-available/rproxy-rdr-it-io
Cole a configuração abaixo (cada linha é comentada):
Devemos agora adicionar um link simbólico para ativar nossa configuração:
sudo ln -s /etc/nginx/sites-available/rproxy-rdr-it-io /etc/nginx/sites-enabled
Teste a configuração do Nginx:
sudo nginx -t
Se tudo estiver OK, recarregue a configuração:
sudo systemctl reload nginx
Essa é a hora de testar, primeiro você precisa ter certeza de que seu registro DNS (url) aponta para o proxy reverso. 😉
Em um navegador, exibi a página IIS do meu servidor:
Você também pode ver o tráfego nos logs do Nginx (access.log).
Antes de passar para o próximo passo, sugiro uma pequena melhoria em nosso virtualhost, vamos separar os logs de acesso em um arquivo separado adicionando o seguinte código:
access_log /var/log/nginx/rproxy-rdr-it-io_access.log;
O que dá no arquivo virtualhost:
Em seguida, recarregue a configuração do Nginx.
O arquivo de log está presente no servidor, faça uma consulta para ver se tudo funciona.
Agora você sabe como configurar o virtualhost no modo proxy reverso com Nginx.
Proxy reverso Nginx: configuração de reescrita/substituição
Passaremos agora para uma configuração onde reescreveremos o código HTML que é retornado ao navegador.
Esta modificação é possível com o módulo: Módulo de Filtro HTTP Subs.
Este tipo de configuração é utilizado regularmente quando publicamos aplicações interna e externamente (na Internet) e a aplicação é configurada com uma URL interna e portanto inacessível pela Internet. Também utilizamos este módulo para alterar a porta de publicação de uma aplicação, por exemplo determinada aplicação (Tomcat) utiliza a porta 8080, a reescrita permite que o serviço seja publicado em uma porta padrão 80/443.
Para verificar se o módulo está presente, visualize o conteúdo da pasta /etc/nginx/modules-enabled/ e verifique se o link simbólico 50-mod-http-subs-filter.conf está presente.
Não vou abordar a criação do virtualhost, isso já foi abordado antes.
Nesta parte, vou mostrar dois exemplos:
- Um simples sobre código HTML
- O segundo no WordPress
Exemplo 1
Para este primeiro exemplo, testaremos com uma simples reescrita (substituição) em um arquivo HTML (index.html).
Como podemos ver na imagem abaixo, vamos trabalhar no domínio rdr-it.lan que só está disponível em uma rede privada e agora queremos que seja publicado na Internet como rdr-it.fr.
Aqui está o arquivo index.html:
Podemos ver que o URL rdr-it.lan é codificado duas vezes.
Abaixo, os arquivos (index.html e imagem):
Aqui está o resultado do acesso interno.
Mostrarei agora a configuração que permitirá modificar rdr-it.lan para rdr-it.fr para poder publicar o site na Internet.
Aqui está o arquivo de configuração do virtualhost:
Assim que a configuração for adicionada, crie o link simbólico, verifique a configuração e recarregue a configuração do Nginx.
Em um navegador, acesse a URL acessível pela Internet, normalmente tudo deve ser exibido corretamente.
Podemos ver abaixo que o código foi reescrito com a URL correta.
Exemplo 2
Neste segundo exemplo de reescrita de conteúdo HTML farei isso com um site WordPress, como veremos mais adiante, a configuração do virtualhost é um pouco mais complicada e usamos RegEx para modificar o conteúdo.
Nas capturas de tela abaixo, uma visão geral do site WordPress:
Crie o arquivo virtualhost e copie a configuração abaixo, adaptando à sua configuração.
Aqui estão algumas capturas:
- Administração WordPres onde podemos ver que a url (config) é alterada dinamicamente
- Configuração no banco de dados com a URL original: wp.rdr-it.lan
- Captura da solicitação HTTP onde podemos ver que estamos passando pelo Nginx e não pelo LiteSpeed
- Uma visão geral dos registros
Proxy reverso com balanceamento de carga
Para finalizar este tutorial, apresentarei uma configuração de proxy reverso Nginx com balanceamento de carga.
Na declaração de servidores no bloco upstream é possível indicar um peso (preferência),
upstream ServersWebPool{
# Declare each server
server srv-web-01 weight=3;
server srv-web-02;
}
No exemplo acima, para 4 solicitações HTTP, 3 solicitações irão para srv-web-01 e uma solicitação para srv-web-02.
O último elemento que pode ser configurado é a disponibilidade do serviço:
upstream ServersWebPool{
# Declare each server
server srv-web-01 max_fails=3 fail_timeout=60s;
server srv-web-02;
}
No exemplo acima, após 3 falhas no servidor srv-web-01, ele será considerado indisponível por 60 segundos
Por padrão, o valor max_fails é igual a 1 e fail_timeout é igual a 10 segundos.
Agora você sabe como configurar o Nginx como proxy reverso e reescrever (substituir) o conteúdo HTML para corresponder ao URL da solicitação caso o HTML não use links absolutos.