Hace mucho que no escribo un post y justo ayer tuve que levantar un VPS como servicio para sacar screen-shots de sitios web así que dejó una pequeña guía para tenerlo funcionando en un sistema operativo Ubuntu 14.04 LTS, y de paso actualizo el viejo post.

Asumo que tenemos acceso por SSH al server como root, o al menos con privilegios para sudo.

Instalamos NodeJS

Desde el ubuntu package manager:

sudo apt-get update
sudo apt-get install nodejs npm

Al instalar desde los paquetes de Ubuntu, nodejs no nos va a quedar como node, sino como nodejs, así que creamos un link simbólico (symlink) para poder usar node.

ln -s /usr/bin/nodejs /usr/bin/node
node --version

Actualizamos NPM a la última versión:

npm install -g npm
npm --version

Es muy loco como se actualiza npm, si lo vemos en detalle usamos npm para instalar npm en sí mismo y en forma global, lo que termina resultando en la actualización a la última versión

Instalamos NGINX

sudo apt-get install nginx

Y lo configuramos para que funcione como servicio de Ubuntu (lo mas probable es que ya esté configurado al instalar, pero por si las dudas).

sudo update-rc.d nginx defaults

Esto nos asegura que al reiniciar el servidor NGINX vuelva a levantar solo.
Probamos que ya esté en funcionamiento abriendo el navegador y pateando la url http://[IP_pública_del_servidor] deberíamos ver un mensaje de bienvenida a nginx.

Configuramos NGINX para que sirva a nodejs

NGINX nos pone a disposición 2 directorios importantes para manejar los servidores:

  • /etc/nginx/sites-enabled/
  • /etc/nginx/sites-available/

En sites-available vamos a tener las configuraciones de los servidores y en sites-enabled links simbólicos a esas configuraciones, de esta manera podemos manejar que servidores son accesibles manteniendo su configuración.

Así que utilicemos el default que viene (donde apunta a la bienvenida que vimos al instalar) para crear un server:

cp /etc/nginx/sites-available/default /etc/nginx/sites-available/fernetjs.com

Ahora abrimos la nueva configuración de servidor y la modificamos a un servidor nodejs:

vim /etc/nginx/sites-available/fernetjs.com

Vamos a ver algo como lo siguiente:

server {
        listen 80 default_server;
        listen [::]:80 default_server ipv6only=on;

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

        # Make site accessible from http://localhost/
        server_name localhost;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ /index.html;
                # Uncomment to enable naxsi on this location
                # include /etc/nginx/naxsi.rules
        }
}

Lo modificamos para que cumpla con nuestro dominio cambiando default_server y agregando el proxy a un futuro proceso node que vamos a ver mas adelante:

server {
    listen 80;
    listen [::]:80 ipv6only=on;

    server_name fernetjs.com www.fernetjs.com;

    access_log /var/log/nginx/fernetjs.com.access.log;

    location / {
        proxy_pass http://localhost:3000/;
        proxy_set_header Host $host;
    }
}

Ahora tenemos un servidor que escucha en el puerto 80 de nginx y sólo cuando se ingresa por el dominio fernetjs.com o www.fernetjs.com va a utilizar el servidor web de node que tengamos corriendo en el puerto 3000.

Por último creamos el link simbólico a el nuevo server en sites-enabled y le avisamos a nginx que recargue las configuraciones:

ln -s /etc/nginx/sites-available/fernetjs.com /etc/nginx/sites-enabled/fernetjs.com
nginx -s reload

Levantamos los procesos nodejs como servicios

Nos queda tener algo que mantenga a los servidores web de nodejs corriendo y en modo de servicios de sistema operativo, así que instalamos forever y forever-service

npm install -g forever forever-service

Suponiendo que tenemos un proyecto express de nodejs instalado en /usr/local/fernetjs:
Creamos el servicio y lo corremos en el puerto 3000:

cd /usr/local/fernetjs/
sudo forever-service install fernetjs --script ./bin/www -e "NODE_ENV=production PORT=3000" --start

Para manejar los servicios de nodejs:

  • Start – “sudo start fernetjs”
  • Stop – “sudo stop fernetjs”
  • Status – “sudo status fernetjs”
  • Restart – “sudo restart fernetjs”

Si queremos ver los logs o listar lo que tenemos en forever podemos seguir utilizando:

sudo forever list
sudo forever logs [indíce]

A partir de ahora si reiniciamos el servidor no necesitamos levantar los servidores nodejs, correr forever de nuevo, etc 😉