Já te aconteceu uma aplicação Node.js cair em produção às 3 da manhã e só dares por isso no dia seguinte? Ou teres um bot em Python que precisa de estar sempre online mas não sabes como o manter vivo?
É aqui que entra o PM2 (Process Manager 2).
O PM2 é um gestor de processos para Node.js (e não só) que mantém as tuas aplicações online 24/7. Ele faz o auto-restart quando algo falha, gere logs, expõe métricas e ainda permite escalar em cluster com poucos comandos.
Neste artigo, vou mostrar-te como usar o PM2 no dia-a-dia: desde o básico até configurações de produção que uso nos meus próprios servidores.
O que é o pm2?
PM2 é um daemon (processo em background) que gerencia as tuas aplicações. Podes pensar nele como um systemd para as tuas apps Node.js, mas mais simples e com features específicas para developers.
Porquê PM2 em vez de...
| Alternativa | Quando usar |
|---|---|
| systemd | Quando queres integração profunda com o SO. Mas é mais verboso |
| screen/tmux | Fixe para sessões ad-hoc, mas não faz auto-restart |
| Docker | Excelente para ambientes isolados. Mas PM2 é mais leve para uma app simples |
| nohup & | Funcional, mas zero monitorização |
PM2 dá-te o meio-termo: simples de configurar, com monitorização, restart automático e logs.
Instalação
Instalar é direto com npm:
Ou se usas Yarn:
Depois de instalado, confirma que está tudo certo:
Dica: Se ainda não tens Node.js instalado, usa o NVM (Node Version Manager). É a forma mais limpa de gerir versões do Node.
Primeiros passos: iniciar uma aplicação
A forma mais simples de começar:
Isto diz ao PM2 para:
- Executar o ficheiro
- Daemonizar (correr em background)
- Monitorizar e fazer restart se cair
Mas o PM2 não se limita a Node.js. Consegues gerir qualquer tipo de processo:
Opções úteis no arranque
Ecosystem file: a configuração a sério
Linha de comandos é fixe para testes. Mas em produção vais querer um ficheiro de configuração declarativa.
Cria um ficheiro ecosystem.config.js na raiz do projeto:
Depois é só:
Isto é muito mais reproduzível e versionável que dezenas de flags na CLI.
⬆ Comparação: comandos soltos na CLI vs ecosystem file declarativo
Gestão de processos
Comandos básicos do dia-a-dia:
Podes usar all para atuar em todos os processos:
Ou usar o ID do processo (vê no pm2 list):
Monitorização: vê o que se passa
Listar processos
⬆ Processos reais no servidor fuzzalab.pt (37.187.127.161)
Vês o nome, ID, estado (online/stopped/errored), uso de CPU/memória, e há quanto tempo está ativo.
Logs em tempo real
Dashboard no terminal
⬆ Dashboard PM2 com processos, detalhes, CPU, memória e logs
Isto dá-te um htop-like com CPU, memória, e logs por processo. Uso isto constantemente quando estou a debuggar alguma coisa.
Informação detalhada
Mostra versão do Node, path, variáveis de ambiente, tempo de atividade, restarts.
Cluster mode: escalar para todos os cpus
Uma das melhores features do PM2: cluster mode.
Em vez de correr uma única instância do Node.js (que é single-threaded), o PM2 cria várias instâncias: uma por CPU: e faz load balancing entre elas.
No ecosystem file:
Nota: O pm2 reload em cluster mode faz zero-downtime restart. Ele reinicia as instâncias uma de cada vez, garantindo que há sempre processos a responder a pedidos.
Se a tua app mantém estado em memória (sessions, etc.), precisas de um mecanismo partilhado (Redis, banco de dados). Cada instância é um processo independente.
⬆ Arquitetura do cluster mode: load balancer distribui pedidos pelas várias instâncias
Startup & persistência: manter vivo após reboot
Um dos maiores problemas de usar node app.js diretamente: quando o servidor reinicia, a aplicação morre.
O PM2 resolve isto com o sistema startup:
O pm2 startup deteta o teu init system (systemd, upstart, launchd) e gera o script apropriado. O pm2 save guarda a lista de processos ativos.
Quando o servidor reiniciar, o PM2 restaura automaticamente todos os processos.
Log rotation: logs não enchem o disco
Por defeito, o PM2 escreve logs para ficheiros que podem crescer até ocupar TBs. Usa o módulo de log rotation:
Configuração (via PM2):
Isto é obrigatório em produção. Acredita, não queres descobrir que /var/log está cheio às 3 da manhã.
Graceful shutdown: parar sem partir tudo
Quando o PM2 faz restart, ele envia um sinal SIGINT ao processo. A tua app deve apanhar esse sinal e fazer cleanup:
⬆ Fluxo do graceful shutdown: SIGINT → cleanup → exit → restart
No ecosystem file, podes configurar:
Resumo de comandos úteis
| Comando | O que faz |
|---|---|
| pm2 list | Lista processos |
| pm2 start app.js | Inicia app |
| pm2 start ecosystem.config.js | Inicia config |
| pm2 stop app | Para processo |
| pm2 restart app | Reinicia |
| pm2 reload app | Zero-downtime reload |
| pm2 delete app | Remove do PM2 |
| pm2 logs | Logs em tempo real |
| pm2 monit | Dashboard terminal |
| pm2 show app | Detalhes do processo |
| pm2 startup | Auto-arranque no boot |
| pm2 save | Guarda lista de processos |
| pm2 status | Estado dos processos |
Conclusão
O PM2 é uma ferramenta que uso em todos os meus servidores. Não é só para Node.js: já o usei para gerir bots Python, scripts bash, e até binários Go.
A beleza está na simplicidade: com pm2 start tens uma app monitorizada e persistente. Com ecosystem.config.js tens uma configuração reproduzível e versionável.
Próximos passos que recomendo:
- Cria um ecosystem.config.js no teu projeto atual
- Testa o cluster mode (-i max)
- Configura o pm2 startup para persistência
- Instala o pm2-logrotate se fores usar em produção
Já usas PM2? Ou preferes outra abordagem? Deixa um comentário ou manda mensagem: gosto de saber como outros developers resolvem estes problemas.
Comentários (0)
Nenhum comentário ainda. Seja o primeiro!
Deixar comentário