Node.js para administradores de sistema

O que é o node.js? É um event-driven I/O framework para o motor V8 JavaScript nas plataformas Unix-Like. Usado para escrever programas para rede escalável, como servidores web. Exemplo de aplicações onde é necessário assincronismo: Google Docs (você escreve e várias pessoas veem), chats, jogos, web analytics etc.

[ Hits: 16.629 ]

Por: Flavio Torres em 25/06/2011


Instalando o node.js



Pacotes necessários:

sudo apt-get install g++ curl libssl-dev apache2-utils

Vamos buscar o conteúdo diretamente no repositório git, para isto, precisamos:

sudo apt-get install git-core

Agora vamos fazer o clone do Node para instalação:

git clone https://github.com/joyent/node.git

Saída:

Cloning into node...
remote: Counting objects: 35981, done.
remote: Compressing objects: 100% (9717/9717), done.
remote: Total 35981 (delta 28725), reused 32630 (delta 25784)
Receiving objects: 100% (35981/35981), 20.91 MiB | 196 KiB/s, done.
Resolving deltas: 100% (28725/28725), done.

Cópia completa, agora iremos compilar:

cd node
$ ./configure


Saída:

Checking for program g++ or c++ : /usr/bin/g++
Checking for program cpp : /usr/bin/cpp
Checking for program ar : /usr/bin/ar
Checking for program ranlib : /usr/bin/ranlib
Checking for g++ : ok
Checking for program gcc or cc : /usr/bin/gcc
Checking for program ar : /usr/bin/ar
Checking for program ranlib : /usr/bin/ranlib
Checking for gcc : ok
Checking for library dl : yes
Checking for openssl : not found
Checking for function SSL_library_init : yes
Checking for header openssl/crypto.h : yes
Checking for library util : yes
Checking for library rt : yes
Checking for CLOCK_MONOTONIC : yes
--- libeio ---
Checking for library pthread : yes
Checking for function pthread_create : yes
Checking for function pthread_atfork : yes
Checking for futimes(2) : yes
Checking for readahead(2) : yes
Checking for fdatasync(2) : yes
Checking for pread(2) and pwrite(2) : yes
Checking for sendfile(2) : yes
Checking for sync_file_range(2) : yes
Checking for fdatasync(2) with c++ : yes
'configure' finished successfully (3.138s)

make
$ sudo make install


Já temos o node.js instalado:

node --version

Saída:

v0.5.0-pre

Instalando o NPM, gerenciador de pacotes node

curl http://npmjs.org/install.sh | sudo sh

Instalado, agora um exemplo para instalar um pacote utilizando o npm você só precisa digitar no terminal "npm pacote install", no exemplo abaixo irei instalar o express:

npm install express

mime@1.2.2 ./node_modules/express/node_modules/mime
connect@1.4.1 ./node_modules/express/node_modules/connect
qs@0.1.0 ./node_modules/express/node_modules/qs
express@2.3.4 ./node_modules/express

Hello Word em node.js!

Abra o arquivo hello.js e adicione o seguinte conteúdo:

// Le o modulo http para criar o httpserver
var http = require('http');

// Configura o HTTP server para responder com "hello word" para todas as requisições
var server = http.createServer(function (request, response) {
response.writeHead(200, {"Content-Type": "text/plain"});
response.end("Hello World\n");
});

// Listen na porta 8000, localhost
server.listen(8000);

// Imprime a mensagem no console dizendo que o node esta em execussão
console.log("Servidor executando em http://127.0.0.1:8000/");

node hello.js

Servidor executando em http://127.0.0.1:8000/

Agora abra seu navegador e veja :)

Em modo texto, temos:

curl http://0:8000

Saída:

Hello World

curl -I http://0:8000

Saída:

HTTP/1.1 200 OK
Content-Type: text/plain
Connection: keep-alive

Programando um servidor TCP em node.js

Vamos programar um servidor TCP que ficará escutando na porta 7000, responderá "hello word" e encerrará a conexão para qualquer conexão TCP:

Abra o arquivo nodetcp.js e adicione o seguinte conteúdo

// Carrega o modulo net para criar um servidor tcp
var net = require('net');
var sys = require('sys');

// Configura o servidor tcp
var server = net.createServer(function (socket) {

// Todas as vezes que alguém conectar, responda "hello" e feche a conexão
socket.addListener("connect", function () {
sys.puts("Connection from " + socket.remoteAddress);
socket.end("Hello World\n");
});
});

// Inicia o servidor escutando na porta 7000
server.listen(7000, "localhost");

// Imprime uma mensagem no terminal informando que o servidor está listening
console.log("TCP server ouvindo na porta 7000 localhost.");

node tcp.jsi

TCP server ouvindo na porta 7000 localhost.
Abra outro terminal e:

telnet localhost 7000

Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Hello World
Connection closed by foreign host.

No primeiro terminal:

node tcp.js

TCP server ouvindo na porta 7000 localhost.
Connection from 127.0.0.1

Node.js como um daemon no Ubuntu

Você já deve ter notado que sempre fazemos: node <script.js>, porém, e se quisermos algo mais profissional como um servidor?
Ah, usar o & e jogar para backgroud?

E se o node imprimir algo e o console for fechado, o STDOUT não existirá e o seu script será encerrado.
E se o processo for encerrado, e se o servidor for reiniciado?

Certo, precisamos de algo mais robusto, como um daemon! Mas, como estamos falando em node.js, que é baseado em eventos, que tal usar o upstart ? O upstart é baseado em eventos e substituto do sysvinit no RHEL 6 e do /sbin/init do Ubuntu.

Abra o arquivo /etc/init/nodetcp.conf e adicione o seguinte conteúdo:

description "node.js tcp server"
author "Flavio Torres, ftorres@ymail.com"

# Inicia e finaliza quando receber os comandos start e shutdown
start on started mountall
stop on shutdown

# Faz o Respawn automaticamente:
respawn
respawn limit 99 5

script
export HOME="/home/ftorres"

exec /usr/local/bin/node /home/ftorres/node/app/tcp.js >> /var/log/nodetcp.log 2>&1
end script

post-start script

# Aqui voce pode adicionar um script que irá notificar você que o node foi (re)iniciado
# /usr/local/bin/aviso.sh "node.js foi inciado"
end script

Torne seu script executável e...

Vendo o status do script:

status nodetcp
nodetcp stop/waiting

Iniciando o daemon:

sudo start nodetcp
nodetcp start/running, process 13651

status nodetcp
nodetcp start/running, process 13651

Vamos ver se o nosso tcpserver está listening na porta 7000?

netstat -tnlp

Saída:

(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:7000 0.0.0.0:* LISTEN -
tcp6 0 0 :::22 :::* LISTEN -
tcp6 0 0 ::1:631 :::* LISTEN -

Testando:

telnet localhost 7000

Saída:

Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Hello World
Connection closed by foreign host.

Ah-há, temos o nosso Hello World!

E o nosso log?

cat /var/log/nodetcp.log

TCP server ouvindo na porta 7000 localhost.
TCP server ouvindo na porta 7000 localhost.
TCP server ouvindo na porta 7000 localhost.
TCP server ouvindo na porta 7000 localhost.
Connection from 127.0.0.1

Fontes:
   

Páginas do artigo
   1. Instalando o node.js
Outros artigos deste autor

Business Intelligence - Pentaho 3.5 com PostgreSQL

Trabalhando com init no Debian

Leitura recomendada

O programa gwhois

Instalação do Varnish + Apache + Virtual Hosts

Criando sites com o Zope

Canal #Vivaolinux com bot interativo

Gravando mp3 usando o XMMS

  
Comentários
[1] Comentário enviado por vinipsmaker em 25/06/2011 - 17:30h

Utilizei o node.js no trabalho de programação 3 aqui na UFAL e achei a tecnologia muito interessante. Não só pela sua arquitetura, mas pela API bem definida e a quantidade até razoavelmente grande de módulos disponíveis.

Um dos módulos que vale a pena conhecer é o node-static, que implementar o padrão rfc 2616 e possui cache embutido:
https://github.com/cloudhead/node-static

Um vídeo que eu fiz do meu trabalho:
http://www.youtube.com/watch?v=0wznpdAOaFA

[2] Comentário enviado por bitetti em 07/12/2011 - 14:55h

Eu estava fazendo um teste com servidores e com pressa baixei o node.js.
Resolveu meu problema e até animei em montar um mecanismo de chat simples com cookies e etc. Tudo em 1 dia junto com o aprendizado.
E curti ele ter um tamanho reduzido.
Diferente do LightTPD não preciso incorporar um PHP.
É quase como ele fosse para servidores como o SQLite é para SGDBs.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts