Como manter processos Node.js ativos no servidor

Como manter processos Node.js ativos no servidor - hero

Como manter processos Node.js ativos no servidor

Um processo Node.js ativo é aquele que continua em execução enquanto a aplicação atende requisições, tarefas agendadas ou conexões com outros serviços. Em desenvolvimento, basta executar o comando no terminal. Em produção, however, isso costuma ser insuficiente, porque uma falha de código, uma reinicialização do servidor ou o encerramento da sessão podem interromper o serviço.

A solução mais segura combina um supervisor de processos, que reinicia a aplicação quando ela para, com mecanismos do sistema operacional para recuperar o processo depois de uma reinicialização. Neste guia, você vai entender as opções mais comuns, configurar o PM2 e o systemd, diagnosticar problemas e evitar decisões que comprometam a estabilidade da aplicação.

Este conteúdo tem caráter informativo. Decisões técnicas devem ser tomadas com profissional especializado.

O que é manter processos Node.js ativos

O que é manter processos Node.js ativos - imagem ilustrativa
O que é manter processos Node.js ativos

Node.js é o ambiente de execução do JavaScript no servidor. Quando você inicia uma aplicação com um comando como node app.js, o processo fica associado à sessão atual do terminal. Se a conexão SSH for encerrada, o servidor for reiniciado ou o processo encontrar um erro não tratado, a aplicação pode parar.

Um processo ativo deve continuar operando de forma previsível. Isso envolve três Requirements básicos:

  • Disponibilidade, para que a aplicação responda durante falhas previsíveis e reinícios controlados.
  • Recuperação, para que o processo volte a funcionar depois de uma interrupção.
  • Observabilidade, para que você consiga identificar a causa da queda sem depender de suposições.

O supervisor de processos é o componente responsável por manter o Node.js em execução. Ele observa o processo, registra o estado e pode reiniciá-lo quando necessário. Em sistemas Linux, o systemd e o PM2 são alternativas frequentes. Em arquiteturas baseadas em contêineres, o Docker ou o Kubernetes geralmente cuidam da reinicialização do contêiner, enquanto o supervisor interno da aplicação pode ser evitado.

A escolha depende da infraestrutura, da forma de publicação do código e do nível de controle necessário. Não existe uma configuração universal que funcione igual em um VPS simples, uma hospedagem compartilhada e uma plataforma gerenciada de contêineres.

Opções para manter a aplicação em execução

Opções para manter a aplicação em execução - imagem ilustrativa
Opções para manter a aplicação em execução

systemd

O systemd é o sistema de inicialização e gerenciamento de serviços usado por grande parte das distribuições Linux modernas. Ele permite definir um serviço que inicia junto com a máquina, reinicia quando o processo falha e grava os registros em um sistema centralizado.

Para uma aplicação Node.js, o systemd costuma ser uma escolha nativa do servidor. Ele não exige a instalação de um gerenciador adicional e integra o serviço ao comando systemctl, utilizado para iniciar, parar, consultar e reiniciar unidades.

A principal vantagem é o controle direto do ciclo de vida da aplicação. A desvantagem aparece quando a equipe não conhece a criação de arquivos de unidade ou precisa de uma interface visual para acompanhar processos, uso de memória e reinícios.

PM2

O PM2 é um gerenciador de processos Node.js que funciona em Linux, macOS e Windows. Ele mantém aplicações em execução, oferece comandos para consultar logs, reiniciar serviços e limitar a memória consumida. Também pode ser configurado para iniciar junto com o sistema operacional.

O PM2 é útil quando o projeto usa Node.js de forma intensa ou quando a equipe quer uma interface administrativa mais simples. Uma limitação é que a configuração de inicialização no Linux pode variar conforme a versão e o método de instalação. Na prática, o ideal é seguir a documentação oficial do projeto e conferir o serviço gerado no sistema.

Contêineres

Contêineres empacotam a aplicação e suas dependências em um ambiente isolado. Quando o contêiner para, a plataforma pode criar outro contêiner com a mesma imagem. Docker Compose, Kubernetes e serviços de hospedagem gerenciada usam mecanismos parecidos.

Essa abordagem facilita a padronização entre ambientes, mas não elimina a necessidade de configurar reinícios, limites de recursos e verificações de saúde. Um contêiner que reinicia continuamente pode esconder um erro na aplicação, por isso o log e a saúde do serviço precisam fazer parte do projeto.

Comparativo entre systemd, PM2 e contêineres

Opção Melhor uso Reinício após falha Inicialização com o servidor Observabilidade _complexidade
systemd Aplicação em servidor Linux Sim, por política do serviço Sim Logs do sistema e journalctl Média
— — — — — —
PM2 Aplicação Node.js com gerenciamento pelo Node Sim, com limite opcional de reinícios Sim, com configuração adicional Logs, lista de processos e painel opcional Baixa a média
— — — — — —
Contêineres Aplicações isoladas e pipelines de publicação Sim, com política da plataforma Sim Logs e verificações de saúde Média a alta

A tabela mostra que não existe uma opção sem responsabilidade. O supervisor escolhe como reiniciar, mas a equipe ainda precisa definir limites, alertas e procedimentos para investigar falhas.

Configurando o PM2 em um servidor Linux

Configurando o PM2 em um servidor Linux - imagem ilustrativa
Configurando o PM2 em um servidor Linux

Antes de começar, confirme que o Node.js e o npm estão instalados. O comando node --version mostra a versão disponível e o comando npm --version exibe a versão do gerenciador de pacotes. Em um servidor compartilhado, a instalação pode exigir permissões adicionais ou o uso de um gerenciador de versões.

Instalação do gerenciador

Em projetos globally installed, o comando mais usado é:

npm install -g pm2

O prefixo global significa que o pacote fica disponível para o usuário em um diretório global do Node.js. Em servidores com controle estrito de permissões, pode ser necessário instalar com sudo, mas isso deve ser avaliado com cuidado. Executar comandos como root sem necessidade aumenta o impacto de eventuais erros.

Depois da instalação, verifique o gerenciador:

pm2 --version
pm2 list

Se o comando não for encontrado, verifique se o diretório global do npm está no PATH, que é a lista de pastas em que o sistema procura programas executáveis.

Inicialização da aplicação

Entre na pasta do projeto e execute:

pm2 start app.js --name minha-aplicacao

O nome facilitate a identificação do processo. Se a aplicação usa variáveis de ambiente, carregue um arquivo .env por meio do gerenciador de processos ou configure o serviço no servidor. Nunca versione esse arquivo em um repositório público.

Para acompanhar os registros:

pm2 logs minha-aplicacao
pm2 status

Para parar e iniciar novamente:

pm2 stop minha-aplicacao
pm2 restart minha-aplicacao

O comando reload pode ser mais adequado para aplicações que precisam drenar requisições antes de serem reiniciadas. Isso depende do comportamento da aplicação e da forma como as conexões são gerenciadas. Uma API com trabajos longos deve ser projetada para tolerar o encerramento gradual, em vez de depender de um reinício brusco.

Configuração de reinício

O PM2 pode reiniciar a aplicação quando ela falha. Também é possível definir um limite de reinícios para evitar ciclos intensos em caso de erro de configuração. Consulte a sintaxe da versão instalada antes de aplicar limites, pois as opções evoluem entre versões.

Um arquivo de configuração permite revisar opções como nome do script, ambiente, limite de memória e comportemento de reinício. Ele deve ser mantido no controle de versão quando não contiver segredos. Variáveis de ambiente e valores sensíveis precisam ficar fora do arquivo de configuração ou ser protegidos durante a publicação.

Configuração para iniciar com o servidor

O PM2 oferece o comando pm2 startup, que gera um serviço de inicialização para o sistema operacional. A documentação recomenda executar o comando exibido pelo próprio PM2 com permissões suficientes e, depois, salvar a lista de processos com pm2 save.

O procedimento exato pode depender da distribuição Linux. Após a configuração, reinicie o servidor em um horário controlado e verifique se a aplicação voltou. Testar de fato é mais confiável do que confiar apenas na mensagem de sucesso.

Configurando um serviço com systemd

Configurando um serviço com systemd - imagem ilustrativa
Configurando um serviço com systemd

O systemd é especialmente útil quando a aplicação é publicada em um VPS ou servidor dedicado com Linux. A ideia é criar uma unidade que informa ao sistema operacional qual comando inicia o Node.js, qual usuário executa o processo e como agir em caso de falha.

Criação do usuário e diretório

Evite executar a aplicação como root. Crie um usuário sem privilégios administrativos e uma pasta própria para o projeto. O exemplo abaixo usa nodeapp como usuário e /var/www/minha-app como diretório:

sudo useradd --system --create-home --shell /usr/sbin/nologin nodeapp
sudo mkdir -p /var/www/minha-app

A forma de copiar os arquivos varia conforme o deploy. Git, rsync ou uma ferramenta de publicação podem ser usados. Depois, ajuste a propriedade dos arquivos para o usuário do serviço, sem liberar permissões amplas sem necessidade.

Arquivo de unidade

Um arquivo pode ser criado em /etc/systemd/system/minha-app.service:

[Unit]
Description=Aplicacao Node.js
After=network.target

[Service]
Type=simple
User=nodeapp
Group=nodeapp
WorkingDirectory=/var/www/minha-app
Environment=NODE_ENV=production
EnvironmentFile=-/var/www/minha-app/.env
ExecStart=/usr/bin/node /var/www/minha-app/app.js
Restart=on-failure
RestartSec=5
TimeoutStopSec=30
KillSignal=SIGTERM

[Install]
WantedBy=multi-user.target

O ExecStart deve usar o caminho completo do Node.js instalado no servidor. Nem toda instalação coloca o executável em /usr/bin/node. Para descobrir o caminho, use which node. O EnvironmentFile carrega as variáveis do arquivo .env quando ele existe, por isso o prefixo - evita a falha de inicialização caso o arquivo ainda não esteja presente, embora a aplicação deva receber as variáveis obrigatórias de outra forma durante o deploy.

Ativação e diagnóstico

Após criar o arquivo, atualize o systemd:

sudo systemctl daemon-reload
sudo systemctl enable minha-app
sudo systemctl start minha-app
sudo systemctl status minha-app

Para acompanhar os logs em tempo real:

sudo journalctl -u minha-app -f

Para ver os últimos registros:

sudo journalctl -u minha-app -n 100 --no-pager

Para reiniciar depois de uma alteração no arquivo de unidade:

sudo systemctl restart minha-app

O daemon-reload informa o systemd que o arquivo mudou. Sem essa etapa, o serviço pode continuar usando a definição anterior.

Diagnosticando processos que param ou reiniciam

Quando a aplicação cai, a primeira tentativa costuma ser olhar apenas o erro final. Isso pode esconder a causa real. Uma investigação útil começa pelo histórico do serviço, pelo estado do processo e pela saúde da aplicação.

Verifique o estado do processo

Com systemd:

sudo systemctl status minha-app
sudo journalctl -u minha-app --since "30 minutes ago"

Com PM2:

pm2 status
pm2 logs minha-aplicacao --lines 100

O status mostra se o processo está ativo, parado, reiniciando ou com erro. Os logs revelam mensagens de inicialização, falhas de conexão, erros de sintaxe e motivos de encerramento.

Confirme porta e conectividade

Se a aplicação deveria escutar em uma porta, verifique se o processo realmente está escutando nela. O ss mostra sockets do sistema operacional:

ss -ltnp

Teste a resposta local com curl:

curl -i http://127.0.0.1:3000/health

Se o servidor remoto continua sem resposta, teste a rota local primeiro. Isso separa um problema da aplicação daquele relacionado ao proxy, firewall, DNS ou balanceador de carga.

Verifique recursos e dependências

Queda de memória, disco cheio e CPU sobrecarregada podem derrubar o processo. Verifique o uso de memória, a carga do sistema e o espaço disponível. Também confira banco de dados, cache, filas e serviços externos.

Uma falha de dependência não significa necessariamente que o código está quebrado. Um supervisor pode reiniciar a aplicação algumas vezes enquanto o banco ainda está fora do ar. Nesse cenário, reinícios agressivos geram logs ruidosos e não resolvem a causa.

Procure loops de reinício

Um loop de reinício normalmente aparece como vários reinícios em pouco tempo. As causas mais comuns incluem:

  • variável de ambiente ausente;
  • erro de sintaxe no código publicado;
  • porta já ocupada por outro processo;
  • dependência externa indisponível;
  • falha na migração do banco de dados;
  • permissões insuficientes para arquivos ou diretórios.

Não desabilite o supervisor para esconder o sintoma. O objetivo é fazer o processo permanecer ativo com uma configuração saudável, não apenas impedir que o sistema registre a falha.

Boas práticas para processos Node.js em produção

Registre logs de forma estruturada

O processo deve escrever nos streams padrão de entrada e saída, em vez de tentar gerenciar arquivos de log por conta própria. O systemd e o PM2 podem capturar esses fluxos e centralizá-los. Logs estruturados, com horário, nível, código da requisição e contexto da operação, ajudam a localizar falhas.

Evite registrar senhas, tokens, cookies ou dados pessoais. A LGPD e boas práticas de segurança exigem atenção especial ao tratar informações de usuários e dados de clientes.

Trate o encerramento com elegância

Ao receber SIGTERM, o processo deve parar de aceitar novas conexões, concluir ou cancelar tarefas de forma controlada e fechar recursos. Node.js oferece sinais do sistema e mecanismos de encerramento para construir esse comportamento.

Para tarefas demoradas, use filas e de repetição com limite. Para tarefas recorrentes, evite que cada instância do aplicativo execute o mesmo agendamento sem coordenação. Em ambientes com várias instâncias, locks ou um serviço dedicado de agendamento são alternativas mais previsíveis.

Mantenha dependências e runtime atualizados

Atualize o Node.js, as dependências do projeto e o sistema operacional com procedimento de teste. Uma aplicação que funciona apenas na máquina local pode falhar no servidor por diferenças de versão, variáveis de ambiente ou bibliotecas nativas.

Mantenha o package-lock.json ou outro arquivo de lock correspondente versionado. Durante o deploy, use a instalação reprodutível prevista pelo projeto e valide a aplicação antes de expor a nova versão.

Configure limites e alertas

Limites de memória, tempo de resposta e quantidade de reinícios ajudam a evitar que uma falha consuma todo o servidor. Os limites devem vir da observabilidade real da aplicação. Um limite muito baixo pode reiniciar um processo saudável; um limite muito alto pode deixar o servidor sem memória.

Crie alertas para sinais relevantes:

  • aplicação fora do ar por mais de alguns minutos;
  • reinícios repetidos;
  • aumento da latência;
  • uso excessivo de memória ou CPU;
  • fila de mensagens acumulando;
  • certificado digital próximo do vencimento.

Teste a recuperação

Um supervisor configurado não deve ser testado somente em teoria. Em uma janela controlada, reinicie o servidor e confirme o retorno da aplicação. Verifique o proxy, as filas, o DNS e as integrações externas. Em alguns casos, é útil simular o encerramento do processo para confirmar que o mecanismo de reinício funciona.

systemd, PM2 ou contêineres, como decidir?

A decisão mais simples costuma começar pelo ambiente. Se o projeto roda em uma máquina Linux e a equipe quer usar os recursos do sistema operacional, o systemd é uma base sólida. Se a equipe quer administrar vários processos Node.js com comandos rápidos e uma interface conhecida, o PM2 reduz a curva de aprendizado.

Os contêineres fazem sentido quando a aplicação já precisa de isolamento, publicação por imagem ou consistência entre ambientes. Eles não devem ser adotados somente porque parecem mais modernos. Uma imagem de contêiner mal configurada pode reiniciar indefinidamente, consumir recursos e dificultar o diagnóstico.

Uma comparação prática fica assim:

Critério systemd PM2 Contêineres
Ambiente típico Servidor Linux Aplicação Node.js em execução contínua Deploy por imagem
— — — —
Curva de inicialização Média Baixa Média
— — — —
Integração com o SO Alta Boa Depende da plataforma
— — — —
Controle de dependências Externo Externo Incluído na imagem
— — — —
Publish independente Com build e artefato Com build e artefato Com registry e pipeline
— — — —
Principal risco Configuração incorreta do serviço Reinícios excessivos ou ambiente divergente Imagem desatualizada ou health check inadequado

Na prática, eu evitaria misturar dois supervisores para o mesmo processo sem necessidade. Por exemplo, um PM2 dentro de um serviço systemd pode ser útil em LEGADO, mas aumenta a quantidade de camadas para diagnosticar. Escolha uma camada principal e documente a responsabilidade de cada parte.

Cuidados com hospedagem compartilhada e provedores de aplicação

Nem todo provedor permite instalar systemd ou executar PM2 com permissões de inicialização. Em hospedagem compartilhada, o painel pode oferecer processos Node.js persistentes, cron jobs ou comandos de reinício. Verifique as regras do contrato antes de escolher a arquitetura.

Em plataformas gerenciadas, como um serviço que já faz build e release do código, o provedor pode cuidar do reinício. Ainda assim, é preciso entender os limites da plataforma, o mecanismo de shutdown e o tratamento de falhas. O procedimento de deploy precisa comunicar à plataforma como iniciar o processo e qual rota verifica sua saúde.

Verifique também se o plano de hospedagem permite manter uma aplicação ativa continuamente. Alguns serviços são voltados a sites e APIs e cobram pelo tempo de execução ou pelo consumo de recursos. O valor e as regras mudam, portanto consulte a documentação atual do provedor.

Checklist de manutenção de processos Node.js

Antes de colocar a aplicação em produção, confirme:

  • O processo inicia com um comando documentado.
  • O servidor reinicia a aplicação depois de uma falha.
  • A aplicação também retorna após uma reinicialização do servidor.
  • Os logs são acessíveis e não contêm segredos.
  • O encerramento ocorre de forma graciosa.
  • Existe um limite para reinícios repetidos.
  • Há alerta para indisponibilidade e consumo excessivo de recursos.
  • O deploy foi testado no mesmo tipo de ambiente da produção.
  • As dependências externas e a rota de saúde foram verificadas.
  • O arquivo de configuração está versionado sem credenciais.

Esse checklist não substitui o teste. Ele ajuda a evitar que uma configuração importante dependa apenas da memória de alguém.

Perguntas Frequentes (FAQ)

Por que meu processo Node.js para ao fechar o terminal SSH?

Um processo iniciado diretamente no terminal pode receber o encerramento da sessão e deixar de acompanhar o servidor. O systemd, o PM2 com inicialização do sistema ou um contêiner gerenciado são formas de manter o serviço disponível fora do terminal.

O PM2 ou o systemd reinicia uma aplicação depois de uma falha?

Sim, quando a política de reinício está configurada. O systemd pode usar Restart=on-failure, e o PM2 permite definir o comportamento de reinício e limites. A aplicação também precisa registrar a causa da falha, porque reiniciar não corrige erros de configuração.

Como descubro por que meu processo Node.js caiu?

Use journalctl para consultar o serviço do systemd ou pm2 logs para ver os registros do PM2. Confira também porta, arquivos de configuração, variáveis de ambiente, memória e dependências externas. O histórico Usually mostra a exceção ou o sinal que encerrou o processo.

É seguro usar npm install -g pm2 no servidor?

O comando instala o PM2 no diretório global do npm. Em servidores compartilhados, confirme as permissões e o diretório de instalação. Quando possível, prefira um usuário específico e evite executar comandos administrativos sem necessidade.

Contêiner substitui systemd ou PM2?

Não necessariamente. O contêiner é uma forma de empacotar e executar a aplicação. O ambiente ainda pode usar um serviço do sistema ou um orquestrador para reiniciar contêineres. Em uma aplicação simples, a equipe pode manter apenas o Docker com política de reinício, mas precisa configurar logs e verificações de saúde.

Como fazer a aplicação voltar depois de reiniciar o servidor?

Crie um serviço do systemd habilitado para inicialização, configure o PM2 para iniciar com o sistema ou publique o contêiner em uma plataforma que aplique sua política de reinício. Depois, reinicie o servidor em uma janela de teste e confirme a aplicação, o proxy e as integrações.

Conclusão

Manter processos Node.js ativos é uma questão de desenho da operação, não apenas de executar node app.js. O processo precisa de um supervisor, política de reinício, logs, limites e um teste de recuperação depois da queda.

O systemd é uma escolha natural em servidores Linux. O PM2 facilita o gerenciamento de aplicações Node.js e oferece uma experiência familiar. Contêineres ajudam quando a publicação por imagem e o isolamento fazem parte da estratégia. O importante é definir quem inicia, quem reinicia, quem observa e quem responde quando algo falha.

Se você precisa de ajuda para colocar isso em prática, a Baita Site tem uma equipe especializada em sites, e-commerce, sistemas e inteligência artificial, com domínio total de WordPress. Fale com a gente e veja como podemos acelerar o seu projeto.

Referências consultadas

Quer ajuda para colocar isso em pratica?

A Baita Site trabalha com sites, e-commerce, sistemas e IA. Quem prefere resolver com acompanhamento, sem ter que virar especialista em tudo, costuma procurar esse tipo de suporte.

WhatsApp (47) 99905-6989  |  WhatsApp (47) 99198-5289

Gostaria de receber mais novidades?

Nossas publicações serão sempre voltadas ao mundo do marketing digital, design e criação de sites. Você não será importunado com assuntos que não são do seu interesse!

Compartilhe com seus familiáres e amigos!

Baita Site

Desenvolvemos soluções completas em Marketing Digital para o seu o seu negócio.

Contate-nos, solicite um orçamento, teremos o maior prazer em lhe ajudar!

baitasite@baitasite.com.br
+55 (47) 3360-7843
CNPJ 22.130.607/0001-29

Porque nos escolher?

É algo muito simples! Temos anos e uma vasta experiência com internet, nosso preço é justo e nosso trabalho profissional.

São anos de estudo e dedicação para adquirir o conhecimento necessário para executar projetos com qualidade e eficiência

Onde Estamos

Estamos localizados em um aconchegante home office em Itapema, litoral de Santa Catarina. Você está longe? Não tem problema!

Somos feras em atendimento e suporte a distância, por WhatsApp e pela internet!

Copyright 2020 - Baita Site - Criação de Sites em Itapema. Site feito com amor por nós mesmos!