Node.js em Produção: Configuração de SSL com Nginx

7 min de leitura Infraestrutura

O deploy de aplicações Node.js em produção exige mais do que simplesmente iniciar o processo. Um servidor web como o Nginx atua como a porta de entrada crítica, gerenciando conexões TLS/SSL, compressão e balanceamento de carga antes de encaminhar as requisições para o seu aplicativo.

Neste tutorial, vamos configurar um ambiente seguro e performático utilizando Ubuntu, Nginx como proxy reverso e Certbot para emissão automática de certificados SSL. Este cenário é padrão da indústria para garantir que sua aplicação Node.js seja acessível via HTTPS, rápida e protegida contra ataques comuns.

1. Preparação do Ambiente Linux

Antes de instalar qualquer software relacionado ao Node.js ou Nginx, precisamos atualizar os pacotes do sistema operacional e garantir que as ferramentas necessárias estejam disponíveis. Este passo é fundamental para evitar conflitos de dependências durante a instalação.

Execute os comandos abaixo no terminal do seu servidor:

sudo apt update
sudo apt upgrade -y

Instale também o curl e o wget, ferramentas úteis para baixar arquivos e verificar conectividade de rede:

sudo apt install curl wget -y

2. Instalação do Node.js

A maneira mais recomendada de instalar o Node.js em ambientes de produção é utilizando o NodeSource, que oferece versões LTS (Long Term Support) estáveis e mantidas.

Primeiro, instale o utilitário curl se ainda não estiver presente e baixe o script de instalação do repositório NodeSource para a versão LTS atual (v20.x ou superior):

curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -

Agora, instale o pacote nodejs, que inclui tanto o runtime quanto o gerenciador de pacotes npm:

sudo apt install nodejs -y

Verifique as versões instaladas para garantir que a instalação foi bem-sucedida:

node --version
npm --version

3. Configuração do Projeto Node.js

Para fins didáticos, vamos criar uma aplicação simples que escuta em localhost:3000. Em produção, seu aplicativo nunca deve ficar exposto diretamente na porta 80 ou 443; ele deve rodar atrás de um proxy.

Crie um diretório para o projeto e navegue até ele:

mkdir ~/minha-app-node
cd ~/minha-app-node

Inicialize o projeto e instale apenas o framework Express, que é leve e amplamente utilizado:

npm init -y
npm install express

Crie um arquivo server.js com o seguinte conteúdo:

const express = require('express');
const app = express();
const PORT = process.env.PORT || 3000;

app.get('/', (req, res) => {
  res.send('Olá, mundo! Aplicação Node.js em produção segura.');
});

app.listen(PORT, () => {
  console.log(`Servidor rodando na porta ${PORT}`);
});

Para testar localmente, execute:

node server.js

Acesse http://localhost:3000 no navegador ou via curl. Se a mensagem aparecer, o Node.js está funcionando corretamente.

4. Instalação e Configuração do Nginx

O Nginx será responsável por receber o tráfego externo na porta 443 (HTTPS), descriptografar o SSL e repassar a requisição para o Node.js na porta 3000 via HTTP local.

sudo apt install nginx -y

Crie um novo arquivo de configuração de servidor. Vamos nomeá-lo meudominio.com.conf, substituindo o domínio pelo seu real:

sudo nano /etc/nginx/sites-available/meudominio.com.conf

Cole a seguinte configuração, ajustando as variáveis em destaque:

server {
    listen 80;
    server_name meudominio.com www.meudominio.com;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Explicação das diretivas importantes:

  • proxy_pass: Define para onde o Nginx deve encaminhar as requisições.
  • proxy_http_version 1.1: Necessário para suporte a WebSockets se sua aplicação usar.
  • proxy_set_header Host $host: Mantém o cabeçalho Host original, essencial para roteamento correto.
  • X-Real-IP e X-Forwarded-For: Permitem que seu aplicativo Node.js saiba qual é o IP real do cliente, crucial para logs e segurança.

Habilite a configuração criando um link simbólico na pasta sites-enabled:

sudo ln -s /etc/nginx/sites-available/meudominio.com.conf /etc/nginx/sites-enabled/

Teste a sintaxe do Nginx para garantir que não há erros de configuração:

sudo nginx -t

Se o teste for bem-sucedido, reinicie o serviço:

sudo systemctl restart nginx

5. Configuração do Firewall (UFW)

O Ubuntu vem com o firewall UFW ativado por padrão em muitas configurações de VPS. Precisamos liberar o tráfego HTTP e HTTPS.

sudo ufw allow 'Nginx Full'

Verifique o status do firewall:

sudo ufw status

A saída deve indicar que as portas 80 e 443 estão abertas.

6. Emissão de Certificado SSL com Certbot

Agora que o Nginx está configurado e apontando para o Node.js, vamos garantir a segurança SSL. O Certbot é a ferramenta padrão da indústria (mantida pela EFF) para obter certificados gratuitos do Let's Encrypt.

Instale o Certbot e o plugin Nginx:

sudo apt install certbot python3-certbot-nginx -y

Execute o comando de obtenção do certificado. O plugin Nginx configurará automaticamente o redirecionamento HTTP para HTTPS e atualizará a configuração do servidor:

sudo certbot --nginx -d meudominio.com -d www.meudominio.com

O assistente irá fazer as seguintes perguntas:

  1. Insira um endereço de email para notificações de expiração.
  2. Aceite os termos de serviço.
  3. Escolha se deseja compartilhar o email com a EFF.
  4. Selecione a opção 2 para redirecionar todo o tráfego HTTP para HTTPS automaticamente.

O Certbot irá baixar o certificado, instalá-lo no diretório /etc/letsencrypt e modificar o arquivo de configuração do Nginx para incluir as chaves SSL. Ele também configura um agendamento automático (via cron ou systemd timer) para renovar os certificados antes que expirem.

7. Gerenciamento do Processo Node.js com PM2

Executar o Node.js diretamente no terminal não é adequado para produção. Se você fechar o terminal, a aplicação cairá. Além disso, se houver um crash, ela não se recuperará sozinha.

O PM2 é um gerenciador de processos em produção para Node.js que mantém sua aplicação viva, gerencia logs e permite reinicialização sem downtime.

sudo npm install -g pm2

Inicie sua aplicação com o PM2:

pm2 start server.js --name "minha-app"

Verifique se a aplicação está rodando:

pm2 list

Para garantir que a aplicação inicie automaticamente após reinicialções do servidor ou falhas, execute:

pm2 startup
sudo env PATH=$PATH:/usr/bin pm2 startup systemd -u $USER --hp /home/$USER

E salve o estado atual dos processos:

pm2 save

8. Considerações Finais de Segurança e Monitoramento

Com o Nginx, SSL e PM2 configurados, você tem uma base sólida para produção. No entanto, considere as seguintes práticas adicionais:

  • Habilitar Gzip/Brotli no Nginx: Adicione compressão para reduzir o tamanho das respostas JSON e assets estáticos.
  • Limites de Taxa (Rate Limiting): Configure limit_req_zone no Nginx para proteger sua API contra ataques de força bruta ou DDoS simples.
  • Logs: Verifique os logs do Nginx em /var/log/nginx/ e os logs do PM2 usando pm2 logs para monitorar erros.
  • VPS Security: Desabilite o login SSH por senha e use chaves SSH. Altere a porta padrão do SSH se possível.

Sua aplicação Node.js agora está rodando em produção, protegida por SSL, otimizada pelo Nginx e gerenciada robustamente pelo PM2.

Esse tutorial foi útil?

Comentários (0)

Seja o primeiro a comentar.

Deixe seu comentário

Seu comentário será analisado antes de ser publicado.

0/2000
WhatsApp