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

Introducción

Índice
  1. Introducción
  • Prerrequisitos
  • Paso 1: Instalación de Node.js
  • Paso 2: Creación de una aplicación Node.js
  • Paso 3: Instalación de PM2
  • Paso 4: Configuración de Nginx como servidor proxy inverso
  • Conclusión
  • Node.js es un entorno de ejecución de código abierto de JavaScript para crear aplicaciones de red y del lado del servidor. La plataforma funciona en Linux, macOS, FreeBSD y Windows. Aunque puedes ejecutar aplicaciones de Node.js en la línea de comandos, este tutorial se centrará en ejecutarlas como un servicio. Esto significa que las aplicaciones se reiniciarán al reiniciar el sistema o si falla el sistema y son seguras para su uso en un entorno de producción.

    En este tutorial, configurará un entorno Node.js listo para producción en un solo servidor Debian 10. Este servidor ejecutará una aplicación Node.js administrada por PM2 y brindará a los usuarios acceso seguro a la aplicación a través de un proxy inverso Nginx. El servidor Nginx ofrecerá HTTPS, utilizando un certificado gratuito proporcionado por Let's Encrypt.

    Prerrequisitos

    Esta guía asume que usted tiene lo siguiente:

    • Una configuración de servidor Debian 10, como se describe en la guía de configuración inicial del servidor Debian 10. Debe tener un usuario que no sea root con sudoprivilegios y un firewall activo.
    • Un nombre de dominio que apunta a la IP pública de su servidor.
    • Nginx instalado, como se explica en Cómo instalar Nginx en Debian 10.
    • Nginx configurado con SSL mediante certificados Let's Encrypt. Cómo proteger Nginx con Let's Encrypt en Debian 10 le guiará a través del proceso.

    Cuando haya completado los requisitos previos, tendrá un servidor que servirá la página de marcador de posición predeterminada de su dominio en .https://your_domain/

    Paso 1: Instalación de Node.js

    Comencemos instalando la última versión LTS de Node.js, utilizando los archivos del paquete NodeSource.

    Para instalar el PPA de NodeSource y acceder a su contenido, primero deberá actualizar el índice de su paquete e instalar curl:

    1. sudo apt update
    2. sudo apt install curl

    Asegúrate de estar en tu directorio de inicio y luego usa curlpara recuperar el script de instalación para Node.js10Archivos .x:

    1. cd ~
    2. curl -sL https://deb.nodesource.com/setup_10.x -o nodesource_setup.sh

    Puede inspeccionar el contenido de este script con nanosu editor de texto preferido:

    1. nano nodesource_setup.sh

    Cuando haya terminado de inspeccionar el script, ejecútelo en sudo:

    1. sudo bash nodesource_setup.sh

    El PPA se agregará a su configuración y su caché de paquetes local se actualizará automáticamente. Después de ejecutar el script de configuración desde Nodesource, puede instalar el paquete Node.js:

    1. sudo apt install nodejs

    Para comprobar qué versión de Node.js tienes instalada después de estos pasos iniciales, escribe:

    1. nodejs -v
    Outputv10.16.0

    Nota: Al instalar desde NodeSource PPA, el ejecutable Node.js se llama nodejs, en lugar de node.

    El nodejspaquete contiene el nodejsbinario así como npmun administrador de paquetes para módulos Node, por lo que no es necesario instalarlo npmpor separado.

    npmUtiliza un archivo de configuración en su directorio de inicio para realizar un seguimiento de las actualizaciones. Se creará la primera vez que ejecute npm. Ejecute este comando para verificar que npmesté instalado y para crear el archivo de configuración:

    1. npm -v
    Output6.9.0

    Para que algunos npmpaquetes funcionen (aquellos que requieren compilar código desde la fuente, por ejemplo), necesitarás instalar el build-essentialpaquete:

    1. sudo apt install build-essential

    Ahora tienes las herramientas necesarias para trabajar con npmpaquetes que requieren compilar código desde la fuente.

    Con el entorno de ejecución Node.js instalado, podemos pasar a escribir una aplicación Node.js.

    Paso 2: Creación de una aplicación Node.js

    Escribamos una aplicación Hola mundo que devuelva "Hola mundo" a cualquier solicitud HTTP. Esta aplicación de ejemplo te ayudará a configurar Node.js. Puedes reemplazarla con tu propia aplicación, solo asegúrate de modificarla para que escuche en las direcciones IP y puertos adecuados.

    Primero, vamos a crear una aplicación de muestra llamada hello.js:

    1. cd ~
    2. nano hello.js

    Inserte el siguiente código en el archivo:

    ~/hola.js

    const http = require('http');const hostname = 'localhost';const port = 3000;const server = http.createServer((req, res) = {  res.statusCode = 200;  res.setHeader('Content-Type', 'text/plain');  res.end('Hello World!n');});server.listen(port, hostname, () = {  console.log(`Server running at http://${hostname}:${port}/`);});

    Guarde el archivo y salga del editor.

    Esta aplicación Node.js escucha en la dirección ( localhost) y el puerto ( 3000) especificados, y devuelve “¡Hola mundo!” con un 200código HTTP de éxito. Dado que estamos escuchando en localhost, los clientes remotos no podrán conectarse a nuestra aplicación.

    Para probar su aplicación, escriba:

    1. node hello.js

    Verá el siguiente resultado:

    OutputServer running at http://localhost:3000/

    Nota: ejecutar una aplicación Node.js de esta manera bloqueará comandos adicionales hasta que finalice la aplicación presionando CTRL+C.

    Para probar la aplicación, abra otra sesión de terminal en su servidor y conéctese localhostcon curl:

    1. curl http://localhost:3000

    Si ve el siguiente resultado, la aplicación está funcionando correctamente y escuchando en la dirección y el puerto correctos:

    OutputHello World!

    Si no ve el resultado esperado, asegúrese de que su aplicación Node.js esté ejecutándose y configurada para escuchar en la dirección y el puerto adecuados.

    Una vez que esté seguro de que funciona, cierre la aplicación (si aún no lo ha hecho) presionando CTRL+C.

    Paso 3: Instalación de PM2

    A continuación, instalaremos PM2, un administrador de procesos para aplicaciones Node.js. PM2 permite convertir aplicaciones en daemon para que se ejecuten en segundo plano como un servicio.

    Utilice npmpara instalar la última versión de PM2 en su servidor:

    1. sudo npm install pm2 -g

    La -gopción indica npmque se debe instalar el módulo globalmente, para que esté disponible en todo el sistema.

    Primero usemos el pm2 startcomando para ejecutar la hello.jsaplicación en segundo plano:

    1. pm2 start hello.js

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

    Output[PM2] Spawning PM2 daemon with pm2_home=/home/sammy/.pm2[PM2] PM2 Successfully daemonized[PM2] Starting /home/sammy/hello.js in fork_mode (1 instance)[PM2] Done.┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────┬───────────┬───────┬──────────┐│ App name │ id │ mode │ pid  │ status │ restart │ uptime │ cpu │ mem       │ user  │ watching │├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────┼───────────┼───────┼──────────┤│ hello    │ 0  │ fork │ 1338 │ online │ 0       │ 0s     │ 0%  │ 23.0 MB   │ sammy │ disabled │└──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────┴───────────┴───────┴──────────┘ Use `pm2 show id|name` to get more details about an app

    Como puede ver, PM2 asigna automáticamente un App nameen función del nombre del archivo sin la .jsextensión, junto con un PM2 id. PM2 también mantiene otra información, como el nombre PIDdel proceso, su estado actual y el uso de la memoria.

    Las aplicaciones que se ejecutan en PM2 se reiniciarán automáticamente si fallan o se cierran, pero podemos realizar un paso adicional para que la aplicación se inicie al iniciar el sistema mediante el startupsubcomando. Este subcomando genera y configura un script de inicio para iniciar PM2 y sus procesos administrados al iniciar el servidor. Escriba lo siguiente:

    1. sudo pm2 startup

    Verá un resultado similar a este, que describe la configuración del servicio que PM2 ha generado:

    Output[PM2] Init System found: systemdPlatform systemdTemplate[Unit]Description=PM2 process managerDocumentation=https://pm2.keymetrics.io/After=network.target[Service]Type=forkingUser=rootLimitNOFILE=infinityLimitNPROC=infinityLimitCORE=infinityEnvironment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/binEnvironment=PM2_HOME=/root/.pm2PIDFile=/root/.pm2/pm2.pidRestart=on-failureExecStart=/usr/lib/node_modules/pm2/bin/pm2 resurrectExecReload=/usr/lib/node_modules/pm2/bin/pm2 reload allExecStop=/usr/lib/node_modules/pm2/bin/pm2 kill[Install]WantedBy=multi-user.targetTarget path/etc/systemd/system/pm2-root.serviceCommand list[ 'systemctl enable pm2-root' ][PM2] Writing init configuration in /etc/systemd/system/pm2-root.service[PM2] Making script booting at startup...[PM2] [-] Executing: systemctl enable pm2-root...Created symlink /etc/systemd/system/multi-user.target.wants/pm2-root.service → /etc/systemd/system/pm2-root.service.[PM2] [v] Command successfully executed.+---------------------------------------+[PM2] Freeze a process list on reboot via:$ pm2 save[PM2] Remove init script via:$ pm2 unstartup systemd

    Ahora ha creado una unidad systemd que se ejecuta pm2durante el arranque. Esta pm2instancia, a su vez, ejecuta hello.js.

    Inicie el servicio con systemctl:

    1. sudo systemctl start pm2-root.service

    Verifique el estado de la unidad systemd:

    1. systemctl status pm2-root.service

    Debería ver un resultado como el siguiente:

    Output● pm2-root.service - PM2 process manager   Loaded: loaded (/etc/systemd/system/pm2-root.service; enabled; vendor preset: enabled)   Active: active (running) since Fri 2019-07-12 16:09:54 UTC; 4s ago

    Para obtener una descripción detallada de systemd, consulte Conceptos básicos de Systemd: trabajar con servicios, unidades y el diario.

    Además de los que hemos cubierto, PM2 proporciona muchos subcomandos que le permiten administrar o buscar información sobre sus aplicaciones.

    Detenga una aplicación con este comando (especifique PM2 App nameo id​​):

    1. pm2 stop app_name_or_id

    Reiniciar una aplicación:

    1. pm2 restart app_name_or_id

    Enumere las aplicaciones administradas actualmente por PM2:

    1. pm2 list

    Obtenga información sobre una aplicación específica utilizando su App name:

    1. pm2 info app_name

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

    1. pm2 monit

    Tenga en cuenta que ejecutar pm2sin ningún argumento también mostrará una página de ayuda con ejemplos de uso.

    Ahora que su aplicación Node.js está ejecutándose y administrada por PM2, configuremos el proxy inverso.

    Paso 4: Configuración de Nginx como servidor proxy inverso

    Su aplicación se está ejecutando y escuchando en localhost, pero necesita configurar una forma para que sus usuarios puedan acceder a ella. Configuraremos el servidor web Nginx como un proxy inverso para este propósito.

    En el tutorial de requisitos previos, configuraste tu configuración de Nginx en el archivo. Abre este archivo para editarlo:/etc/nginx/sites-available/your_domain

    1. sudo nano /etc/nginx/sites-available/your_domain

    Dentro del serverbloque, debería haber un location /bloque existente. Reemplace el contenido de ese bloque con la siguiente configuración. Si su aplicación está configurada para escuchar en un puerto diferente, actualice la parte resaltada al número de puerto correcto:

    /etc/nginx/sites-available/su_dominio

    server {...    location / {        proxy_pass http://localhost:3000;        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 para que responda a las solicitudes en su raíz. Suponiendo que nuestro servidor está disponible en your_domain, el acceso a través de un navegador web enviaría la solicitud a , que escucha en el puerto en .https://your_domain/hello.js3000localhost

    Puedes agregar locationbloques adicionales al mismo bloque de servidor para brindar acceso a otras aplicaciones en el mismo servidor. Por ejemplo, si también estuvieras ejecutando otra aplicación Node.js en el puerto 3001, podrías agregar este bloque de ubicación para permitir el acceso a ella mediante :https://your_domain/app2

    /etc/nginx/sites-available/your_domain — Opcional

    server {...    location /app2 {        proxy_pass http://localhost:3001;        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 haya terminado de agregar los bloques de ubicación para sus aplicaciones, guarde el archivo y salga de su editor.

    Asegúrate de no haber introducido ningún error de sintaxis al escribir:

    1. sudo nginx -t

    Reiniciar Nginx:

    1. sudo systemctl restart nginx

    Suponiendo que su aplicación Node.js se está ejecutando y que las configuraciones de su aplicación y Nginx son correctas, ahora debería poder acceder a su aplicación a través del proxy inverso de Nginx. Pruébelo accediendo a su dominio en el navegador: .https://your_domain

    Conclusión

    ¡Felicitaciones! Ahora tiene su aplicación Node.js ejecutándose detrás de un proxy inverso Nginx en un servidor Debian 10. Esta configuración de proxy inverso es lo suficientemente flexible como para brindar a sus usuarios acceso a otras aplicaciones o contenido web estático que desee compartir.

    SUSCRÍBETE A NUESTRO BOLETÍN 
    No te pierdas de nuestro contenido ni de ninguna de nuestras guías para que puedas avanzar en los juegos que más te gustan.

    Deja una respuesta

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

    Subir

    Este sitio web utiliza cookies para mejorar tu experiencia mientras navegas por él. Este sitio web utiliza cookies para mejorar tu experiencia de usuario. Al continuar navegando, aceptas su uso. Mas informacion