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

Introducció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 Node.js en la línea de comandos, este tutorial se centrará en ejecutarlas como un servicio. Esto significa que se reiniciarán al reiniciar 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 Ubuntu 22.04. 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 mediante un certificado gratuito proporcionado por Let’s Encrypt .
Prerrequisitos
Esta guía asume que usted tiene lo siguiente:
- Una configuración de servidor Ubuntu 22.04, como se describe en la guía de configuración inicial de servidor para Ubuntu 22.04 . Debe tener un usuario que no sea root con privilegios sudo y un firewall activo.
- Un nombre de dominio que apunta a la IP pública de su servidor . En este tutorial se utilizará el nombre de dominio example.com .
- Nginx instalado, como se explica en Cómo instalar Nginx en Ubuntu 22.04 .
- Nginx configurado con SSL mediante certificados Let’s Encrypt. Cómo proteger Nginx con Let’s Encrypt en Ubuntu 22.04 lo guiará a través del proceso.
- Node.js instalado en tu servidor. Cómo instalar Node.js en Ubuntu 22.04
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://example.com/
Paso 1: 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 empezar a trabajar con 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, usando nano
su editor de texto favorito, cree una aplicación de muestra llamada hello.js
:
- 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. Si está utilizando nano
, presione Ctrl+X
, luego, cuando se le solicite, Y
y luego Enter.
Esta aplicación Node.js escucha en la dirección ( localhost
) y el puerto ( 3000
) especificados, y devuelve “¡Hola mundo!” con un 200
có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:
- node hello.js
Recibirá el siguiente resultado:
OutputServer running at http://localhost:3000/
Nota: ejecutar una aplicación Node.js de esta manera bloqueará comandos adicionales hasta que se cierre la aplicación presionando CTRL+C
.
Para probar la aplicación, abra otra sesión de terminal en su servidor y conéctese localhost
con curl
:
- curl http://localhost:3000
Si obtiene el siguiente resultado, la aplicación está funcionando correctamente y escuchando en la dirección y el puerto correctos:
OutputHello World!
Si no obtiene 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 2: 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 npm
para instalar la última versión de PM2 en su servidor:
- sudo npm install pm2@latest -g
La -g
opción indica npm
que se debe instalar el módulo globalmente , para que esté disponible en todo el sistema.
Primero, usemos el pm2 start
comando para ejecutar su aplicación, hello.js
, en segundo plano:
- 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.┌────┬────────────────────┬──────────┬──────┬───────────┬──────────┬──────────┐│ id │ name │ mode │ ↺ │ status │ cpu │ memory │├────┼────────────────────┼──────────┼──────┼───────────┼──────────┼──────────┤│ 0 │ hello │ fork │ 0 │ online │ 0% │ 25.2mb │└────┴────────────────────┴──────────┴──────┴───────────┴──────────┴──────────┘
Como se indicó anteriormente, PM2 asigna automáticamente un App name
(según el nombre del archivo, sin la .js
extensión) y un PM2 id
. PM2 también mantiene otra información, como el PID
del proceso, su estado actual y el uso de memoria.
Las aplicaciones que se ejecutan en PM2 se reiniciarán automáticamente si fallan o se eliminan, pero podemos realizar un paso adicional para que la aplicación se inicie al iniciar el sistema mediante el startup
subcomando. Este subcomando genera y configura un script de inicio para iniciar PM2 y sus procesos administrados al iniciar el servidor:
- pm2 startup systemd
La última línea de la salida resultante incluirá un comando para ejecutar con privilegios de superusuario para configurar PM2 para que se inicie en el arranque:
Output[PM2] Init System found: systemdsammy[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 desde la salida, 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 PM2 y los entornos correspondientes:
- pm2 save
Ahora ha creado una unidad systemd que se ejecuta pm2
para su usuario durante el arranque. Esta pm2
instancia, a su vez, ejecuta hello.js
.
Inicie el servicio con systemctl
:
- sudo systemctl start pm2-sammy
Verifique el estado de la unidad systemd:
- systemctl status pm2-sammy
Para obtener una descripción detallada de systemd, revise Systemd Essentials: Working with Services, Units, and the Journal .
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 name
o id
):
- pm2 stop app_name_or_id
Reiniciar una aplicación:
- pm2 restart app_name_or_id
Enumere las aplicaciones administradas actualmente por PM2:
- pm2 list
Obtenga información sobre una aplicación específica utilizando su App name
:
- pm2 info app_name
El monitor de procesos PM2 se puede abrir con el monit
subcomando. Esto muestra el estado de la aplicación, la CPU y el uso de la memoria:
- pm2 monit
Tenga en cuenta que ejecutar pm2
sin 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 3: 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/example.com
- sudo nano /etc/nginx/sites-available/example.com
Dentro del server
bloque, 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/sitios-disponibles/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; }...}
Esto configura el servidor para que responda a las solicitudes en su raíz. Suponiendo que nuestro servidor está disponible en example.com
, el acceso a través de un navegador web enviaría la solicitud a , que escucha en el puerto en .https://example.com/
hello.js
3000
localhost
Puedes agregar location
bloques 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://example.com/app2
/etc/nginx/sites-available/example.com — 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:
- sudo nginx -t
Reiniciar Nginx:
- 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 la URL de su servidor (su dirección IP pública o nombre de dominio).
Conclusión
¡Felicitaciones! Ahora tiene su aplicación Node.js ejecutándose detrás de un proxy inverso Nginx en un servidor Ubuntu 22.04. 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.
A continuación, es posible que desees consultar Cómo crear una aplicación Node.js con Docker .
Deja una respuesta