¿Cómo implementar una aplicación en Node.js para su producción con Ubuntu 14.04?

¿Cómo implementar una aplicación en Node.js para su producción con Ubuntu 14.04?

Actualizado el 11 de octubre, 2016. Por BlueHosting.
Node.js es un entorno en tiempo de ejecución basado en el lenguaje JavaScript que permite la fácil construcción de aplicaciones del lado del servidor. La plataforma se puede ejecutar en Linux, OS X, FreeBSD y Windows y sus aplicaciones están escritas en JavaScript. Las aplicaciones de Node.js pueden ser ejecutadas en la línea de comandos pero le mostraremos cómo ejecutarlas como un servicio, de manera que se inicien tras un reinicio del servidor o después de un fallo. Así pues, podrá usarlas en un ambiente real de producción.
En este tutorial, cubriremos la implementación de un entorno Node.js listo para su producción, el cual estará compuesto de dos servidores con Ubuntu 14.04: un servidor ejecutará las aplicaciones Node.js gestionadas por PM2, mientras que el otro servidor proveerá a los usuarios con acceso a la aplicación a través de un proxy Nginx inverso al servidor de aplicación.

Requisitos previos

Esta guía usa dos servidores con distribuciones Ubuntu 14.04. Ambos servidores están en una red privada (en el mismo datacenter). Se hará referencia a ellos usando los siguientes nombres:
  • app: el servidor donde se instalará el Node.js en tiempo de ejecución, la aplicación Node.js y el software PM2;
  • web: el servidor donde se instalará el servidor web Nginx, el cual actuará como proxy inverso para su aplicación. Los usuarios accederán a la dirección IP pública de este servidor para llegar a su aplicación Node.
Es posible usar un solo servidor para este tutorial, pero tendrá que hacer algunos cambios en el camino. Simplemente use la dirección IP de localhost (generalmente 127.0.0.1), en los casos en que se utilice la dirección IP privada del servidor app.
Antes de comenzar con esta guía, debe tener un usuario regular no root con privilegios sudo en ambos servidores. Este será el usuario con el cual debe iniciar sesión en sus servidores. Puede seguir nuestro tutorial de configuración inicial para un servidor con Ubuntu 14.04para más información.
Comencemos con la instalación de Node.js en tiempo de ejecución en nuestro servidor app.

Instalar Node.js

Instalaremos la última versión con soporte de Node.js en nuestro servidor app.
En el servidor app, actualicemos todos los paquetes instalados utilizando el siguiente comando:
sudo apt-get update
Luego utilice apt-get para instalar el paquete git, del cual depende npm:
sudo apt-get install git
Diríjase a la página de descargas de Node.js y halle el enlace de descarga para los paquetes Linux Binaries (cuyo formato es .tar.xz). Haga clic derecho y copie la dirección del enlace. Al momento de la adaptación de este tutorial la última versión LTS de Node.js era la versión v4.6.0. Si prefiere instalar la última versión de Node.js (sin soporte), visite la siguiente página y copie el enlace correspondiente.
Cambia a su directorio home y descargue los archivos fuente de Node.js usando wget. Pegue el enlace de descarga que copió en el paso anterior y péguelo en lugar del enlace mostrado a continuación (en caso de que exista una versión más reciente):
cd ~
wget https://nodejs.org/dist/v6.7.0/node-v6.7.0-linux-x64.tar.xz
Ahora extraiga el archivo tar que acaba de descargar en el directorio node con estos comandos:
mkdir node
tar xvf node-v*.tar.?z --strip-components=1 -C ./node
Si desea borrar el archivo Node.js que descargó —debido a que no lo necesita— cambie a su directorio home y utilice el comando rm:
cd ~
rm -rf node-v*
Ahora, configuraremos el prefix global de npm, donde npm creará enlaces simbólicos en los paquetes de Node instalados, hacia algún lugar que esté en su ruta predeterminada. Lo configuraremos hacia /usr/local usando este comando:
mkdir node/etc
echo 'prefix=/usr/local' > node/etc/npmrc
Ahora estamos listos para mover los binarios node y npm a nuestra ubicación de instalación. Los moveremos a la ruta /opt/nodecon este comando:
sudo mv node /opt/
En este punto, debe hacer que root sea el propietario de los archivos:
sudo chown -R root: /opt/node
Por último, crearemos los enlaces simbólicos de los binarios de node y npm en su ruta predeterminada. Los colocaremos en /usr/local/bin:
sudo ln -s /opt/node/bin/node /usr/local/bin/node
sudo ln -s /opt/node/bin/npm /usr/local/bin/npm
Puede comprobar si Node está instalado consultando su versión a través del siguiente comando:
node -v
Debe obtener una salida simple con el número de versión:
v6.7.0
¡Ahora Node.js está instalado para su uso en tiempo de ejecución y está listo para ejecutar una aplicación! Llegó el momento de escribir una aplicación simple en Node.

Crear una aplicación Node.js

Ahora crearemos una aplicación sencilla "Hola mundo" que solo devuelve los caracteres Hola mundo a cualquier solicitud HTTP. Esto es una aplicación de muestra que le ayudará a configurar su Node.js, evidentemente querrá remplazar esta muestra con su propia aplicación —solo debe asegurarse de modificar su aplicación para que escuche en las direcciones IP y puertos adecuados—.
Debido a que queremos que nuestra aplicación de Node.js sirva a las solicitudes que vengan de un servidor proxy inverso (web), usaremos la interfaz de red privada de nuestro servidor app para la comunicación entre los servidores. Busque la dirección de red privada del servidor app y cópiela para continuar con el resto del tutorial.

Código de "Hola mundo"

Luego, cree y abra la aplicación Node.js para editarla. En este tutorial, usaremos el editor vi para editar nuestra aplicación de muestra llamada hola.js:
cd ~
vi hola.js
Inserte el siguiente código en el archivo, y asegúrese de sustituir la dirección IP privada del servidor app en todas las ocurrencias de DIRECCION_IP_PRIVADA_APP. Si lo desea, también puede remplazar el puerto 8080 en ambas ocurrencias (asegurándose de usar un puerto no administrativo, por ejemplo: 1024 o mayor).
vi hola.js
Para entrar en el modo de inserción presione la tecla i, luego podrá pegar el siguiente código:
Extracto del archivohola.js
var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hola mundo\n');
}).listen(8080, 'DIRECCION_IP_PRIVADA_APP');
console.log('El servidor se está ejecutando en http://DIRECCION_IP_PRIVADA_APP:8080/');
Luego guarde y salga. Una forma de hacerlo es salir del modo de edición usando la tecla ESC y luego presionar :wq. Pulse Enter para terminar.
Esta aplicación de Node.js simplemente escucha en el puerto y dirección IP especificados y devuelve la cadena de caracteres Hola mundo con un código exitoso (HTTP 200). Esto significa que la aplicación solo se puede alcanzar desde servidores en la misma red privada, tal como hemos expuesto anteriormente.

Probar la aplicación (opcional)

Si quiere probar si su aplicación funciona, ejecute este comando de node en el servidor app:
node hola.js
Nota: ejecutar una aplicación de Node.js bajo este método bloqueará cualquier comando adicional hasta que mate la aplicación usando CTRL + C.
Para probar la aplicación, abra otra sesión del terminal o SSH y conéctese a su servidor web. Debido a que el servidor web está en la misma red privada, debe ser capaz de llegar a la IP privada del servidor app usando curl.
Primero instale el programa curl en su servidor:
sudo apt-get install curl
Luego ejecute el siguiente comando. Asegúrese de sustituir el valor DIRECCION_IP_PRIVADA_APP con la dirección IP privada del servidor app (y el puerto —en caso de haberlo cambiado—):
curl http://DIRECCION_IP_PRIVADA_APP:8080
Si usted observa la siguiente salida, la aplicación está funcionando correctamente y escuchando en el puerto y dirección IP especificados:
Hola mundo
Si usted no ve una salida adecuada, asegúrese de que su aplicación Node.js se esté ejecutando. También puede verificar los puertos y la dirección IP en busca de alguna incongruencia.
Al finalizar, asegúrese de matar la aplicación en el servidor app presionando CTRL + C.

Instalar PM2

Ahora instalaremos PM2, que es un gestor de procesos para aplicaciones de Node.js. PM2 provee una forma fácil de gestionar y demonizar las aplicaciones, o en otros palabras, ejecutarlas como un servicio.
Usaremos el gestor de Módulos NPM, que no es más que el gestor de paquetes para los módulos Node que se instalan con Node.js. Para instalar PM2 en nuestro servidor app utilice este comando:
sudo npm install pm2 -g

Administrar aplicaciones con PM2

PM2 es muy simple y fácil de usar. Cubriremos algunos usos básicos de este gestor.

Iniciar la aplicación

Lo primero que querremos hacer es usar el comando pm2 start para ejecutar nuestra aplicación hola.js en segundo plano:
pm2 start hola.js
Esto también agrega su aplicación a la lista de procesos de PM2, que se imprime cada vez que inicia una aplicación, en nuestro caso —si es la primera vez que ejecuta una aplicación— se imprimirá lo siguiente:
┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────┬───────────┬──────────┐
│ App nameidmodepidstatusrestartuptimecpumemwatching │
├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────┼───────────┼──────────┤
│ hola     │ 0  │ fork │ 2337 │ online │ 0       │ 0s     │ 4%  │ 14.6 MBdisabled │
└──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────┴───────────┴───
Como puede observar, PM2 asignó automáticamente un nombre de aplicación (con base en el nombre del archivo, sin la extensión .js) y un id con el que PM2 identificará la aplicación. PM2 también mantiene información adicional, como el PID del proceso, su estatus actual y el uso de memoria.
Las aplicaciones que se están ejecutando bajo PM2 serán reiniciadas automáticamente si la aplicación se cierra inesperadamente o si se mata el proceso asociado, pero aún necesitamos seguir algunos pasos adicionales para que la aplicación se inicie automáticamente tras un reinicio o inicio del servidor. Afortunadamente, PM2 también nos da un método sencillo de lograr esto a través del subcomando startup.
El subcomando startup genera y configura un script de arranque que ejecuta el programa PM2 y todos sus procesos administrados tras el inicio del servidor. También debe especificar la plataforma en la cual está trabajando, en nuestro caso es ubuntu:
pm2 startup ubuntu
Al ejecutar este comando obtendremos una salida similar a la siguiente. La última línea de esta salida incluirá un comando (solo ejecutable con privilegios de superusuario) que debe copiar y ejecutar después:
[PM2] You have to run this command as root. Execute the following command:
      sudo su -c "env PATH=$PATH:/opt/node/bin pm2 startup ubuntu -u johel --hp /home/johel"
Ejecute el comando que fue generado en su servidor (será similar al mostrado aquí) para configurar el arranque de PM2 tras el inicio del servidor:
sudo su -c "env PATH=$PATH:/opt/node/bin pm2 startup ubuntu -u johel --hp /home/johel"

Otros usos de PM2 (opcional)

PM2 proporciona muchos subcomandos que permiten una gestión y búsqueda de información sobre sus aplicaciones. Un dato interesante, es que al ejecutar pm2 sin ningún argumento, se mostrará una página de ayuda que incluyen algunos ejemplos de uso, cubriendo el uso de este gestor detalladamente.
Detenga una aplicación usando el siguiente comando (especifique el nombre real de la aplicación o el ID):
pm2 stop ejemplo
Digamos que queremos detener nuestra aplicación, usaríamos:
pm2 stop hola
Reinicie una aplicación con este comando (especificando el nombre de la aplicación o el ID asignado por PM2):
pm2 restart ejemplo
La lista de aplicaciones que administra nuestro PM2 puede ser obtenida a través del subcomando list:
pm2 list
Para más información sobre una aplicación específica puede usar el comando info (especificando con el nombre de la aplicación o el ID asignado por PM2):
pm2 info ejemplo
El monitor de procesos PM2 puede ser llamado con el subcomando monit. Este muestra el estatus, uso de CPU y uso de memoria de las aplicaciones ejecutadas con PM2:
pm2 monit
Ahora que su aplicación de Node.js está en ejecución, y es gestionada por el programa PM2, configuremos el proxy inverso.

Configurar el servidor proxy inverso

Ahora que su aplicación se está ejecutando y está escuchando en una dirección IP privada, necesita configurar una forma para que los usuarios puedan acceder a tal aplicación. Configuraremos un servidor web Nginx como proxy inverso para este propósito. Este tutorial explica cómo configurar el servidor Nginx desde cero. Si ya tiene un servidor Nginx configurado, solo tiene que copiar el bloque location en el bloque del servidor de su preferencia (asegúrese de que la ubicación no genere conflictos con cualquier contenido existente en su servidor web):
Actualicemos los paquetes del servidor web usando el siguiente comando de apt-get:
sudo apt-get update
Luego instale Nginx usando apt-get:
sudo apt-get install nginx
Ahora abra el archivo de configuración predeterminado para el bloque del servidor.
sudo apt-get install nginx
Elimine todo el contenido del archivo y copie la siguiente configuración tal como se muestra. Asegúrese de sustituir su propio nombre de dominio en la directiva server_name (o su dirección IP si no aún no posee un nombre de dominio). También debe sustituir la dirección IP privada del servidor app especificada aquí como DIRECCION_IP_PRIVADA_APP. Opcionalmente, cambie el puerto 8080 si su aplicación está configurada para escuchar en un puerto distinto:
Extracto del archivo/etc/nginx/sites-available/default
server {
    listen 80;

    server_name ejemplo.com;

    location / {
        proxy_pass http://DIRECCION_IP_PRIVADA_APP:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}
Esto configura el servidor web para que responda a las solicitudes en su dirección principal. Asumiendo que nuestro servidor está disponible en ejemplo.com, acceder a través de la dirección http://ejemplo.com/ en un navegador web enviaría la solicitud a la dirección IP privada del servidor de aplicación en el puerto 8080, la cual sería recibida y respondida por la aplicación Node.js.
Puede añadir bloques location adicionales en el mismo bloque del servidor para proporcionar acceso a otras aplicaciones dentro del mismo servidor web. Por ejemplo, si también estuviera otra aplicación de Node.js en el mismo servidor app, pero en el puerto 8081, podría añadir este bloque location para permitir el acceso a través de http://ejemplo.com/app2 (por ejemplo):
Extracto del archivo: bloque adicional en /etc/nginx/sites-available/default
    location /app2 {
        proxy_pass http://DIRECCION_IP_PRIVADA_APP:8081;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
Una vez que termine de añadir los bloques location para todas sus aplicaciones, guarde la configuración y salga del archivo.
En el servidor web, reinicie Nginx:
sudo service nginx restart
Asumiendo que su aplicación de Node.js está en ejecución, y que las configuraciones de Nginx y de su aplicación son correctas, debería poder acceder a la aplicación a través del servidor web con proxy inverso. Inténtelo accediendo a la URL del servidor web (usando la dirección IP o el nombre de dominio).

Conclusión

¡Felicidades! Ahora tiene una aplicación en Node.js ejecutándose detrás de un proxy Nginx inverso a través de dos servidores con Ubuntu 14.04. Esta configuración de proxy inverso es lo suficientemente flexible como para proveer a sus usuarios el acceso a otras aplicaciones o a contenido web estático que usted desee compartir. ¡Buena suerte con su desarrollo en Node.js!

Recursos adicionales

Este es un tutorial básico, pero su enfoque práctico es bastante útil para comenzar con el despliegue de aplicaciones en Node.js. Con algunos cambios simples, puede utilizar este tutorial para prácticamente cualquier distribución de Linux. Puede consultar los siguientes recursos en busca de información adicional con respecto a este tema. Aunque este material es provisto esperando que sea útil, tenga en cuenta que no podemos dar fe de la actualidad o precisión de los contenidos externos.
SHARE

Oscar perez

Arquitecto especialista en gestion de proyectos si necesitas desarrollar algun proyecto en Bogota contactame en el 3006825874 o visita mi pagina en www.arquitectobogota.tk

  • Image
  • Image
  • Image
  • Image
  • Image
    Blogger Comment
    Facebook Comment

0 comentarios:

Publicar un comentario