Node.js es un entorno de ejecución de Ja­va­S­cri­pt que permite crear apli­ca­cio­nes del lado del servidor de forma sencilla y flexible. Con el gestor de procesos PM2 puedes co­n­fi­gu­rar tu apli­ca­ción Node.js para que se ejecute como un servicio en Ubuntu 24.04, ase­gu­ra­n­do que pe­r­ma­ne­z­ca activa y se reinicie au­to­má­ti­ca­me­n­te en caso de errores.

La ejecución de scripts Node.js como servicio

Aunque los scripts del entorno de ejecución de Ja­va­S­cri­pt Open-Source Node.js pueden eje­cu­tar­se di­re­c­ta­me­n­te desde la línea de comandos, hacerlo a través del gestor de procesos PM2 ofrece un fu­n­cio­na­mie­n­to más estable y fiable. Cuando los scripts se ejecutan como servicio, se reinician au­to­má­ti­ca­me­n­te si el servidor se reinicia o si la apli­ca­ción falla, lo que garantiza una mayor di­s­po­ni­bi­li­dad.

PM2 es un gestor de procesos para Node.js con múltiples funciones que facilitan el control, la su­pe­r­vi­sión y la gestión de tus apli­ca­cio­nes. Puedes visitar la página web de PM2 para obtener más in­fo­r­ma­ción sobre sus po­si­bi­li­da­des y co­n­fi­gu­ra­ción.

Re­qui­si­tos

Antes de comenzar con la in­s­ta­la­ción y co­n­fi­gu­ra­ción de Node.js con Apache y PM2, asegúrate de cumplir los si­guie­n­tes re­qui­si­tos:

  • Un servidor Linux, pre­fe­ri­ble­me­n­te Ubuntu 24.04
  • Un nombre de dominio funcional que apunte co­rre­c­ta­me­n­te al servidor
  • Un servidor web Apache instalado y operativo

Instalar Node.js

Para instalar Node.js necesitas la he­rra­mie­n­ta de línea de comandos curl. Primero actualiza los paquetes de tu servidor e instala curl con los si­guie­n­tes comandos:

sudo apt update
sudo apt install curl -y
bash

A co­n­ti­nua­ción, descarga el re­po­si­to­rio PPA de Node.js y añádelo a la caché de paquetes de tu servidor. Este PPA incluye una versión de Node.js más reciente que la que ofrecen los re­po­si­to­rios oficiales de Ubuntu:

curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
bash

Después, instala Node.js:

sudo apt install -y nodejs
bash

Esto también instalará au­to­má­ti­ca­me­n­te npm.

Por último, instala el paquete build-essential. Este paquete incluye he­rra­mie­n­tas de de­sa­rro­llo ese­n­cia­les como co­m­pi­la­do­res y Make, ne­ce­sa­rias para que Node.js pueda compilar y ejecutar co­rre­c­ta­me­n­te módulos de npm con ex­te­n­sio­nes nativas.

sudo apt install -y build-essential
bash

Creación de una apli­ca­ción Node.js de ejemplo

Para este ejemplo, primero crearemos un di­re­c­to­rio in­de­pe­n­die­n­te dentro del di­re­c­to­rio raíz de do­cu­me­n­tos de tu página web para alojar apli­ca­cio­nes Node.js:

sudo mkdir /var/www/html/nodejs
bash

A co­n­ti­nua­ción, crea el archivo hello.js dentro de este di­re­c­to­rio:

sudo nano /var/www/html/nodejs/hello.js
bash

Después, añade el siguiente contenido de ejemplo al archivo:

#!/usr/bin/env node
var http = require('http');
http.createServer(function (request, response) {
    response.writeHead(200, {'Content-Type': 'text/plain'});
    response.end('Hello World! Node.js is working correctly.\n');
}).listen(8080, '0.0.0.0');
console.log('Server running at http://127.0.0.1:8080/');
ja­va­s­cri­pt

Guarda el archivo, cierra el editor y hazlo eje­cu­ta­ble con el siguiente comando:

sudo chmod 755 hello.js
bash

Comprobar el co­r­ta­fue­gos

Ubuntu 24.04 puede activar el co­r­ta­fue­gos UFW de forma pre­de­te­r­mi­na­da. Para poder probar tu apli­ca­ción Node.js di­re­c­ta­me­n­te, debes ase­gu­rar­te de que el puerto 8080 esté abierto:

sudo ufw allow 8080/tcp
bash

Este paso es es­pe­cia­l­me­n­te im­po­r­ta­n­te si quieres acceder a tu servidor di­re­c­ta­me­n­te a través de la dirección IP o desde un navegador externo. Si Node.js se va a ejecutar úni­ca­me­n­te a través de Apache uti­li­za­n­do el proxy, este paso es opcional, ya que el proxy se encargará de redirigir el tráfico.

Instalar PM2

Utiliza npm para instalar PM2 con el siguiente comando:

sudo npm install -g pm2
bash

A co­n­ti­nua­ción, inicia el script de ejemplo hello.js con este comando:

sudo pm2 start hello.js
bash

Como usuario root, añade PM2 a los scripts de arranque para que se reinicie au­to­má­ti­ca­me­n­te cuando el servidor se reinicie y guarda los procesos que están activos:

sudo pm2 startup systemd
sudo pm2 save
bash

Co­n­fi­gu­rar Apache

Para acceder al script de Node.js desde la web, instala los módulos proxy y proxy_http de Apache con los si­guie­n­tes comandos:

sudo a2enmod proxy
sudo a2enmod proxy_http
bash

Una vez co­m­ple­ta­da la in­s­ta­la­ción, reinicia Apache para aplicar los cambios:

sudo systemctl restart apache2
bash

A co­n­ti­nua­ción, debes ajustar la co­n­fi­gu­ra­ción del proxy en Apache. Las si­guie­n­tes in­s­tru­c­cio­nes deben añadirse dentro del bloque Vi­r­tua­lHo­st del archivo de co­n­fi­gu­ra­ción principal del servidor Apache.

En Ubuntu, este archivo suele en­co­n­trar­se en la ruta:

/etc/apache2/sites-available/example.com.conf

Nota

La ubicación y el nombre del archivo de co­n­fi­gu­ra­ción de Apache pueden variar según la co­n­fi­gu­ra­ción del servidor.

Edita este archivo con el editor que prefieras, por ejemplo:

sudo nano /etc/apache2/sites-available/example.com.conf
bash

Dentro del archivo, de­s­plá­za­te hasta encontrar el bloque Vi­r­tua­lHo­st, que tendrá un aspecto similar a este:

<VirtualHost *:80>
ServerName example.com
<Directory "/var/www/example.com/html">
AllowOverride All
</Directory>
</VirtualHost>

Añade las si­guie­n­tes di­re­c­ti­vas dentro del bloque Vi­r­tua­lHo­st:

ProxyRequests Off
ProxyPreserveHost On
ProxyVia Full
<Proxy *>
Require all granted
</Proxy>
<Location /nodejs>
ProxyPass http://127.0.0.1:8080
ProxyPassReverse http://127.0.0.1:8080
</Location>

Asegúrate de que estas líneas se en­cue­n­tren fuera de los bloques de di­re­c­to­rio (<Directory>), por ejemplo:

<VirtualHost *:80>
ServerName example.com
ProxyRequests Off
ProxyPreserveHost On
ProxyVia Full
<Proxy *>
Require all granted
</Proxy>
<Location /nodejs>
ProxyPass http://127.0.0.1:8080
ProxyPassReverse http://127.0.0.1:8080
</Location>
<Directory "/var/www/example.com/html">
AllowOverride All
</Directory>
</VirtualHost>

Guarda y cierra el archivo, y luego reinicia Apache para aplicar todos los cambios:

sudo systemctl restart apache2
bash

Después del reinicio, podrás probar la apli­ca­ción ac­ce­die­n­do a la URL desde un navegador. Deberías ver el mensaje generado por el script de prueba:

Hello World! Node.js is working correctly.
Ir al menú principal