· Tutorial ·

Cómo instalar NodeJS en un Cloud con SWPanel

En este manual veremos como instalar NodeJS en un Cloud con SWPanel. Además, aprenderás a crear un servicio de arranque para que el servidor NodeJS se mantenga siempre activo como un servicio más del servidor e inicie automáticamente en caso de reiniciar el Cloud.

Primeramente, necesitarás un servidor con SWPanel como panel de gestión, para ello, puedes seguir el manual: Cómo crear un Cloud con SWPanel como panel de gestión.

También, necesitarás crear un servicio de Hosting dentro de este servidor, de este modo, tu servidor NodeJS responderá a las peticiones a través del dominio. Puedes seguir el manual Crear un Hosting Web en mi Cloud.

Todas las acciones que llevaremos a cabo serán a través de la consola del servidor mediante un usuario con privilegios de administrador, por ello, necesitarás conectarte a través de un cliente SSH o a través de la consola de SWPanel.

info Antes de instalar ningún paquete, te recomendamos que realices una Snapshot del servidor, de este modo, si hubiese alguna incompatibilidad entre NodeJS y alguna de las webs que ya tienes en el servidor, podrías deshacer las acciones y todo volvería a funcionar: Cómo crear y gestionar SnapShots de tu Servidor Cloud.

Instalación y configuración del servidor NodeJS

Primero de todo, actualizaremos el servidor a través del siguiente comando:

apt update -y && apt upgrade -y

A continuación, deberemos instalar el paquete de nodejs:

apt install nodejs -y

Para el siguiente punto, necesitarás conocer el puerto por el que escuchará tu servidor NodeJS, nosotros utilizaremos el siguiente código como ejemplo. En nuestro caso, el fichero se encuentra en el directorio /var/www/nodejs.swmanuales.com/datos/web/server.js.

Como puedes comprobar, el servidor escucha por el puerto 3000:

#!/usr/bin/env node

const { createServer } = require('node:http');

const hostname = '127.0.0.1';
const port = 3000;

const server = createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('¡Hola mundo desde SWPanel!');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

danger Si tienes múltiples servidores NodeJS en el mismo cloud, el puerto debe ser diferente para cada uno de ellos.

Dado que los servicios de Hosting desplegados automáticamente por SWPanel están configurados para funcionar conjuntamente con Apache2 y Nginx, deberemos hacer un cambio en el fichero de configuración de Nginx para que interactúe con el puerto 3000 (en este caso) del servidor NodeJS.

Editaremos el fichero de vhost de Nginx mediante nano /etc/nginx/swhosting/vhosts/dominio.com.conf y comentaremos el siguiente bloque añadiendo # al principio de cada línea o directamente, borrando este bloque:

#        location / {
#                proxy_pass http://127.0.0.1:8080;
#                proxy_set_header Host             $host;
#                proxy_set_header X-Real-IP        $remote_addr;
#                proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
#                proxy_set_header X-Forwarded-Proto $scheme;
#                access_log off;
#                proxy_cache_key "$scheme$request_method$host$request_uri";
#                proxy_no_cache $no_cache $http_pragma $http_authorization $arg_nocache;
#                proxy_cache_bypass $no_cache $http_pragma $http_authorization $arg_nocache;
#                proxy_cache nodejs.swmanuales.com_proxy;
#                proxy_cache_valid "5";
#                proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504 updating;
#        }

info Si tu servicio tiene instalado un certificado SSL, este bloque aparecerá tanto para el puerto 80 (parte superior del fichero de configuración) como para el 443 (parte inferior del fichero de configuración), por lo que deberás hacer este paso, y el siguiente, dos veces.

A continuación, añade la siguiente configuración justo debajo del bloque comentado:

location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Fowarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Fowarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;

       try_files $uri $uri/ =404;
}

info De nuevo, si tu servicio de Hosting tiene certificado SSL, deberás hacer este paso también para el bloque de configuración para el puerto 443.

info Recuerda cambiar el puerto por el mismo que está configurado en el fichero del servidor NodeJS

Guarda los cambios mediante "Ctrl + O" y sal del editor con "Ctrl + X".

Una vez modificada la configuración del VirtualHost de Nginx, comprovaremos que esta sea correcta:

nginx -t

Si es correcta, reiniciaremos el servicio Nginx:

systemctl restart nginx

Una vez llegados a este punto, podemos arrancar el servidor NodeJS de forma manual para comprobar que funciona correctamente:

node /var/www/nodejs.swmanuales.com/datos/web/server.js

Accedemos al dominio a través del navegador y vemos como carga el contenido.

info Para parar el servidor utiliza la combinación "Ctrl + C"

Creación del servicio

En el caso de que el servidor NodeJS deba estar iniciado permanentemente, es interesante crear un servicio de arranque, de este modo, el servidor NodeJS estará corriendo en segundo plano como un servicio más del Cloud.

Hay que revisar algunos puntos antes de crear el servicio de arranque:

1 - El archivo principal del servidor debe contener #!/usr/bin/env node en la primera línea, de lo contario, el servicio no arrancará.

2 - El fichero principal del servidor debe tener permiso de ejecución para el usuario propietario, para ello, ejecuta el siguiente comando:

chmod u+x /var/www/nodejs.swmanuales.com/datos/web/server.js

3 - El fichero principal debe tener como usuario propietario y grupo propietario el usuario CHROOT asignado al servicio de Hosting. Para saber el usuario y grupo propietario del servicio puedes ejecutar el siguiente comando:

stat -c '%U' /var/www/nodejs.swmanuales.com/datos/web

La respuesta será un usuario parecido al siguiente:

SW002NO432

Para modificar el usuario y grupo propietario del fichero, utiliza este comando:

chown SW002NO432:SW002NO432 /var/www/nodejs.swmanuales.com/datos/web/server.js

info Recuerda cambiar nodejs.swmanuales.com por el nombre de tu dominio y SW002NO432 por el usuario propietario de tu directorio.

Una vez revisados los puntos anteriores, podemos crear el servicio de arranque. Para ello, deberás crear y editar un fichero en el directorio /etc/systemd/system/, en este directorio se encuentran los servicios del sistema:

nano /etc/systemd/system/nodejs_swmanuales.service

info Elige el nombre de tu preferencia para substituir nodejs_swmanuales

danger El fichero debe acabar en ".service"

En este nuevo fichero, deberás especificar la siguiente configuración:

[Unit]
Description=NodeJS SWManuales

[Service]
ExecStart=/var/www/nodejs.swmanuales.com/datos/web/server.js
Restart=always
User=SW002NO432
Group=SW002NO432
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/var/www/nodejs.swmanuales.com/datos/web/
    
[Install]
WantedBy=multi-user.target

info Realiza los cambios en en la configuración: Description, ExecStart, User, Group y WorkingDirectory, para que se adapte a tu entorno de trabajo.

Una vez hecho esto, podemos iniciar el servicio y habilitarlo para que se inicie automáticamente:

systemctl daemon-reload
systemctl enable nodejs_swmanuales.service
systemctl start nodejs_swmanuales.service
systemctl status nodejs_swmanuales.service

Si el comando systemctl status nodejs_swmanuales.service indica que el servidor está iniciado, ya podrás acceder desde el navegador y visualizar tu web.

De lo contrario, puedes utilizar el comando journalctl -u nodejs_swmanuales.service para comprobar los errores.

Si tienes cualquier consulta, no dudes en contactarnos a través de la Ayuda Inmediata.

i