Atualizado em 13/10/2019 com mais informações sobre PM2!
O método que recomendo atualmente é o último, independente do seu sistema operacional. Inclusive incluí um vídeo sobre ele, então vá direto para o final do artigo. Isso falando de Windows, pois o que realmente recomendo é rodar em Linux.
Agora se realmente precisa rodar em Windows Server à moda antiga, pode continuar lendo…
—
Dizem que Node.js roda melhor em Linux. Como eu não sou lá muito fã de tela preta e queria colocar um projeto no ar de uma vez, acabei optando por rodar em Windows Server mesmo. No entanto deu um pouco mais de trabalho do que eu previa. De qualquer forma, resolvi organizar a trabalheira aqui para ajudar quem estiver nos mesmos apuros ou para eu mesmo me lembrar no futuro, hehehe.
Saliento que minha aplicação está usando Express, o que pode mudar alguma coisa em relação ao passo-a-passo, dependendo do seu projeto, mas não sei exatamente o quê…
O quê, você não faz a mínima ideia do motivo de eu estar usando Node.js? Dá uma olhada então nesse post aqui que você vai entender.
Se o que você estava buscando era um tutorial de como PROGRAMAR em NodeJS, o link certo é esse aqui.
Os passos para conseguir rodar uma aplicação Node.js no Windows são:
- Derrubar o IIS
- Desativar Web Deploy
- Liberar o Firewall
- Configurar a porta 80
- Instalar o Node.js
- Instalar o Windows Service
- Bônus: PM2
Vamos lá!
Passo 1: Derrubar o IIS
Se você tem o IIS instalado no seu servidor, o primeiro passo é parar ele, para que possamos usar a porta 80 do IIS para nossa aplicação Node.js (afinal, você não vai querer o seu usuário tendo de digitar a porta 3000 ao lado da sua URL, certo?). Existem outras alternativas para rotear o tráfego do IIS para o Node, que dizem inclusive ser mais profissional, mas deixo isso para você estudar por conta.
Você pode pausar o IIS rodando o seguinte comando com permissão de administrador no Executar/Run do Windows (Windows + R).
1 2 3 |
net stop WAS |
Ele vai perguntar se você tem certeza, basta confirmar com Y.
Passo 2: Desativar Web Deploy
Se você tem instalado Web Deploy no seu servidor (eu tinha), ele também estará ocupando a porta 80, temos de derrubar ele também. Para isso, abra o Executar/Run novamente e digite:
1 2 3 |
services.msc |
Isso vai abrir o gerenciador de serviços do Windows. Procure pelo serviço Web Deployment Agent Service e dê um Stop nele. Mais que isso, altere para que ele não inicie automaticamente com o Windows, para evitar problemas futuros.
Passo 3: Liberar o Firewall
O próximo passo é desbloquear a porta 80 no Firewall do Windows. Na caixa Iniciar do Windows digite Firewall e irá aparecer o ícone correto. Abra o gerenciador do Firewall e clique em Inbound Rules, lá, adicione uma nova regra para permitir acesso à porta 80, configurando a mesma na aba Ports and Protocols. Confirme tudo antes de sair.
Passo 4: Configurar a porta 80
Por padrão os apps Node.js rodam na porta 3000 (ao menos usando Express). Se quiser que ele rode na porta 80, além de preparar o servidor como fiz acima, deve alterar o arquivo www dentro da pasta bin do seu projeto Express. Dentro dele (abra com o notepad) verá que a porta 3000 é citada em uma dada linha, apenas altere para 80.
Passo 5: Intalar o Node.js
Baixe e instale no servidor a versão mais recente disponível para Windows no site oficial do NodeJS.
Depois de instalado, vá novamente no Executar/Run e digite:
1 2 3 |
node -v |
Isso deve lhe devolver a versão do NodeJS instalada no servidor. Se não funcionar, reinicie o servidor e tente novamente.
Publique a sua aplicação NodeJS em uma pasta do servidor. Minha sugestão é C:domainsnomedoappwww.
Abra uma janela do CMD com permissão de administrador e navegue usando cd até a pasta da sua aplicação Node.js. Exemplo:
1 2 3 |
cd C:domainsnomedoappwww |
Uma vez lá, digite o seguinte comando para instalar as dependências do seu projeto:
1 2 3 |
npm install |
Isso deverá ser o suficiente, mas se quiser ter certeza de que tudo que necessita para rodar Node.js está instalado em seu servidor, execute também os seguintes comandos em sequência:
1 2 3 4 5 6 7 8 9 10 11 |
npm install express -g npm install url -g npm install fresh -g npm install cookie -g npm install methods -g npm install crc -g npm install send -g npm install connect -g npm install commander -g |
Agora finalmente execute seu app Node.js com o comando abaixo ainda “dentro” da pasta do seu projeto (ou navegue novamente usando cd):
1 2 3 |
npm start |
Passo 6: Instalar o Windows Service
Por padrão, o seu site Node.js ficará executando enquanto a janela do console que iniciou seu site estiver funcionando. Se você fechar ela, ou seu servidor reiniciar (malditos Windows Updates!) já era, seu site vai ficar fora do ar até que você execute o npm start de novo.
Para que isso não aconteça, você deve instalar seu site como um Windows Service. Para fazer isso, primeiro instale o módulo node-windows globalmente:
1 2 3 |
npm install -g node-windows |
Agora rode o seguinte comando (dentro da pasta do seu projeto) para incluir uma referência deste módulo ao seu projeto:
1 2 3 |
npm link node-windows |
Depois, dentro do seu projeto Node.js (na raiz mesmo) crie um arquivo service.js com o seguinte conteúdo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
var Service = require('node-windows').Service; // Create a new service object var svc = new Service({ name:'Nome da sua Aplicação', description: 'Apenas uma descrição', script: 'C:domainssitenodejsbinwww' }); // Listen for the "install" event, which indicates the // process is available as a service. svc.on('install',function(){ svc.start(); }); svc.install(); |
Troque as propriedades name e description de acordo com seu gosto, mas atente à propriedade script nesse código, que deve conter o caminho absoluto até o arquivo JS que inicia sua aplicação. No meu caso, como estou usando express, estou apontando para o arquivo www que fica na pasta bin do projeto (curiosamente ele não possui extensão, mas é um arquivo).
Se você fez tudo corretamente, vá até Ferramentas Administrativas > Serviços (Administrative Tools > Services ou services.msc no Run/Executar do Windows) e seu serviço vai aparecer lá com o name que definiu ali no script, lhe permitindo alterar suas configurações de inicialização, dar Start, Stop, etc.
Outra coisa bacana desse módulo é que ele manda todas as mensagens para o Event Viewer/Visualizador de Eventos do Windows. Assim, caso sua aplicação Node.js não esteja funcionando ou seu serviço não esteja inicializando, basta dar uma olhada lá, na seção Windows > Applications para entender o que está acontecendo.
Caso precise remover esse serviço (para instalar uma versão mais atualizada, por exemplo) rode o comando abaixo no cmd:
1 2 3 4 |
SC STOP servicename SC DELETE servicename |
Esse servicename você encontra nas propriedades do Windows Service que deseja excluir.
Opcionalmente, caso a sua máquina tenha várias CPUs e você queira aproveitar todo o poder de processamento dela, você pode colocar sua aplicação a rodar em cluster.
Bônus: PM2
PM2 é um projeto open-source criado e mantido pela empresa Keymetrics.io, que além do PM2 (que é gratuito) vende um serviço de gerenciamento de performance de aplicações Node.js homônimo. Só para você ter uma ideia do que o PM2 é hoje, são mais de 20M de downloads e empresas como IBM, Microsoft e PayPal usando, o que o torna, disparado, a melhor solução de process manager pra Node, muito mais do que seus principais concorrentes, o Forever e o Nodemon.
Abaixo, eu incluí um pequeno tutorial, que também pode ser assistido nesse vídeo do meu canal:
Pra usar o PM2 é muito simples, primeiro instale globalmente o módulo do PM2:
1 2 3 |
$ npm install pm2 -g |
Depois, quando quiser iniciar o processo da sua aplicação Node.js:
1 2 3 |
$ pm2 start myApp.js --name myApp |
A partir de agora este processo estará rodando “eternamente” com o nome de “myApp”. Opcionalmente você pode usar os comandos abaixo:
- pm2 ls: para listar os processos existentes;
- pm2 restart myApp: para reiniciar o processo myApp;
- pm2 stop myApp: para derrubar o processo myApp;
- pm2 delete myApp: para excluir o processo myApp;
- pm2 logs –lines 100: para exibir as últimas 100 linhas de logs dos processos;
Caso você utilize dotenv ou dotenv-safe, é importante que antes de inicializar a sua aplicação, que você rode o PM2 a partir da raiz da pasta do projeto em questão (basta usar cd), para que ele encontre os arquivos .env e .env.example (no caso de dotenv-safe).
Note também que, caso sua aplicação dependa de outros processos, como o MongoDB, por exemplo, eles também devem estar rodando como serviços/workers para que o seu sistema como um todo funciona corretamente. O PM2 pode ajudar nestes casos também, ele é bem genérico.
E para saber mais dos comandos possíveis, você pode estudar o guia oficial dele.
De nada! 😉
Curtiu o post? Então clica no banner abaixo e dá uma conferida no meu livro sobre programação web com Node.js!
Olá, tudo bem?
O que você achou deste conteúdo? Conte nos comentários.
Apesar da solução, de se utilizar de um serviço para hosting, funcionar, é sempre bom utilizar um webserver como proxy reverso para uma aplicação.
Dê uma olhada neste repositório: https://github.com/tjanczuk/iisnode/wiki
Neste wiki você encontra os motivos que comentei e uma forma de utilizar o IIS.
Sim, certamente uma solução mais profissional é colocar um IIS, Apache, etc na frente do Node. É assim que é feito na Umbler. Obrigado pela contribuição.
que boa explicacao… !!! não funcionou nem o node -v….dá erro
Se o node-v não funciona você não está com o Node.js corretamente instalado na sua máquina.
[…] custo de hardware (principalmente se estava usando Java antes) e software (se pagava licenças de servidor Windows). Só a questão de licença de Windows que você economiza em players de datacenter como Amazon […]
Com o tempo, o pm2 consome cada vez mais memória até travar a máquina da aws. Tem algo que pode ser feito para sanar este problema?
Isso não é problema no PM2, mas sim na sua aplicação. Vai ter de investigar o que está fazendo ela consumir cada vez mais memória até crashar. Pode usar a ferramenta de profiling nativa do Node ou ferramentas profissionais de mercado. Procure por memory profiling.