Tutoriais

Deploy de aplicações Node.js com PM2 e Nginx

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.

Compartilhar:

Pronto para hospedar seu próximo projeto?

VPS com painel pré-instalado em 1 clique. Ativação imediata.

Ver planos VPS