Cloud Computing

10 jul, 2014

Configurando NodeJS em produção em um Cloud Server

Publicidade

A ideia de poder utilizar apenas JavaScript tanto no client-side quanto no servidor é o trending do momento. NodeJS está aí, e já vemos grandes cases de empresas migrando plataformas, escalando e reduzindo custos.

Mas e como colocaremos em produção? Usarei neste artigo um Cloud Server Pro da Locaweb, com o Sistema Operacional Debian com configuração mínima 512 MB de RAM, e você pode usar estes passos para instalar em qualquer máquina Debian, ou em outra distribuição Linux, com algumas diferenças.

Depois de conseguir acesso ssh ao seu servidor, via chave privada, vamos passar por todos os passos até você conseguir utilizar uma aplicação em produção, na porta 80.

Preparando para instalar

Vamos precisar do python e do wget, e vamos instalá-los:

apt-get install wget python vim

Eu sempre instalo o VIM, pois estou mais familiarizado com ele.

Instalando o NodeJS

Copie o link de download do source code mais atual no site do NodeJS.

No momento em que escrevo este artigo, a versão é 10.26.

Vamos baixar diretamente para o servidor utilizando wget

wget http://nodejs.org/dist/v0.10.26/node-v0.10.26.tar.gz

Depois decompactamos:

tar xvf node-v0.10.26.tar.gz

Pressione TAB após digitar “node” para completar o nome do arquivo.

pushd node-v0.10.26

Digite apenas “node” e pressione TAB novamente.

Execute cada um dos comandos abaixo individualmente, esperando o anterior terminar para enviar o próximo

./configure

make

make install

Após alguns minutos para testar, digite apenas

node -v

No terminal, você deverá ver algo como:

v0.10.26

Tudo certo, NodeJS instalado e funcionando. Após isso, você pode apagar o diretório que usamos e o tar que foi baixado:

rm -r node-v0.10.26*

Hello World

Nesse ponto, você pode subir a aplicação NodeJS que desenvolveu localmente, utilizando um git clone, rsync ou outra forma de deploy que preferir.

Vou fazer um Hello World bem simples com o Express para continuarmos a ver como deixar o servidor rodando e configurar as dependências.

Instale o expressjs globalmente:

npm install -g express

Iremos utilizar o diretório:

/var/www/seusite.com.br

Como root da aplicação. Dentro dele, crie um arquivo chamado app.js com o seguinte conteúdo:

var express = require("express"),

   app = express();

app.get('/', function(req, res){

res.send('Hello World');

});

app.get('/node', function(req, res){

   res.send('/node');

});

app.listen(3002);

Criei apenas duas rotas para testarmos a aplicação.

Feito isso, deixe uma aba rodando o servidor Node, com o comando:

node app.js

E em outra aba ssh, faça um teste com o comando:

curl http://localhost:3002

O output do terminal será um “Hello World” como escrevemos no app.js

Nginx como proxy reverso

Deixamos a aplicação node rodando na porta 3002 (escolha qualquer porta de número alto) e, para acessarmos via http, a partir do browser, vamos utilizar o nginx como proxy reverso, escutando a porta 80 para direcionar as requisições para o node.

Por boa prática, sempre configure o seu firewall para bloquear todas as outras portas, liberando somente aquelas que forem necessárias, como a 80 do http, e a 22, caso você não tenha mudado a porta do seu ssh.

apt-get install nginx

Caso tenha algum problema na instalação de algum pacote, limpe tudo daquela instalação usando um

apt-get purge nome_do_pacote

Assim, além de desinstalar, vai limpar todos os vestígios dele.

Depois de instalado, vamos configurar o nginx. Crie o arquivo “seusite” no diretório /etc/nginx/sites-available, com o conteúdo abaixo:

server {

   listen         80;

   server_name seusite.com.br;

   root /var/www/seusite.com.br/;

   if ($http_host != "seisite.com.br") {

         rewrite ^ http://seusite.com.br$request_uri permanent;

   }

   location / {

       proxy_set_header X-Real-IP $remote_addr;

       proxy_set_header X-Forwarded-For $remote_addr;

       proxy_set_header Host $host;

       proxy_pass http://localhost:3002;

   }

   location ~* \.(?:ico|css|js|gif|jpe?g|png|ttf|woff)$ {

       access_log off;

       expires 30d;

       add_header Pragma public;

       add_header Cache-Control "public, mustrevalidate, proxy-revalidate";

       proxy_pass http://localhost:3002;

   }

   location = /robots.txt { access_log off; log_not_found off; }

   location = /favicon.ico { access_log off; log_not_found off; }

   location ~ /\.ht {

           deny all;

   }

}

Vamos deixar o nginx escutando a porta 80, então se por acaso você já tiver um apache ou outro servidor nessa porta pare ele, no caso do apache, basta digitar no terminal:

service apache2 stop, ou apachectl stop

Faça um link simbólico do arquivo para a pasta sites-enabled:

ln -s /etc/nginx/sites-available/seusite /etc/nginx/sites-enabled/seusite

Nessa parte, a estrutura do nginx é bem igual à do apache.

E então iniciamos o nginx com:

/etc/init.d/nginx start

Feito isso, caso a aba com node app.js ainda esteja em execução, você já conseguirá acessar o nosso Hello World pelo browser, passando pelo nginx, e o último passo para deixar em produção é usar um serviço para que você não precise ficar com o terminal aberto, para rodar o servidor node.

Usando o Forever

Instale-o via npm

npm install -g forever

Basicamente, você usará poucos comandos dele por enquanto:

  • forever list – mostra todos as aplicações node que estão em execução
  • forever start/stop – inicia ou para um servidor node
  • forever restartall – reinicia todas as aplicações

E como eu não iniciei o forever com watch, a cada alteração que você fizer nos arquivos precisará reiniciá-lo.

É isso, pessoal, temos um servidor Debian rodando NodeJS na porta 3002, com o nginx como proxy reverso na porta 80!
Até a próxima!

***

Artigo publicado originalmente da Revista iMasters de maio.