Cómo instalar Node.js en Debian 10 y configurar Nginx como servidor proxy frontal

Node.js es una plataforma JavaScript gratuita y de código abierto que puede utilizarse para servir contenidos dinámicos y receptivos del lado del servidor. Se basa en el motor JavaScript V8 de Chrome y es capaz de ejecutar código JavaScript fuera de un navegador web. Puede ejecutarse en varios sistemas operativos, como Linux, FreeBSD, Windows y macOS. Node.js también funciona en otros servidores web como Apache y Nginx.

En este tutorial, aprenderemos a instalar y configurar Node.js para gestionar las peticiones del backend y a configurar Nginx para gestionar las peticiones del frontend en Debian 10.

Requisitos previos

  • Un servidor con Debian 10.
  • Una contraseña de root configurada en tu servidor.

Cómo empezar

En primer lugar, se recomienda actualizar tu sistema a la última versión. Puedes hacerlo con el siguiente comando:

apt-get update -y
apt-get upgrade -y

Una vez actualizado tu servidor, reinícialo para aplicar los cambios.

Instalar Node.js

Por defecto, la última versión de Node.js no está disponible en el repositorio por defecto de Debian 10. Así que tendrás que instalarla desde el script.

Primero, instala curl con el siguiente comando:

apt-get install curl -y

A continuación, descarga e instala el script de instalación de Node.js con el siguiente comando:

curl -sL https://deb.nodesource.com/setup_12.x | bash -

Una vez completada la instalación, puedes instalar el Node.js con el siguiente comando:

apt-get install nodejs -y

Una vez que la instalación se haya completado con éxito, puedes verificar la versión de Node.js con el siguiente comando:

nodejs --version

Deberías ver la versión de Node.js en la siguiente salida:

v12.16.1

También puedes comprobar la versión de NPM ejecutando el siguiente comando:

npm --version

Deberías ver la versión de NPM en la siguiente salida:

6.13.4

Crear una aplicación Node.js

En primer lugar, tendrás que crear un directorio para tu aplicación. Puedes crearlo ejecutando el siguiente comando:

mkdir nodeapp

A continuación, cambia el directorio a nodeapp e instala express con el siguiente comando:

cd nodeapp
npm install express

A continuación, crea una aplicación Node.js de ejemplo con express utilizando el editor nano:

nano app.js

Añade el siguiente contenido:

var express = require('express');
var app = express();
app.get('/', function(req, res){
   res.send("Nginx as Frontend Server for Node.js!");
});
app.listen(8000, '127.0.0.1');

Guarda y cierra el archivo cuando hayas terminado.

A continuación, ejecuta tu aplicación con el siguiente comando:

node app.js

A continuación, abre otro terminal y verifica la aplicación con el siguiente comando:

netstat -antup | grep 8000

Deberías ver que tu aplicación Node.js está escuchando en el puerto 8000:

tcp        0      0 127.0.0.1:8000          0.0.0.0:*               LISTEN      26193/node

También puedes verificar la aplicación utilizando el comando curl como se muestra a continuación:

curl http://127.0.0.1:8000

Si todo está bien, deberías obtener la siguiente salida:

Nginx as Frontend Server for Node.js!

Instalar y configurar PM2

PM2 es un gestor de procesos para gestionar la aplicación Node.js. Puedes iniciar, detener y habilitar fácilmente la aplicación Node.js para que se inicie en el arranque utilizando PM2.

Primero, instala la última versión de PM2 usando NPM como se muestra a continuación:

npm install pm2 -g

Una vez instalada, cambia el directorio a nodeapp y tu aplicación con el siguiente comando:

cd nodeapp
pm2 start app.js

Una vez iniciada la aplicación, deberías obtener la siguiente salida:

                        -------------

__/\\\\\\\\\\\\\____/\\\\____________/\\\\____/\\\\\\\\\_____
 _\/\\\/////////\\\_\/\\\\\\________/\\\\\\__/\\\///////\\\___
  _\/\\\_______\/\\\_\/\\\//\\\____/\\\//\\\_\///______\//\\\__
   _\/\\\\\\\\\\\\\/__\/\\\\///\\\/\\\/_\/\\\___________/\\\/___
    _\/\\\/////////____\/\\\__\///\\\/___\/\\\________/\\\//_____
     _\/\\\_____________\/\\\____\///_____\/\\\_____/\\\//________
      _\/\\\_____________\/\\\_____________\/\\\___/\\\/___________
       _\/\\\_____________\/\\\_____________\/\\\__/\\\\\\\\\\\\\\\_
        _\///______________\///______________\///__\///////////////__


                          Runtime Edition

        PM2 is a Production Process Manager for Node.js applications
                     with a built-in Load Balancer.

                Start and Daemonize any application:
                $ pm2 start app.js

                Load Balance 4 instances of api.js:
                $ pm2 start api.js -i 4

                Monitor in production:
                $ pm2 monitor

                Make pm2 auto-boot at server restart:
                $ pm2 startup

                To go further checkout:
                http://pm2.io/


                        -------------

[PM2] Spawning PM2 daemon with pm2_home=/root/.pm2
[PM2] PM2 Successfully daemonized
[PM2] Starting /root/nodeapp/app.js in fork_mode (1 instance)
[PM2] Done.
?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
? id  ? name   ? namespace   ? version ? mode    ? pid      ? uptime ? ?    ? status    ? cpu      ? mem      ? user     ? watching ?
?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
? 0   ? app    ? default     ? N/A     ? fork    ? 13202    ? 0s     ? 0    ? online    ? 0%       ? 27.2mb   ? root     ? disabled ?
?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

En la salida anterior, puedes ver información muy útil como, el PID de la aplicación, el tiempo de actividad, el estado, el uso de la CPU y la memoria.

A continuación, ejecuta el siguiente comando para crear y configurar un script de inicio para la aplicación Node.js de forma que tu aplicación Node.js se inicie automáticamente al arrancar.

pm2 startup

Deberías obtener la siguiente salida:

[PM2] Init System found: systemd
Platform systemd
Template
[Unit]
Description=PM2 process manager
Documentation=https://pm2.keymetrics.io/
After=network.target

[Service]
Type=forking
User=root
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PM2_HOME=/root/.pm2
PIDFile=/root/.pm2/pm2.pid
Restart=on-failure

ExecStart=/usr/lib/node_modules/pm2/bin/pm2 resurrect
ExecReload=/usr/lib/node_modules/pm2/bin/pm2 reload all
ExecStop=/usr/lib/node_modules/pm2/bin/pm2 kill

[Install]
WantedBy=multi-user.target

Target path
/etc/systemd/system/pm2-root.service
Command list
[ 'systemctl enable pm2-root' ]
[PM2] Writing init configuration in /etc/systemd/system/pm2-root.service
[PM2] Making script booting at startup...
[PM2] [-] Executing: systemctl enable pm2-root...
Created symlink /etc/systemd/system/multi-user.target.wants/pm2-root.service → /etc/systemd/system/pm2-root.service.
[PM2] [v] Command successfully executed.
+---------------------------------------+
[PM2] Freeze a process list on reboot via:
$ pm2 save

[PM2] Remove init script via:
$ pm2 unstartup systemd

A continuación, inicia el servicio PM2 con el siguiente comando:

systemctl start pm2-root

A continuación, verifica el estado del servicio PM2 con el siguiente comando:

systemctl status pm2-root

Deberías obtener la siguiente salida:

? pm2-root.service - PM2 process manager
   Loaded: loaded (/etc/systemd/system/pm2-root.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2020-03-26 06:04:28 UTC; 2s ago
     Docs: https://pm2.keymetrics.io/
  Process: 13387 ExecStart=/usr/lib/node_modules/pm2/bin/pm2 resurrect (code=exited, status=0/SUCCESS)
 Main PID: 13191 (PM2 v4.2.3: God)
    Tasks: 0 (limit: 4915)
   CGroup: /system.slice/pm2-root.service
           ? 13191 PM2 v4.2.3: God Daemon (/root/.pm2)

Mar 26 06:04:28 kolab.linuxbuz.com pm2[13387]: [PM2] Restoring processes located in /root/.pm2/dump.pm2.bak
Mar 26 06:04:28 kolab.linuxbuz.com pm2[13387]: [PM2][ERROR] Failed to read dump file in /root/.pm2/dump.pm2.bak
Mar 26 06:04:28 kolab.linuxbuz.com pm2[13387]: [PM2][ERROR] No processes saved; DUMP file doesn't exist
Mar 26 06:04:28 kolab.linuxbuz.com pm2[13387]: ? PM2+ activated | Instance Name: node.myserver.tld-109e | Dash: https://app.pm2.io/#/r/7p66twg
Mar 26 06:04:28 kolab.linuxbuz.com pm2[13387]: ????????????????????????????????????????????????????????????????????????????????????????????????
Mar 26 06:04:28 kolab.linuxbuz.com pm2[13387]: ? id  ? name   ? namespace   ? version ? mode    ? pid      ? uptime ? ?    ? status    ? cpu   
Mar 26 06:04:28 kolab.linuxbuz.com pm2[13387]: ????????????????????????????????????????????????????????????????????????????????????????????????
Mar 26 06:04:28 kolab.linuxbuz.com pm2[13387]: ? 0   ? app    ? default     ? N/A     ? fork    ? 13202    ? 8m     ? 0    ? online    ? 0%    
Mar 26 06:04:28 kolab.linuxbuz.com pm2[13387]: ????????????????????????????????????????????????????????????????????????????????????????????????
Mar 26 06:04:28 kolab.linuxbuz.com systemd[1]: Started PM2 process manager.

Configurar Nginx como proxy inverso para Node.js

En este punto, tu aplicación Node.js se está ejecutando y escuchando en el localhost. A continuación, tendrás que configurar Nginx como servidor proxy frontal para la aplicación Node.js, para que cualquier usuario pueda acceder a tu aplicación a través de Internet.

Primero, instala el servidor web Nginx con el siguiente comando:

apt-get install nginx -y

Una vez instalado, crea un archivo de configuración de host virtual Nginx para la aplicación Node.js:

nano /etc/nginx/sites-enabled/myapp.conf

Añade el siguiente contenido:

server {
    listen 80;
    server_name node.myserver.tld;
    location / {
        proxy_pass http://127.0.0.1:8000;
        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;
     }
}

Guarda y cierra el archivo cuando hayas terminado. A continuación, reinicia el servidor Nginx para aplicar los cambios:

systemctl restart nginx

Puedes verificar el estado del servicio Nginx con el siguiente comando:

systemctl status nginx

Deberías ver la siguiente salida:

? nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2020-03-25 12:42:49 UTC; 5min ago
     Docs: man:nginx(8)
  Process: 26180 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
  Process: 26182 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
 Main PID: 26183 (nginx)
    Tasks: 3 (limit: 2359)
   Memory: 5.5M
   CGroup: /system.slice/nginx.service
           ??26183 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
           ??26184 nginx: worker process
           ??26185 nginx: worker process

Mar 25 12:42:49 debian10 systemd[1]: Starting A high performance web server and a reverse proxy server...
Mar 25 12:42:49 debian10 systemd[1]: Started A high performance web server and a reverse proxy server.

Una vez que hayas terminado, puedes pasar al siguiente paso.

Accede a tu aplicación Node.js

En este punto, Nginx está configurado para servir a tu aplicación Node.js.

Ahora, abre tu navegador web y escribe la URL http://node.myserver.tld. Deberías ver tu aplicación Node.js en la siguiente pantalla:

Página de Node.js

Conclusión

En el artículo anterior, has aprendido a configurar la aplicación Node.js en Debian 10. También has aprendido a ejecutar la aplicación Node.js como demonio y a configurar Nginx como proxy inverso para servir la aplicación. Espero que ahora puedas alojar fácilmente tu aplicación Node.js en un entorno de producción.

También te podría gustar...