Node.js es un entorno de ejecución de JavaScript que permite crear aplicaciones del lado del servidor de forma sencilla y flexible. Con el gestor de procesos PM2 puedes configurar tu aplicación Node.js para que se ejecute como un servicio en Ubuntu 24.04, asegurando que permanezca activa y se reinicie automáticamente en caso de errores.

La ejecución de scripts Node.js como servicio

Aunque los scripts del entorno de ejecución de JavaScript Open-Source Node.js pueden ejecutarse directamente desde la línea de comandos, hacerlo a través del gestor de procesos PM2 ofrece un funcionamiento más estable y fiable. Cuando los scripts se ejecutan como servicio, se reinician automáticamente si el servidor se reinicia o si la aplicación falla, lo que garantiza una mayor disponibilidad.

PM2 es un gestor de procesos para Node.js con múltiples funciones que facilitan el control, la supervisión y la gestión de tus aplicaciones. Puedes visitar la página web de PM2 para obtener más información sobre sus posibilidades y configuración.

Requisitos

Antes de comenzar con la instalación y configuración de Node.js con Apache y PM2, asegúrate de cumplir los siguientes requisitos:

  • Un servidor Linux, preferiblemente Ubuntu 24.04
  • Un nombre de dominio funcional que apunte correctamente al servidor
  • Un servidor web Apache instalado y operativo

Instalar Node.js

Para instalar Node.js necesitas la herramienta de línea de comandos curl. Primero actualiza los paquetes de tu servidor e instala curl con los siguientes comandos:

sudo apt update
sudo apt install curl -y
bash

A continuación, descarga el repositorio 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 repositorios 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á automáticamente npm.

Por último, instala el paquete build-essential. Este paquete incluye herramientas de desarrollo esenciales como compiladores y Make, necesarias para que Node.js pueda compilar y ejecutar correctamente módulos de npm con extensiones nativas.

sudo apt install -y build-essential
bash

Creación de una aplicación Node.js de ejemplo

Para este ejemplo, primero crearemos un directorio independiente dentro del directorio raíz de documentos de tu página web para alojar aplicaciones Node.js:

sudo mkdir /var/www/html/nodejs
bash

A continuación, crea el archivo hello.js dentro de este directorio:

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/');
javascript

Guarda el archivo, cierra el editor y hazlo ejecutable con el siguiente comando:

sudo chmod 755 hello.js
bash

Comprobar el cortafuegos

Ubuntu 24.04 puede activar el cortafuegos UFW de forma predeterminada. Para poder probar tu aplicación Node.js directamente, debes asegurarte de que el puerto 8080 esté abierto:

sudo ufw allow 8080/tcp
bash

Este paso es especialmente importante si quieres acceder a tu servidor directamente a través de la dirección IP o desde un navegador externo. Si Node.js se va a ejecutar únicamente a través de Apache utilizando 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 continuació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 automáticamente cuando el servidor se reinicie y guarda los procesos que están activos:

sudo pm2 startup systemd
sudo pm2 save
bash

Configurar Apache

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

sudo a2enmod proxy
sudo a2enmod proxy_http
bash

Una vez completada la instalación, reinicia Apache para aplicar los cambios:

sudo systemctl restart apache2
bash

A continuación, debes ajustar la configuración del proxy en Apache. Las siguientes instrucciones deben añadirse dentro del bloque VirtualHost del archivo de configuración principal del servidor Apache.

En Ubuntu, este archivo suele encontrarse en la ruta:

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

Nota

La ubicación y el nombre del archivo de configuración de Apache pueden variar según la configuració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, desplázate hasta encontrar el bloque VirtualHost, 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 siguientes directivas dentro del bloque VirtualHost:

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 encuentren fuera de los bloques de directorio (<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 aplicación accediendo 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