Passo a passo: proxy reverso no Apache para Node.js com SSL

Por Equipe Técnica AviraHost · 11 min de leitura · Atualizado em · Apache, Node.js, Proxy Reverso, SSL, Debian 13, AviraHost · 0

Passo a passo: proxy reverso no Apache para Node.js com SSL é uma configuração de infraestrutura onde o servidor web Apache atua como um intermediário, recebendo conexões externas criptografadas (HTTPS) e encaminhando-as para uma aplicação Node.js que processa as requisições em uma porta interna. Para implementar essa solução com segurança, siga estes passos:

  1. Habilite os módulos de proxy e SSL no servidor Apache.
  2. Configure o VirtualHost na porta 80 para redirecionar o tráfego para HTTPS.
  3. Crie um VirtualHost na porta 443 definindo as diretivas ProxyPass e ProxyPassReverse.
  4. Instale e configure o certificado SSL (Let's Encrypt) para garantir a criptografia.
  5. Reinicie o serviço do Apache e valide a conectividade com a aplicação Node.js.

Pré-requisitos para a configuração

Antes de iniciar o procedimento técnico, é fundamental garantir que o ambiente de hospedagem esteja devidamente preparado. A utilização de um proxy reverso é uma prática recomendada para isolar a aplicação Node.js da exposição direta à internet, permitindo que o Apache gerencie tarefas pesadas como a terminação SSL e a compressão de dados.

  • Servidor rodando Debian 13 ou Ubuntu 24.04 com acesso root ou privilégios sudo.
  • Aplicação Node.js instalada e rodando em uma porta local (exemplo: 3000).
  • Domínio ou subdomínio apontado corretamente para o endereço IP do servidor via registros A no DNS.
  • Apache 2.4+ instalado e operacional.
  • Gerenciador de processos PM2 configurado para manter a aplicação Node.js ativa.

Habilitando os módulos necessários no Apache

O Apache é um servidor modular, o que significa que as funções de proxy e suporte a SSL não vêm ativadas por padrão em todas as instalações. O primeiro passo é ativar o mod_proxy, que fornece a funcionalidade principal de proxy, e o mod_proxy_http, que estende essa capacidade para suportar o protocolo HTTP/HTTPS utilizado pelo Node.js.

Além desses, o mod_ssl é obrigatório para a criptografia e o mod_headers é altamente recomendado para que possamos manipular cabeçalhos HTTP, garantindo que a aplicação Node.js receba o IP real do visitante. Execute os comandos abaixo para ativar os módulos:

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_balancer
sudo a2enmod lbmethod_byrequests
sudo a2enmod ssl
sudo a2enmod headers
sudo systemctl restart apache2

Output esperado: O sistema deve retornar mensagens confirmando a ativação dos módulos (Enabling module proxy, etc.) e solicitar o reinício do serviço. Para verificar se os módulos estão carregados, você pode usar o comando apache2ctl -M | grep proxy.

Configurando o VirtualHost para o proxy reverso

A configuração do VirtualHost é onde definimos como o Apache deve tratar as requisições que chegam para o seu domínio. Diferente de uma hospedagem estática, aqui não apontamos para um diretório de arquivos, mas sim para o endereço local da aplicação. É essencial configurar o ProxyPreserveHost On, para que o Node.js saiba qual domínio está sendo acessado, o que é vital para aplicações que gerenciam múltiplos domínios ou rotas dinâmicas.

Crie um novo arquivo de configuração em /etc/apache2/sites-available/seudominio.conf e adicione a estrutura básica abaixo, que trata o redirecionamento de HTTP para HTTPS e a ponte para o backend:

<VirtualHost *:80>
    ServerName seudominio.com.br
    Redirect permanent / https://seudominio.com.br/
</VirtualHost>

<VirtualHost *:443>
    ServerName seudominio.com.br

    SSLEngine on
    # Os caminhos abaixo serão preenchidos pelo Certbot posteriormente
    SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
    SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:3000/
    ProxyPassReverse / http://127.0.0.1:3000/

    RequestHeader set X-Forwarded-Proto "https"
    RequestHeader set X-Forwarded-Port "443"

    ErrorLog ${APACHE_LOG_DIR}/node_error.log
    CustomLog ${APACHE_LOG_DIR}/node_access.log combined
</VirtualHost>

Nesta configuração, as diretivas ProxyPass e ProxyPassReverse garantem que todas as requisições enviadas para a raiz do domínio sejam encaminhadas para a porta 3000. Se você tiver dúvidas sobre como acessar seu servidor para realizar essas edições, consulte nosso guia sobre Acessando servidores VPS Linux da AviraHost.

Implementando SSL com Let's Encrypt e Certbot

Para que o SSL funcione corretamente sem quebrar o proxy reverso, a terminação TLS deve ocorrer no Apache. Isso significa que o Apache descriptografa a requisição HTTPS e a envia como HTTP puro para o Node.js através da interface de loopback (127.0.0.1), que é segura por ser interna ao servidor. A ferramenta mais eficiente para automatizar esse processo no Debian 13 é o Certbot.

Instale o Certbot e o plugin do Apache com o seguinte comando:

sudo apt update
sudo apt install certbot python3-certbot-apache -y

Após a instalação, execute o comando para gerar o certificado. O Certbot irá ler suas configurações de VirtualHost e aplicar os certificados automaticamente:

sudo certbot --apache -d seudominio.com.br

Atenção: Durante o processo, escolha a opção de redirecionar todo o tráfego para HTTPS se solicitado. O Certbot atualizará as linhas SSLCertificateFile e SSLCertificateKeyFile no seu arquivo de configuração com os caminhos reais gerados pelo Let's Encrypt.

Otimização e segurança do cabeçalho X-Forwarded-For

Um problema comum ao usar proxy reverso é que a aplicação Node.js passa a enxergar o IP 127.0.0.1 como a origem de todas as conexões, o que prejudica logs de auditoria e sistemas de segurança. Para resolver isso, utilizamos o mod_headers para passar o IP real do cliente através do cabeçalho X-Forwarded-For.

No seu código Node.js (se estiver usando Express), certifique-se de habilitar a confiança no proxy para que ele processe esses cabeçalhos corretamente:

// Exemplo em Express.js
const express = require('express');
const app = express();

app.set('trust proxy', true);

app.get('/', (req, res) => {
    console.log("IP do Cliente:", req.ip);
    res.send('Conexão segura via Proxy Reverso Apache!');
});

app.listen(3000);

Para validar se o Apache está enviando os dados corretamente, você pode monitorar as conexões ativas no servidor usando a ferramenta ss:

ss -tulpn | grep :3000

Isso confirmará que o Node.js está ouvindo apenas localmente, enquanto o Apache gerencia a porta 443 externa.

Problemas comuns e como resolver

Sintoma: Erro 502 Bad Gateway ao acessar o domínio

Causa: O Apache não consegue se comunicar com a aplicação Node.js na porta especificada ou a aplicação está offline.
Solução: Verifique se o serviço Node.js está rodando com pm2 status. Certifique-se de que a porta no ProxyPass (ex: 3000) é a mesma que a aplicação está escutando. Verifique o firewall com sudo ufw status para garantir que não há bloqueios internos.

Sintoma: Erro de SSL "Mixed Content" no navegador

Causa: A aplicação Node.js está gerando links internos usando o protocolo HTTP em vez de HTTPS.
Solução: Utilize o cabeçalho RequestHeader set X-Forwarded-Proto "https" no VirtualHost do Apache e configure sua aplicação para respeitar esse cabeçalho ao gerar URLs. Veja mais sobre como redirecionar um site http para https.

Sintoma: Erro 503 Service Unavailable

Causa: Geralmente ocorre quando o módulo proxy_http não está habilitado ou o Apache atingiu o limite de conexões simultâneas para o backend.
Solução: Execute sudo a2enmod proxy_http e reinicie o Apache. Verifique os logs de erro em /var/log/apache2/node_error.log para detalhes específicos sobre a falha na conexão.

Perguntas frequentes sobre proxy reverso no Apache

Como configurar proxy reverso no Apache para aplicação Node.js sem quebrar SSL?

Para configurar o proxy reverso sem quebrar o SSL, você deve habilitar os módulos proxy e proxy_http no Apache, definindo as diretivas ProxyPass e ProxyPassReverse dentro do VirtualHost da porta 443. É essencial garantir que o certificado SSL esteja configurado corretamente no Apache, que atuará como o terminador TLS antes de encaminhar o tráfego para a porta local do Node.js.

Por que o SSL para de funcionar ao usar proxy reverso?

Geralmente, o SSL falha se a aplicação Node.js tentar gerenciar o certificado enquanto o Apache também tenta, ou se as diretivas de proxy forem inseridas apenas no VirtualHost da porta 80. A solução correta é realizar a terminação SSL no Apache e encaminhar a requisição via HTTP interno para o Node.js.

Quais módulos do Apache são necessários para o proxy reverso?

Os módulos fundamentais são o mod_proxy e o mod_proxy_http, que permitem o encaminhamento de requisições. Além disso, o mod_ssl é obrigatório para gerenciar as conexões criptografadas e o mod_headers é recomendado para passar informações do cliente original para a aplicação.

É seguro rodar Node.js atrás de um proxy reverso Apache?

Sim, esta é uma prática recomendada de segurança e performance, pois o Apache gerencia o tráfego estático, compressão Gzip e a terminação SSL de forma mais eficiente. Isso protege a aplicação Node.js de exposição direta e facilita o balanceamento de carga futuro.

Conclusão

Configurar o Apache como proxy reverso para Node.js é uma estratégia robusta para garantir escalabilidade e segurança. Ao centralizar o gerenciamento do SSL no Apache, você simplifica a manutenção dos certificados e protege sua aplicação de ataques diretos.

  • Mantenha sempre os módulos proxy_http e ssl atualizados para evitar vulnerabilidades.
  • Utilize o PM2 para garantir que sua aplicação Node.js reinicie automaticamente em caso de falhas.
  • Monitore regularmente os logs do Apache para identificar tentativas de invasão ou erros de backend.

Leia também

Precisa de ajuda com seu servidor VPS?

A configuração de proxies reversos e SSL exige um ambiente estável e de alta performance para evitar latência nas requisições da sua aplicação.

Conheça nossos planos de VPS com suporte especializado


Esta resposta foi útil?