Back-End

21 nov, 2018

Executando o PM2 e o Node.js em ambientes de produção

Publicidade

A famosa plataforma de aplicação conhecida como Node.js trouxe inúmeras possibilidades para a linguagem JavaScript. A vantagem mais evidente é que com ele conseguimos usar JavaScript de ponta a ponta nas nossas aplicações.

Isso significa que não precisamos mais utilizar outras tecnologias como Java, PHP e C# para o nosso back-end, mas sim o próprio JavaScript. Isso facilita não somente o trabalho (já estaremos trabalhando com uma linguagem em comum), mas como todo o ecossistema.

Contudo, quando o projeto/aplicação é publicado na web, o aspecto mais desafiador é mantê-lo ativo e em execução. É aí que entra o PM2.

O que é PM2?

O PM2 (Process Manager 2) é um gerenciador de processos automatizado e avançado para aplicações Node.js em ambientes de produção. O projeto é de código aberto (distribuído sob licença GNU-AGPL-3.0) e está com o seu repositório no GitHub, onde já possui mais de 25 mil estrelas.

Ele vem também com um Load-Balancing integrado, permitindo que os aplicativos Node.js em rede sejam escalonados em todas as CPUs disponíveis, com nenhuma modificação no código. Veremos sobre essa funcionalidade no decorrer do artigo. E o melhor de tudo é que o projeto é multiplataforma, ou seja, funciona em ambientes Linux, Windows e Mac.

Ele possui um arquivo de configuração (process.json) no qual é possível especificar quais processos desejamos executar e quantos desejamos dimensionar. Ao iniciar o PM2, é possível especificar o arquivo process.json, e o PM2 irá cuidar do resto.

Resumindo, o PM2 tem a função de manter os aplicativos Node.js ativos e recarregá-los com tempo de inatividade zero quando tiver atualizações no aplicativo ou servidor. Ele é bem fácil de usar e facilita o gerenciamento de um ambiente de produção.

Instalação do PM2

Pressupondo que o Node.js já esteja instalado na máquina (assim como o npm, o gerenciador de pacotes dele), é possível fazer a instalação globalmente do PM2 com o seguinte comando: npm install pm2 -g. Dessa forma, conseguiremos usar a ferramenta independentemente do projeto em que estivermos trabalhando.

Após a instalação, já é possível acessar o comando “pm2”, que veremos nas funcionalidades.

Funcionalidades do PM2

O PM2 é uma ferramenta incrivelmente extensa e poderosa. Entre as funcionalidades mais interessantes dele estão:

1 – Reinício automático: Uma vez iniciado, o aplicativo estará sempre ativo e reiniciando automaticamente com o comando pm2 start. Então imagine uma situação em que sua aplicação sofre uma pane inesperada. Em situações comuns, teríamos que verificar que o serviço não está funcionando para então reiniciá-lo.

Com essa ferramenta, o processo é diferente, pois uma vez que acontece algum problema inesperado e a aplicação cai, o PM2 identifica isso e tenta restabelecer o seu projeto por conta própria (por uma quantidade x de vezes que podemos configurar).

2 – Gerenciamento de processos: O PM2 possui um conjunto de comandos que permite gerenciar os estados dos aplicativos sem se importar com a quantidade que está sendo executada, como é mostrado a seguir:

  • pm2 start process_prod.json: inicia um ou mais processos via arquivo JSON.
  • pm2 start NomeDoApp: inicia um aplicativo específico.
  • pm2 stop NomeDoApp: para uma aplicação específica.
  • pm2 ls: mostra uma lista de todas as aplicações sendo executadas.
  • pm2 NomeDoApp scale N: escala o aplicativo que foi especificado para n números de instâncias.
  • pm2 show NomeDoApp: mostra informações sobre a aplicação.
  • pm2 kill all: mata todos os aplicativos em execução.
  • pm2 restart all: reinicia todos os aplicativos em execução.
  • pm2 reload all: recarrega a configuração do aplicativo, como as variáveis de ambiente.
  • pm2 startup: configura o pm2 para inicializar com o sistema operacional.

Além disso, com o comando pm2 monit, é retornado um conjunto avançado de dados em torno da integridade do aplicativo – por exemplo, utilização da CPU, uso de memória, solicitações, entre outras coisas.

3 – Gerenciamento de logs: Possui um gerenciamento de log integrado. Ele junta os dados de logs de todos os aplicativos em execução e os grava em uma única fonte para exibição. Ele possui também uma rotação de logs, que é interessante especialmente se o aplicativo estiver gerando logs detalhados com frequência. Os três comandos mais utilizados são:

  • pm2 logs: saída de logs de todos os aplicativos em execução.
  • pm2 logs app: saída de logs somente de um aplicativo específico.
  • pm2 flush: libera todos os dados de log, disponibilizando espaço em disco.

Lembre-se: é necessário ativar a rotação de logs para que o arquivo de logs seja dividido em arquivos menores que são mais gerenciáveis para o PM2, caso o arquivo de logs original seja muito grande. Para fazer isso, basta executar o comando pm2 install pm2-logrotate.

Cluster Mode

Um dos recursos mais poderosos do PM2 é a capacidade de execução no Cluster Mode. O Cluster Mode permite dimensionar o aplicativo Node.js em todas as CPUs disponíveis e utilizá-las sem qualquer tempo de inatividade, aumentando assim a capacidade do aplicativo de lidar com o tráfego, sem a necessidade de alterar nenhuma linha de código. É perfeitamente adequado para as aplicações em rede que lidam com conexões HTTP/UDP/TCP.

Para iniciar um aplicativo em Cluster Mode, é usado o comando pm2 start app.js -i.
No -i, é possível delimitar o número de CPUs usadas, como
pm2 start app.js -i 5 (para 5 CPUs) ou usar pm2 start app,js -i max. O max é o parâmetro que detecta automaticamente o número de CPUs disponíveis.

Boas práticas com o PM2

Há algumas práticas saudáveis para melhorar ainda mais a execução do PM2. São elas:

  • Variáveis de ambiente: as variáveis de ambiente são variáveis especiais definidas nos aplicativos Node.js. Elas são úteis para facilitar a configuração do aplicativo externamente. Um exemplo de variável de ambiente é a NODE_ENV, que especifica o ambiente no qual o aplicativo está sendo executado (em desenvolvimento ou produção).
  • Graceful Shutdown: como durante a vida útil do aplicativo ele será reiniciado várias vezes, o usuário tem a possibilidade de enfrentar um problema de período de inatividade (servidor retornando respostas 503 – serviço indisponível) ou uma solicitação com falha (solicitação estava em andamento no momento da reinicialização). Para evitar esses problemas, é interessante sempre ter um Graceful Shutdown nas aplicações.
  • Aplicativo sem estado: um aplicativo sem estado não contém dados locais armazenados no processo, como memória e conexões de sessões, websocket, entre outros. Para contornar esse problema, é possível utilizar algum banco de dados para compartilhar todos os estados entre os processos.

Desvantagem do PM2

A única desvantagem conhecida do PM2 é o consumo de processamento após algum tempo. Se não configurado corretamente, ele pode tornar não somente a aplicação, mas toda a máquina bem mais lenta.

Porém, dadas as suas inúmeras vantagens e possibilidade de configurar de ponta a ponta a sua execução, esse problema é facilmente superado.

Finalizando, além de o PM2 ser open source, ele nos permite criar aplicativos incríveis, sem se preocupar com a sobrecarga que é necessária para manter um aplicativo ativo e em execução, e permitindo que seja administrado todo o workflow de desenvolvimento facilmente.

***

Artigo publicado na revista iMasters, edição #28: https://issuu.com/imasters/docs/imasters_28_v5_issuu