Cómo configurar una aplicación Node.js para producción en Ubuntu

Introducción

Node.js es un entorno de tiempo de ejecución Javascript de código abierto para crear fácilmente aplicaciones de servidor y de red. La plataforma se ejecuta en Linux, OS X, FreeBSD y Windows, y sus aplicaciones están escritas en JavaScript. Las aplicaciones Node.js pueden ejecutarse en la línea de comandos, pero te enseñaremos cómo ejecutarlas como un servicio, de modo que se reiniciarán automáticamente al reiniciarse o fallar, para que puedas usarlas en un entorno de producción.

En este tutorial, cubriremos la configuración de un entorno Node.js listo para la producción que se compone de dos servidores Ubuntu 14.04; un servidor ejecutará las aplicaciones Node.js administradas por PM2, mientras que el otro brindará a los usuarios acceso a la aplicación a través del proxy inverso Nginx al servidor de aplicaciones.

Prerrequisitos

Esta guía utiliza dos servidores Ubuntu 14.04 con redes privadas (en el mismo centro de datos). Nos referiremos a ellos por los siguientes nombres:

  • app: el servidor donde instalaremos el tiempo de ejecución Node.js, su aplicación Node.js y PM2
  • web: el servidor donde instalaremos el servidor web Nginx, que actuará como un proxy inverso para tu aplicación. Los usuarios accederán a la dirección IP pública de este servidor para acceder a tu aplicación Node.js.

Es posible usar un solo servidor para este tutorial, pero tendrás que hacer algunos cambios en el camino. Simplemente usa la dirección IP del local host, es decir 127.0.0.1, donde se utilice la dirección IP privada del servidor app.

Aquí hay un diagrama de lo que será tu configuración después de seguir este tutorial:

configurar node en ubuntu

Antes de comenzar esta guía, debes tener un usuario regular, no root, con privilegios sudo configurados en ambos servidores: este es el usuario con el que debes iniciar sesión en tus servidores. Puedes aprender cómo configurar una cuenta de usuario regular siguiendo una guía básica en internet.

Si deseas poder acceder a tu servidor web a través de un nombre de dominio, en lugar de tu dirección IP pública, debes comprar un nombre de dominio.

Comencemos instalando el tiempo de ejecución Node.js en el servidor de app.

Instalar Node.js

Instalaremos la última versión LTS de Node.js, en el servidor app.

En el servidor de app, actualicemos las listas de paquetes apt-get con este comando:

Luego usa apt-get para instalar el paquete git, que depende de npm:

Dirígete a la página de descargas de Node.js y encuentra el enlace de descarga de Binarios de Linux (.tar.xz). Has clic derecho en él y copia la dirección de enlace en tu portapapeles. En el momento de escribir este artículo, la última versión de LTS es 4.2.3. Si prefieres instalar la última versión estable de Node.js, ve a la página correspondiente y copia ese enlace.

Cambia a tu directorio de inicio y descarga la fuente Node.js con wget. Pega el enlace de descarga en lugar de la parte resaltada:

Ahora debes extraer el archivo tar que acabas de descargar en el directorio node con estos comandos:

Si deseas eliminar el archivo Node.js que descargaste, ya que ya no lo necesitamos, cambia a tu directorio de inicio y usa el comando rm:

A continuación, configuraremos el prefix global de npm, donde npm creará enlaces simbólicos a los paquetes de Node instalados, en algún lugar que se encuentre en su ruta predeterminada. Lo configuraremos en /usr/local con este comando:

Ahora estamos listos para mover los binarios node y npm a nuestra ubicación de instalación. Lo moveremos a /opt/node con este comando:

En este punto, es posible que desees que root sea el propietario de los archivos:

Por último, vamos a crear enlaces simbólicos de los binarios nodenpm en tu ruta predeterminada. Pondremos los enlaces en /usr/local/bin con estos comandos:

Verifica que Node esté instalado verificando tu versión con este comando:

¡El tiempo de ejecución Node.js ahora está instalado y listo para ejecutar una aplicación! Vamos a escribir una aplicación Node.js.

Crear aplicación Node.js

Ahora crearemos una aplicación Hola mundo que simplemente devuelve “Hola Mundo” a cualquier solicitud HTTP. Esta es una aplicación de muestra que te ayudará a configurar tu Node.js, que podrás reemplazarlo con tu propia aplicación; solo asegúrate de modificar tu aplicación para escuchar en las direcciones IP y los puertos apropiados.

Porque queremos que nuestra aplicación Node.js muestre peticiones que provienen de nuestro servidor proxy inverso, web, vamos a utilizar nuestro server app de interfaz de red privada del servidor para la comunicación entre servidores. Busca la dirección de red privada de tu servidor app.

Si estás utilizando un droplet como tu servidor, puedes buscar la dirección IP privada del servidor a través del servicio de metadatos. En el servidor app, usa el comando curl para recuperar la dirección IP ahora:

Querrás copiar la salida (la dirección IP privada), ya que se usará para configurar nuestra aplicación Node.js.

Código de Hola Mundo

A continuación, crea y abre tu aplicación Node.js para editarla. Para este tutorial, usaremos vi para editar una aplicación de ejemplo llamada hello.js:

Inserta el siguiente código en el archivo y asegurate de sustituir la dirección IP privada del servidor app por los dos elementos resaltados APP_PRIVATE_IP_ADDRESS. Si lo deseas, también puedes reemplazar el puerto resaltado 8080, en ambas ubicaciones (asegúrate de usar un puerto que no sea de administración, es decir, 1024 o superior):

Debes guardar y salir del archivo

Esta aplicación Node.js simplemente escucha en la dirección IP y el puerto especificados, y devuelve “Hola Mundo” con un código de éxito HTTP 200. Esto significa que solo se puede acceder a la aplicación desde servidores en la misma red privada, como nuestro servidor web.

Aplicación de prueba (opcional)

Si deseas probar si tu aplicación funciona, ejecuta este comando node en el servidor app:

Nota: la ejecución de una aplicación Node.js de esta manera bloqueará los comandos adicionales hasta que la aplicación finalice al presionar CTRL+C.

Para probar la aplicación, abre otra sesión en la terminal y conéctate a tu servidor web. Debido a que el servidor web está en la misma red privada, deberías poder acceder a la dirección IP privada del servidor app usando curl. Asegúrate de sustituir la dirección IP privada del servidor app APP_PRIVATE_IP_ADDRESS y el puerto si lo cambiaste:

Si ves el siguiente resultado, la aplicación funciona correctamente y escucha en la dirección IP y el puerto adecuado:

Si no ves el resultado adecuado, asegúrate de que la aplicación Node.js se esté ejecutando y que esté configurada para escuchar en el puerto y la dirección IP adecuados.

En el servidor app, asegúrate de finalizar la aplicación (si aún no lo has hecho) presionando CTRL+C.

Instalar PM2

Ahora instalaremos PM2, que es un administrador de procesos para las aplicaciones Node.js. PM2 proporciona una manera fácil de administrar y daemonizar las aplicaciones (ejecutarlas como un servicio).

Usaremos Node Packaged Modules (NPM), que es básicamente un administrador de paquetes para los módulos de Node que se instalan con Node.js, para instalar PM2 en nuestro servidor app. Utiliza este comando para instalar PM2:

Administrar la aplicación con PM2

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

Iniciar aplicación

Lo primero que querrás hacer es usar el comando pm2 start para ejecutar tu aplicación hello.js, en segundo plano:

Esto también agrega tu aplicación a la lista de procesos de PM2, que se genera cada vez que inicias una aplicación:

Como puedes ver, PM2 asigna automáticamente un nombre de aplicación (basado en el nombre del archivo, sin la extensión .js) y una identificación de PM2. PM2 también mantiene otra información, como el PID del proceso, su estado actual y el uso de la memoria.

Las aplicaciones que se ejecutan bajo PM2 se reiniciarán automáticamente si la aplicación se bloquea o si se cancela, pero se debe tomar un paso adicional para que la aplicación se inicie en el inicio del sistema (arranque o reinicio). Afortunadamente, PM2 proporciona una forma fácil de hacer esto, el subcomando startup.

El subcomando startup genera y configura un script de inicio para iniciar PM2 y sus procesos administrados en los arranques del servidor. También debes especificar la plataforma en la que se está ejecutando, que es ubuntu, en nuestro caso:

La última línea de la salida resultante incluirá un comando (que debe ejecutarse con privilegios de super usuario) que debes ejecutar:

Tienes que Ejecutar el comando que se generó (similar a la salida resaltada arriba) para configurar PM2 para que se inicie en el arranque (usa el comando de tu propia salida):

Otro uso de PM2 (opcional)

PM2 proporciona muchos subcomandos que te permiten administrar o buscar información sobre tus aplicaciones. Ten en cuenta que la ejecución pm2 sin ningún argumento mostrará una página de ayuda, incluido el uso del ejemplo, que cubre el uso de PM2 con más detalle que esta sección del tutorial.

Detén una aplicación con este comando (debes especificar el PM2 App nameid):

Reinicia una aplicación con este comando (debes especificar el PM2 App name o id):

La lista de aplicaciones actualmente administradas por PM2 también puede consultarse con el subcomando list:

Puedes encontrar más información sobre una aplicación específica utilizando el subcomando info (debes especificar el PM2 App name o id ):

El monitor de procesos PM2 se puede extraer con el subcomando monit. Esto muestra el estado de la aplicación, la CPU y el uso de la memoria:

Ahora que tu aplicación Node.js se está ejecutando y es administrada por PM2, configuremos el proxy inverso.

Configurar el servidor proxy inverso

Ahora que tu aplicación se está ejecutando, y escuchando en una dirección IP privada, necesitas configurar una forma para que tus usuarios accedan a ella. Configuraremos un servidor web Nginx como un proxy inverso para este propósito. Este tutorial configurará un servidor Nginx desde cero. Si ya tienes una configuración de servidor Nginx, simplemente puede copiar el location block en el server block de tu elección (asegúrate de que la ubicación no entre en conflicto con el contenido existente de tu servidor web).

En el servidor web, actualicemos las listas de paquetes apt-get con este comando:

Luego instalemo Nginx usando apt-get:

Ahora debes abrir el archivo de configuración de server block predeterminado para editarlo:

Elimina todo en el archivo e inserta la siguiente configuración. Asegúrate de sustituir tu propio nombre de dominio por la directiva server_name (o la dirección IP si no tienes un dominio configurado) y la dirección IP privada del servidor de la aplicación para APP_PRIVATE_IP_ADDRESS. Además, cambia el puerto (8080) si tu aplicación está configurada para escuchar en un puerto diferente:

Esto configura el servidor web para responder a las solicitudes en tu root. Suponiendo que nuestro servidor está disponible en example.com, el acceso a http://example.com/ a través de un navegador web enviaría la solicitud a la dirección IP privada del servidor de la aplicación en el puerto 8080, que la aplicación Node.js recibiría y respondería.

Puedes agregar location blocks adicionales al mismo server block para proporcionar acceso a otras aplicaciones en el mismo servidor web. Por ejemplo, si también estabas ejecutando otra aplicación Node.js en el servidor app en el puerto 8081, podrías agregar este location block para permitir el acceso a él a través de http://example.com/app2:

Una vez que hayas terminado de agregar los location blocks para tus aplicaciones, debes guardar y salir.

En el servidor web, reinicia Nginx:

Suponiendo que tu aplicación Node.js se está ejecutando y que tu aplicación y las configuraciones de Nginx sean correctas, deberías poder acceder a tu aplicación a través del proxy inverso del servidor web. Pruébalo accediendo a la URL de tu servidor web (tu dirección IP pública o nombre de dominio).

Conclusión

¡Felicidades! Ahora tienes tu aplicación Node.js ejecutándose detrás de un proxy inverso Nginx en servidores Ubuntu. Esta configuración de proxy inverso es lo suficientemente flexible para proporcionar a tus usuarios acceso a otras aplicaciones o contenido web estático que deseas compartir. ¡Buena suerte con tu desarrollo con Node.js!

Además, si estás buscando cifrar las transmisiones entre tu servidor web y tus usuarios, aquí hay un tutorial que te ayudará a configurar el soporte de HTTPS (TLS/SSL) .