PM2 - Gerenciador de aplicações Node.js em ambientes de produção

PM2 - Gerenciador de aplicações Node.js em ambientes de produção

27/01/2016 Jonathan André Schweder 5 min de leitura

O Node.js, famoso interpretador javascript do lado servidor, trouxe uma nova gama de possibilidades para a linguagem javascript. Entre suas maiores vantagens posso citar o uso da mesma linguagem de programação no lado cliente e servidor e usar programação assíncrona por padrão. Contudo em algum momento da vida de seu projeto ou da sua aplicação, este deve ser publicado, e é neste ponto que o PM2 aparece.

O PM2 basicamente serve para manter e monitorar sua aplicação rodando, usar cluster para alta disponibilidade com balanceamento de carga, logs, recarregar a aplicação automaticamente quando há alterações nos arquivos ou reinicio do servidor, entre diversas outras atividades que a principio podem parecer simples, porém tenha em mente que o PM2 foi projetado para gerenciar diversas aplicações rodando de uma só vez, em um único console.

Para ilustrar melhor vamos fazer um exemplo, para isso antes de mais nada devemos fazer a instalação do mesmo, através do seguinte comando:

npm install -g pm2

Isto fará a instalação global do PM2, vou pressupor que você já possuí o interpretador Node.js instalado, já adianto que por se tratar de um pacote apenas para produção não há versões para Windows, e apesar da instalação até ser feita, pois o NPM não permite bloquear a instalação por plataforma, o programa não irá rodar. Segundo a equipe do projeto no Github não há planos para fazer essa compatibilidade.

Após a instalação temos acesso ao comando “pm2”, e a partir desse faremos todas as operações necessárias. Para exemplificar, usarei um projeto bem simples que basicamente retorna algumas informações do servidor rodando, como uptime, número de processadores, quantidade de memória total, entre outras informações úteis.

O projeto está disponível neste link. O código é bem simples e basicamente só usa o modulo http do node para iniciar um servidor e o modulo os para gerar as informações. Para criarmos nossa primeira instância da aplicação com o pm2 execute o seguinte comando na raiz do projeto:

pm2 start ping.js

Logo em seguida podemos verificar se a aplicação está rodando corretamente com o seguinte comando:

pm2 list

Algo como a imagem abaixo deve ser exibido.

pm2 list

Agora conforme está colocado no arquivo ping.js, se acessarmos no navegador o endereço “http://localhost:3000” será retornado um objeto JSON com as informações que comentei anteriormente.

Contudo, até aqui, o pm2 não se diferencia  dos outros gerenciadores ou até mesmo de executar apenas o próprio node com o comando “node ping.js”, o resultado é o mesmo e veremos agora alguns diferenciais dele. O primeiro é a possibilidade criar um cluster. O conceito básico de um cluster é criar varias instâncias da aplicação e fazer o balanceamento da requisições do cliente entre elas, otimizando o uso de recursos. Para criarmos um cluster no PM2 inicialmente precisamos remover a aplicação que adicionamos anteriormente executando o comando abaixo para remover :

pm2 delete 0

Agora se rodarmos “pm2 list” novamente não será mais exibido a aplicação “ping.js”.

A criação de um cluster no PM2 é muito simples. Após criado, o pm2 irá equilibrar automaticamente as requisições entre essas instâncias, melhorando assim o uso de CPU, atento que o ideal é ter o número de instâncias igual ao número de processadores. Do contrário pode inclusive acontecer de sua aplicação ficar mais lenta e o tempo de resposta aumentar consideravelmente.

pm2 start index.js -i 4

Este comando escala a aplicação para 4 instâncias, para visualizar estas instâncias use o comando “pm2 list” e você verá uma saída parecida com a imagem abaixo:

pm2 + 4 instâncias

Talvez você se pergunte porque fazer isso se o Node.js é event-driven,  ou seja, trabalha com I/O de forma assíncrona. Para entender isso você precisa entender a forma como Node.js trabalha, que faz basicamente a otimização do uso de I/O, não aguardando que uma leitura ou escrita acabe e fazendo o uso de callbacks. Resumidamente quando o Node.js precisa fazer algum I/O, como chamada a um banco de dados, API ou escrita e leitura de arquivo em disco, você sempre irá informar uma função de callback, dizendo ao Node.js que quando acabar de fazer a ação ele precisa executar a função designada. Isso otimiza a questão de leitura e escrita mas não o de CPU, que continua sendo usado sincronicamente. Por essa razão o próprio site oficial está bem claro quais tipos de aplicações que o Node.js é eficiente, que são as chamadas “Data Drive Applications”, ou aplicações que utilizam na maioria ou principalmente funções de leitura e escrita do tipo que citei anteriormente.

Segue alguns outros comandos úteis do PM2 que você pode se interessar eu listo abaixo:

pm2 monit mostra a quantidade/percentual de CPU e memória usada pelas aplicações rodando
pm2 show [app-name] mostra informações sobre a aplicação
pm2 logs ou pm2 logs [app-name] mostra o log da aplicação ou de todas as aplicações
pm2 reload all recarrega os arquivos de todas as aplicações rodando
pm2 restart all reinicia todas as aplicações rodando
pm2 startup configura o pm2 para inicializar com o sistema operacional

Mais informações sobre o PM2 você pode encontrar neste link do site npmjs.org e neste link com o repositório no Github.

Bom pessoal espero que tenham gostado desse breve tutorial de como usar o PM2 em servidores de produção para usar melhor os recursos de CPU e memória. Até a próxima o/