Deploy de aplicações Node.js com PM2 e Nginx
Rodar node app.js no terminal funciona para testes, mas não em produção: o processo morre quando você desconecta, não reinicia após falhas e não sobe com o servidor. Veja como fazer um deploy profissional com PM2 e Nginx.
1. Instale o Node.js
Use a versão LTS. Uma forma prática é o nvm (instalado por usuário):
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
source ~/.bashrc
nvm install --lts
node -v
Confira a versão mais recente do script no repositório oficial do nvm. Alternativamente, use os pacotes do NodeSource ou do seu gerenciador de pacotes.
2. Crie um usuário para a aplicação
sudo adduser --disabled-password --gecos "" app
sudo -iu app
(Instale o nvm/Node com esse usuário, caso use nvm.)
3. Coloque o código no servidor
git clone https://github.com/sua-empresa/sua-api.git ~/api
cd ~/api
npm ci --omit=dev
Crie o .env com as variáveis de produção e proteja-o com chmod 600 .env.
4. Instale e configure o PM2
npm install -g pm2
Crie ecosystem.config.js:
module.exports = {
apps: [{
name: "api",
script: "server.js",
instances: "max", // um processo por vCPU
exec_mode: "cluster",
env: {
NODE_ENV: "production",
PORT: 3000
},
max_memory_restart: "500M"
}]
};
Inicie:
pm2 start ecosystem.config.js
pm2 status
pm2 logs api
Subir junto com o servidor
pm2 startup
# execute o comando que o PM2 imprimir (com sudo)
pm2 save
Rotação de logs
pm2 install pm2-logrotate
5. Configure o Nginx como proxy reverso
Saia do usuário app e, com sudo, crie /etc/nginx/sites-available/api:
server {
listen 80;
server_name api.seudominio.com.br;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
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;
}
}
Os cabeçalhos Upgrade e Connection habilitam WebSockets (Socket.IO, por exemplo).
sudo ln -s /etc/nginx/sites-available/api /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d api.seudominio.com.br
Garanta que a aplicação escute apenas em 127.0.0.1 ou que a porta 3000 esteja bloqueada no firewall.
6. Atualizando a aplicação
cd ~/api
git pull
npm ci --omit=dev
pm2 reload api # reinício sem downtime no modo cluster
Esse fluxo pode ser automatizado com GitHub Actions — veja nosso post sobre CI/CD.
Comandos úteis do PM2
pm2 monit # monitor em tempo real
pm2 restart api
pm2 stop api
pm2 delete api
pm2 describe api
Conclusão
Com PM2 e Nginx, sua aplicação Node.js fica resiliente, escalável entre os núcleos e protegida por HTTPS. Faça o deploy em um VPS-NVME-BR da VittHost, com NVMe e servidores no Brasil.Use o cupom SP-VITT20 e ganhe 20% de desconto na primeira fatura enquanto a promoção estiver ativa.