Cómo configurar una aplicación Node.js para producción en Debian 10
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 de Node.js en la línea de comandos, este tutorial se centrará en ejecutarlas como un servicio. Esto significa que las aplicaciones se reiniciarán al reiniciar el sistema 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 Debian 10. 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, utilizando un certificado gratuito proporcionado por Let's Encrypt.
Prerrequisitos
Esta guía asume que usted tiene lo siguiente:
- Una configuración de servidor Debian 10, como se describe en la guía de configuración inicial del servidor Debian 10. Debe tener un usuario que no sea root con
sudo
privilegios y un firewall activo. - Un nombre de dominio que apunta a la IP pública de su servidor.
- Nginx instalado, como se explica en Cómo instalar Nginx en Debian 10.
- Nginx configurado con SSL mediante certificados Let's Encrypt. Cómo proteger Nginx con Let's Encrypt en Debian 10 le guiará a través del proceso.
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://your_domain/
Paso 1: Instalación de Node.js
Comencemos instalando la última versión LTS de Node.js, utilizando los archivos del paquete NodeSource.
Para instalar el PPA de NodeSource y acceder a su contenido, primero deberá actualizar el índice de su paquete e instalar curl
:
- sudo apt update
- sudo apt install curl
Asegúrate de estar en tu directorio de inicio y luego usa curl
para recuperar el script de instalación para Node.js10Archivos .x:
- cd ~
- curl -sL https://deb.nodesource.com/setup_10.x -o nodesource_setup.sh
Puede inspeccionar el contenido de este script con nano
su editor de texto preferido:
- nano nodesource_setup.sh
Cuando haya terminado de inspeccionar el script, ejecútelo en sudo
:
- sudo bash nodesource_setup.sh
El PPA se agregará a su configuración y su caché de paquetes local se actualizará automáticamente. Después de ejecutar el script de configuración desde Nodesource, puede instalar el paquete Node.js:
- sudo apt install nodejs
Para comprobar qué versión de Node.js tienes instalada después de estos pasos iniciales, escribe:
- nodejs -v
Outputv10.16.0
Nota: Al instalar desde NodeSource PPA, el ejecutable Node.js se llama nodejs
, en lugar de node
.
El nodejs
paquete contiene el nodejs
binario así como npm
un administrador de paquetes para módulos Node, por lo que no es necesario instalarlo npm
por separado.
npm
Utiliza un archivo de configuración en su directorio de inicio para realizar un seguimiento de las actualizaciones. Se creará la primera vez que ejecute npm
. Ejecute este comando para verificar que npm
esté instalado y para crear el archivo de configuración:
- npm -v
Output6.9.0
Para que algunos npm
paquetes funcionen (aquellos que requieren compilar código desde la fuente, por ejemplo), necesitarás instalar el build-essential
paquete:
- sudo apt install build-essential
Ahora tienes las herramientas necesarias para trabajar con npm
paquetes que requieren compilar código desde la fuente.
Con el entorno de ejecución Node.js instalado, podemos pasar a escribir una aplicación Node.js.
Paso 2: 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 configurar 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, vamos a crear una aplicación de muestra llamada hello.js
:
- cd ~
- 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.
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
Verá el siguiente resultado:
OutputServer running at http://localhost:3000/
Nota: ejecutar una aplicación Node.js de esta manera bloqueará comandos adicionales hasta que finalice 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 ve el siguiente resultado, la aplicación está funcionando correctamente y escuchando en la dirección y el puerto correctos:
OutputHello World!
Si no ve 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 3: 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 -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 la hello.js
aplicación 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.┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────┬───────────┬───────┬──────────┐│ App name │ id │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────┼───────────┼───────┼──────────┤│ hello │ 0 │ fork │ 1338 │ online │ 0 │ 0s │ 0% │ 23.0 MB │ sammy │ disabled │└──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────┴───────────┴───────┴──────────┘ Use `pm2 show id|name` to get more details about an app
Como puede ver, PM2 asigna automáticamente un App name
en función del nombre del archivo sin la .js
extensión, junto con un PM2 id
. PM2 también mantiene otra información, como el nombre PID
del proceso, su estado actual y el uso de la memoria.
Las aplicaciones que se ejecutan en PM2 se reiniciarán automáticamente si fallan o se cierran, 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. Escriba lo siguiente:
- sudo pm2 startup
Verá un resultado similar a este, que describe la configuración del servicio que PM2 ha generado:
Output[PM2] Init System found: systemdPlatform systemdTemplate[Unit]Description=PM2 process managerDocumentation=https://pm2.keymetrics.io/After=network.target[Service]Type=forkingUser=rootLimitNOFILE=infinityLimitNPROC=infinityLimitCORE=infinityEnvironment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/binEnvironment=PM2_HOME=/root/.pm2PIDFile=/root/.pm2/pm2.pidRestart=on-failureExecStart=/usr/lib/node_modules/pm2/bin/pm2 resurrectExecReload=/usr/lib/node_modules/pm2/bin/pm2 reload allExecStop=/usr/lib/node_modules/pm2/bin/pm2 kill[Install]WantedBy=multi-user.targetTarget path/etc/systemd/system/pm2-root.serviceCommand 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
Ahora ha creado una unidad systemd que se ejecuta pm2
durante el arranque. Esta pm2
instancia, a su vez, ejecuta hello.js
.
Inicie el servicio con systemctl
:
- sudo systemctl start pm2-root.service
Verifique el estado de la unidad systemd:
- systemctl status pm2-root.service
Debería ver un resultado como el siguiente:
Output● pm2-root.service - PM2 process manager Loaded: loaded (/etc/systemd/system/pm2-root.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2019-07-12 16:09:54 UTC; 4s ago
Para obtener una descripción detallada de systemd, consulte Conceptos básicos de Systemd: trabajar con servicios, unidades y el diario.
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 4: 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/your_domain
- sudo nano /etc/nginx/sites-available/your_domain
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/sites-available/su_dominio
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 your_domain
, el acceso a través de un navegador web enviaría la solicitud a , que escucha en el puerto en .https://your_domain/
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://your_domain/app2
/etc/nginx/sites-available/your_domain — 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 su dominio en el navegador: .https://your_domain
Conclusión
¡Felicitaciones! Ahora tiene su aplicación Node.js ejecutándose detrás de un proxy inverso Nginx en un servidor Debian 10. 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.
Deja una respuesta