Implementando un chat con node.js

Una de las ventajas que ofrece node.js es su naturaleza asíncrona y por lo tanto permite escalar fácilmente sin preocuparnos por sincrónizar procesos entre sí ya que no existen procesos una aplicación node.js consiste de un único hilo de ejecución. Una de las aplicaciones que más se beneficia de esta característica es justamente un chat y ha sido uno de los selling points favoritos de los evangelistas de node.js. Pero qué tan sincillo es programar un chat en node.js, pues bien como dice Eric Raymond en La Catedral y el Bazar: "Los buenos programadores saben qué código escribir. Los grandes programadores saben qué código reescribir". Así que para que empezar desde cero, he encontrado un muy buen esqueleto con que comenzar una aplicación de chat en Github, escrita por desarrollador llamado William Mora.

Como es obvio vamos a necesitar un servidor donde desplegar nuestra aplicación, existen varias opciones desde las gratuitas como Heroku, hasta las pagadas y super escalables como Amazon EC2, para nuestro caso usaré una instancia mini del proveedor donde trabajo OpenVirtuals.com. Los 256 MB que ofrece y los dos núcleos que ofrece esta opción son más que suficientes para atender decenas de usuarios concurrentes.

Este es un breve tutorial que explica como tener nuestro chat corriendo y se ofrecen las pautas generales de como modificar el look del chat. Este no es un proyecto final, no se cubren temas sobre como preparar node.js para escalar o protegerlo contra ataques.

Primero comencemos por descargar nuestro chat y tenerlo corriendo, es algo que lograremos con los siguentes comandos:

git clone https://github.com/wmora/nodejs-express-socketio-chatroom.git

cd nodejs-express-socketio-chatroom

npm install

npm -g install forever

Aunque el módulo Forever no es técnicamente necesario para la ejecución de nuestro chat, es importante instalarlo si tenemos pensado dejar corriendo nuestro chat incluso si nos deslogueamos de nuestra consola.

Ahora ya estamos listos para arrancar nuestro chat con "Forever" usando este comando:

forever start server.js

¿Cómo sabemos que nuestro chat está corriendo?, bueno la forma más sencilla es abriendo nuestro navegador y apuntando al URL de nuestro chat, pero la otra opción es usar Forever para ver el status de los procesos que está corriendo:

forever list
info:    Forever processes running
data:        uid  command             script    forever pid   logfile                      uptime       
data:    [0] oFfy /usr/local/bin/node server.js 31025   31027 /home/chat/.forever/oFfy.log 0:0:12:8.220 

Si deseamos detener nuestro chat, sólo debemos usar este comando:

	forever stop server.js

Ahora toca hacer público nuestro chat, para ello usaremos Nginx como proxy inverso para nuestro proyecto. Igualmente necesitamos asignarle un nombre para que sea fácilmente accesible, en particular a esta prueba le he puesto el nombre "chat.cix.pe" o alternativamente  "www.chat.cix.pe". Para lo primero siguiendo los pasos descritos en un post anterior debemos editar el archivo "/etc/nginx/sites-available/default" y poner esto dentro del mismo:

upstream chat {
         # Point to our internal chat port
         server 127.0.0.1:8080 max_fails=0 fail_timeout=10s weight=1;

         # Send visitors back to the same server each time.
         ip_hash;

         # Enable number of keep-alive connections.
         keepalive 512;
}

server {
        listen   80; ## listen for ipv4; this line is default and implied
        #listen   [::]:80 default ipv6only=on; ## listen for ipv6

        root /usr/share/nginx/www;
        index index.html index.htm;

        server_name chat.cix.pe www.chat.cix.pe;

        # Timeout for closing keep-alive connections.
        keepalive_timeout 10;

        # Enable gzip compression.
        gzip on;
        gzip_http_version 1.1;
        gzip_vary on;
        gzip_comp_level 6;
        gzip_proxied any;
        gzip_buffers 16 8k;
        gzip_disable "MSIE [1-6]\.(?!.*SV1)";

        location / {
              # Set this to your upstream module.
              proxy_pass http://chat;
              # Proxy headers.
              proxy_set_header X-Real-IP $remote_addr;
              proxy_set_header X-Forwarded-Proto $scheme;
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_set_header Host $host;
              proxy_set_header X-NginX-Proxy true;
              proxy_set_header Upgrade $http_upgrade;
              proxy_set_header Connection "upgrade";
              proxy_cache_bypass $http_upgrade;
              proxy_http_version 1.1;
              proxy_redirect off;
              # Go to next upstream after if server down.
              proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
              proxy_connect_timeout 5s;
              # Gateway timeout.
              proxy_read_timeout 20s;
              proxy_send_timeout 20s;
              # Buffer settings.
              proxy_buffers 8 32k;
              proxy_buffer_size 64k;
        }

        location /socket.io {
              proxy_pass http://chat;
        }

 

}

Una vez editado el archivo podemos reiniciar nuestro Nginx con el siguiente comando y estamos listos para chatear.

Cómo he explicado esto es sólo una demostración y no pretende ser un proyecto 100% terminado aún hay varias cosas que optimizar y asegurar aquí, pero espero que le sirva al lector como una guía práctica de cómo tener un chat escrito en node.js corriendo en un VPS con limitados recursos. Por lo pronto los espero en el chat chat.cix.pe.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.