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:
- Habilite os módulos de proxy e SSL no servidor Apache.
- Configure o VirtualHost na porta 80 para redirecionar o tráfego para HTTPS.
- Crie um VirtualHost na porta 443 definindo as diretivas ProxyPass e ProxyPassReverse.
- Instale e configure o certificado SSL (Let's Encrypt) para garantir a criptografia.
- 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_httpesslatualizados 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
- Otimizar Apache contra ataques DDoS e sobrecarga no Ubuntu 22.04
- Como Instalar e Configurar o Let's Encrypt Wildcard SSL no VPS Linux
- Como Configurar SSL Let's Encrypt Grátis no cPanel 2026
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.