One place for hosting & domains

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


      Introducción

      Node.js es un entorno de tiempo de ejecución de código abierto basado en JavaScript que use usa para crear aplicaciones de redes. La plataforma funciona en Linux, macOS, FreeBSD y Windows. Aunque puede ejecutar aplicaciones de Node.js en la línea de comandos, en este tutorial se pondrá el foco en su ejecución como un servicio. Esto significa que se reiniciarán durante el inicio o ante un fallo y que pueden usarse de forma segura en un entorno de producción.

      En este tutorial, configurará un entorno de Node.js listo para producción en un servidor único Ubuntu 20.04. Este servidor ejecutará una aplicación de Node.js administrada por PM2 y brindará a los usuarios acceso seguro a la aplicación mediante un proxy inverso de Nginx. El servidor de Nginx brindará HTTPS usando un certificado gratuito proporcionado por Let’s Encrypt.

      Requisitos previos

      Para esta guía, se supone cuenta con lo siguiente:

      Una vez que cumpla con los requisitos previos, dispondrá de un servidor en el que funcionará la página de marcador de posición predeterminada de su dominio en https://example.com/.

      Paso 1: Instalar Node.js

      Comencemos instalando la versión más reciente de LTS de Node.js con los archivos de paquete de NodeSource.

      Primero, instale el PPA de NodeSource para poder acceder a su contenido. Asegúrese de estar en su directorio de inicio y utilice curl para recuperar la secuencia de comandos de instalación para la versión más reciente LTS de Node.js de sus archivos.

      • cd ~
      • curl -sL https://deb.nodesource.com/setup_14.x -o nodesource_setup.sh

      Puede inspeccionar el contenido de esta secuencia de comandos con nano o su editor de texto preferido:

      Cuando termine de inspeccionar la secuencia, ejecútela con sudo:

      • sudo bash nodesource_setup.sh

      El PPA se agregará a su configuración y su caché de paquetes locales se actualizará de forma automática. Después de ejecutar la secuencia de comandos de configuración de Nodesource, puede instalar el paquete de Node.js.

      Para comprobar la versión de Node.js que instaló después de estos pasos iniciales, escriba lo siguiente:

      Output

      v14.4.0

      Nota: Cuando la instalación se realiza a partir del PPA de NodeSource, el ejecutable de Node.js se llama nodejs, en lugar de node.

      El paquete nodejs contiene el binario nodejs y npm un administrador de paquetes para módulos de Node, por lo que no tendrá que instalar npm por separado.

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

      Output

      6.14.5

      Para que algunos paquetes de npm funcionen (por ejemplo, aquellos para los cuales de sebe compilar código de fuente), deberá instalar el paquete build-essential:

      • sudo apt install build-essential

      Ahora dispondrá de las herramientas necesarias para trabajar con paquetes npm para los que se deba compilar código de la fuente.

      Ahora que está instalado el tiempo de ejecución de Node.js, escribiremos una la aplicación de Node.js.

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

      Escribiremos una aplicación Hello World que responda “Hello World” a cualquier solicitud de HTTP. Con esta aplicación de ejemplo, podrá a configurar Node.js. Puede reemplazarla por su propia aplicación; solo debe asegurarse de modificar su aplicación para escuchar en las direcciones IP y los puertos apropiados.

      Primero, crearemos una aplicación de ejemplo llamada hello.js:

      Inserte el siguiente código en el archivo:

      ~/hello.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.

      La aplicación Node.js escucha la dirección especificada (localhost) y el puerto (3000), y responde “Hello World!” con un código de éxito HTTP 200. Debido a que escucharemos en localhost, los clientes remotos no podrán conectarse a nuestra aplicación.

      Para probar su aplicación, escriba lo siguiente:

      Recibirá el siguiente resultado:

      Output

      Server running at http://localhost:3000/

      Nota: Ejecutar una aplicación de Node.js de esta manera bloqueará comandos adicionales hasta que esta se detenga pulsando CTRL+C.

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

      • curl http://localhost:3000

      Si obtiene el siguiente resultado, significa que la aplicación funciona de forma adecuada y escucha en las direcciones y los puertos correctos.

      Output

      Hello World!

      Si no obtiene el resultado esperado, asegúrese de que su aplicación de Node.js funcione y esté configurada para escuchar en la dirección y el puerto apropiados.

      Una vez que esté seguro de que funciona, deténgala (si aún no lo hizo) presionando CTRL+C.

      Paso 3: Instalar PM2

      A continuación, instalaremos PM2, un administrador de procesos para aplicaciones de Node.js. PM2 permite implementar demonios en aplicaciones para que puedan funcionar en segundo plano como servicios.

      Use npm para instalar la última versión de PM2 en su servidor:

      • sudo npm install pm2@latest -g

      La opción -g indica a npm que instale el módulo de forma global, de modo que esté disponible en todo el sistema.

      Primero, usaremos el comando pm2 start para ejecutar su aplicación, hello.js, en segundo plano:

      Con esto, también se agrega su aplicación a la lista de procesos de PM2, que se emite cada vez que se 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. ┌────┬────────────────────┬──────────┬──────┬───────────┬──────────┬──────────┐ │ id │ name │ mode │ ↺ │ status │ cpu │ memory │ ├────┼────────────────────┼──────────┼──────┼───────────┼──────────┼──────────┤ │ 0 │ hello │ fork │ 0 │ online │ 0% │ 25.2mb │ └────┴────────────────────┴──────────┴──────┴───────────┴──────────┴──────────┘

      Como se indicó anteriormente, PM2 asigna automáticamente un nombre de aplicación (según el nombre de archivo, sin la extensión .js) y un id 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 en PM2 se reiniciarán de forma automática si la aplicación se bloquea o se detiene, pero podemos dar un paso adicional para que se cargue en el inicio del sistema usando el subcomando startup. Este subcomando genera y configura una secuencia de comandos de inicio para iniciar PM2 y sus procesos administrados al iniciarse el servidor:

      En la última línea del resultado obtenido se incluirá un comando que se ejecutará con privilegios de superusuario a fin de configurar PM2 para que se cargue en el inicio:

      Output

      [PM2] Init System found: systemd sammy [PM2] To setup the Startup Script, copy/paste the following command: sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy

      Ejecute el comando del resultado con su nombre de usuario en lugar de sammy:

      • sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy

      Como paso adicional, podemos guardar la lista de procesos de PM2 y los entornos correspondientes:

      De esta manera, habrá creado una unidad de systemd que ejecuta pm2 para su usuario en el inicio. Esta instancia de pm2, a su vez, ejecuta hello.js.

      Inicie el servicio con systemctl:

      • sudo systemctl start pm2-sammy

      Si en este momento se encuentra un error, es posible que necesite reiniciar, lo que puede hacer con sudo reboot.

      Compruebe el estado de la unidad de systemd:

      • systemctl status pm2-sammy

      Para hallar una descripción detallada de systemd, consulte Aspectos básicos de systemd: trabajar con servicios, unidades y el componente de diario.

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

      Detenga una aplicación con este comando (especifique App name o id de PM2):

      Reinicie una aplicación:

      • pm2 restart app_name_or_id

      Liste las aplicaciones actualmente administradas por PM2:

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

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

      Tenga en cuenta que si se ejecuta pm2 sin argumentos, también se mostrará una página de ayuda con uso de ejemplos.

      Ahora que su aplicación de Node.js funciona y PM2 la administra, configuraremos el proxy inverso.

      Paso 4: Configurar Nginx como servidor proxy inverso

      Su aplicación está en ejecución y escucha en localhost, pero necesita configurar una alternativa para que sus usuarios accedan a ella. Configuraremos el servidor web de Nginx como un proxy inverso para este propósito.

      En el tutorial de los requisitos previos, configuró sus ajustes de Nginx en el archivo /etc/nginx/sites-available/example.com. Abra este archivo para editarlo:

      • sudo nano /etc/nginx/sites-available/example.com

      En el bloque server, debería disponer de un bloque location /. Sustituya el contenido de dicho bloque por la siguiente configuración. Si su aplicación está configurada para escuchar en un puerto diferente, actualice la parte resaltada con el número de puerto correcto:

      /etc/nginx/sites-available/example.com

      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;
          }
      ...
      }
      

      Con esto, se configurará el servidor para que responda las solicitudes en su root. Suponiendo que nuestro servidor esté disponible en example.com, al acceder a https://example.com/ a través de un navegador web se enviaría la solicitud a hello.js y la escucha se realizaría en el puerto 3000 en localhost.

      Puede agregar bloques location al mismo bloque de servidor para proporcionar acceso a otras aplicaciones en el mismo servidor. Por ejemplo, si también contaba con otra aplicación Node.js en el puerto 3001, podría agregar este bloque de ubicación para permitir el acceso a él a través de https://example.com/app2:

      /etc/nginx/sites-available/example.com — Optional

      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 termine de agregar los bloques de ubicación a sus aplicaciones, guarde el archivo y cierre el editor.

      Asegúrese de no haber introducido errores de sintaxis escribiendo lo siguiente:

      Reinicie Nginx:

      • sudo systemctl restart nginx

      Suponiendo que su aplicación Node.js está en ejecución, y que su aplicación y las configuraciones de Nginx son correctas, ahora debería poder acceder a su aplicación a través del proxy inverso de Nginx. Pruébelo accediendo a la URL de su servidor (su dirección IP pública o nombre de dominio).

      Conclusión

      ¡Felicitaciones! De esta manera, habrá logrado hacer funcionar su aplicación de Node.js detrás de un proxy inverso de Nginx en un servidor de Ubuntu 20.04. Esta configuración de proxy inverso es suficientemente flexible como para proporcionar a sus usuarios acceso a otras aplicaciones o a contenido web estático que desee compartir.



      Source link


      Leave a Comment