Site icon RDR-IT

Nginx: configuração como proxy reverso

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:

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:

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:

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:

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.

Exit mobile version