Configuração de proxy reverso

LinuxBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá a configurar o Nginx como um proxy reverso.

Pense em um proxy reverso como a recepcionista de uma grande empresa. Quando você liga para o número principal, não fala diretamente com o CEO nem com a equipe de suporte. Você fala com a recepcionista, que pergunta “Como posso ajudar?” e transfere sua ligação para a pessoa certa.

Neste cenário:

  • Nginx é a recepcionista (escutando na porta 80).
  • Aplicação Python é a “equipe de suporte” (escutando na porta 8000).
  • Você é o cliente que está ligando.

Você configurará o Nginx para que, quando alguém solicitar /app, ele encaminhe a solicitação para um servidor Python e devolva a resposta ao cliente.

Os proxies reversos são fundamentais na arquitetura web moderna. Eles ficam na frente dos servidores de aplicações para fornecer um ponto de entrada público estável. Também podem cuidar da terminação de TLS, do balanceamento de carga, do cache e do roteamento de solicitações.

Isso significa que o Nginx nem sempre serve arquivos diretamente. Às vezes, sua principal função é receber o tráfego dos clientes e encaminhá-lo para outro serviço que está atrás dele.

Iniciar uma aplicação de backend

Primeiro, precisamos de algo para receber as solicitações encaminhadas. Vamos criar uma aplicação web muito simples usando Python.

Criaremos uma pasta específica para que nossa aplicação sirva arquivos a partir dela.

Crie uma pasta chamada app dentro do diretório do projeto e crie um arquivo HTML simples dentro dela:

mkdir -p ~/project/app
echo "Hello from the Python Backend." > ~/project/app/index.html

Agora, vamos iniciar o servidor Python. Este comando instrui o Python a atuar como um servidor web, servindo os arquivos do diretório atual na porta 8000.

Neste exemplo, esse processo do Python é o servidor de aplicações de backend. Ele cuidará da geração do conteúdo, enquanto o Nginx ficará na frente como ponto de entrada público.

Adicionamos o símbolo & ao final do comando para executá-lo em segundo plano. Assim, você pode continuar usando o terminal enquanto o servidor é executado silenciosamente.

cd ~/project
python3 -m http.server 8000 &

Vamos verificar se ele foi iniciado corretamente. Procuraremos um processo escutando na porta 8000:

netstat -tuln | grep 8000

Você deverá ver uma saída contendo 0.0.0.0:8000 (LISTEN). Isso significa que nossa “aplicação de backend” está pronta para receber solicitações na extensão 8000.

Configurar o proxy reverso do Nginx

Nesta etapa, você modificará o arquivo de configuração do Nginx para informar ao serviço sobre nossa aplicação Python.

Precisamos editar o arquivo de configuração padrão usando sudo e o editor de texto nano.

sudo nano /etc/nginx/sites-enabled/default

Role para baixo dentro do bloco server { ... }. Você verá um bloco location / { ... } existente. Precisamos adicionar um novo bloco location /app abaixo dele.

Adicione o código a seguir ao arquivo. Tenha cuidado com as chaves { } e com o ponto e vírgula ;:

    location /app {
        proxy_pass http://127.0.0.1:8000;
    }

O que isso faz?

  • location /app: informa ao Nginx para observar as solicitações que começam com /app.
  • proxy_pass ...: funciona como o botão de transferência da ligação. Ele informa ao Nginx: “Quando você receber uma solicitação para /app, encaminhe-a para localhost (127.0.0.1) na porta 8000”.

Esse encaminhamento é a essência de um proxy reverso. O cliente se comunica com o Nginx, mas o Nginx se torna um cliente do servidor de backend em nome do usuário.

A estrutura do seu arquivo deverá ser semelhante a esta:

server {
    listen 80 default_server;
    ...
    location / {
        try_files $uri $uri/ =404;
    }

    location /app {
        proxy_pass http://127.0.0.1:8000;
    }
}

Pressione Ctrl+O e depois Enter para salvar o arquivo. Em seguida, pressione Ctrl+X para sair do nano.

Validar e recarregar

Atualizamos o arquivo de configuração, mas o Nginx ainda está usando as regras antigas. Precisamos recarregar o serviço.

Primeiro, sempre teste sua configuração para verificar se há erros de digitação antes de recarregar. Se você recarregar uma configuração inválida, o servidor web poderá parar de funcionar completamente.

Execute o comando de teste:

sudo nginx -t

Você deverá ver:

syntax is ok
test is successful

Se o teste for aprovado, recarregue o Nginx para aplicar as alterações:

sudo service nginx reload

Agora o Nginx atualizou suas instruções e está pronto para encaminhar solicitações.

Neste ponto, o Nginx está atuando como um roteador entre URLs e serviços de backend, e não apenas como um servidor de arquivos que lê dados do disco.

Testar o proxy

Nesta etapa final, verificaremos se nossa “recepcionista” está cumprindo corretamente sua função.

Enviaremos uma solicitação web ao Nginx (porta 80), pedindo /app/. O Nginx deverá encaminhá-la imediatamente para o servidor Python (porta 8000).

Execute o comando a seguir:

curl http://localhost/app/

Você deverá ver a mensagem do nosso servidor de backend:

Hello from the Python Backend.

O que aconteceu?

  1. Você solicitou /app/ ao Nginx (localhost:80).
  2. O Nginx verificou suas regras, encontrou a correspondência com /app e seguiu a instrução proxy_pass.
  3. O Nginx chamou o servidor Python na porta 8000.
  4. O servidor Python devolveu a página “Hello...” ao Nginx.
  5. O Nginx devolveu a página “Hello...” para você.

Vale a pena memorizar essa cadeia de solicitações, pois ela aparece em toda a infraestrutura moderna: navegador -> proxy reverso -> servidor de aplicações -> proxy reverso -> navegador.

Você criou um proxy reverso com sucesso!

Resumo

Neste laboratório, você configurou o Nginx como um proxy reverso com sucesso. Você aprendeu a:

  1. Hospedar uma aplicação de backend simples usando Python.
  2. Configurar o Nginx com um bloco location para fazer o roteamento.
  3. Encaminhar o tráfego usando a diretiva proxy_pass.
  4. Verificar a cadeia do proxy usando curl.

Essa arquitetura é a base das aplicações web modernas. Ela permite usar o Nginx para segurança e balanceamento de carga, enquanto outras aplicações cuidam da lógica em segundo plano.