Skip to content
VPS 2024-12-29 10 min read

Cómo Montar un Servidor de Node.js Detrás de Nginx

Node.js es conocido por su velocidad y su modelo de I/O no bloqueante, pero exponerlo directamente a internet en producción no es la práctica recomendada. Lo habitual es colocar **Nginx como proxy reverso** al frente: se encarga de terminar SSL, servir contenido estático de forma eficiente, aplicar compresión y actuar como capa de protección antes de que el tráfico llegue a tu aplicación. En esta guía montamos ese esquema completo, desde la instalación hasta la optimización final para producción.

Cómo Montar un Servidor de Node.js Detrás de Nginx
#VPS#Node.js#Nginx#Producción
T
Equipo Terranode
Editorial

Requisitos previos

  • Un VPS funcionando con Ubuntu o Debian.
  • Acceso SSH con privilegios de administrador.
  • Conocimientos básicos de terminal Linux.

Paso 1: Instalar Node.js

Actualiza el sistema primero:

bash
sudo apt update && sudo apt upgrade -y

Instala Node.js desde el repositorio oficial de NodeSource (ajusta setup_18.x a la versión LTS que necesites):

bash
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install -y nodejs

Verifica que la instalación fue exitosa:

bash
node -v
npm -v

Paso 2: Instalar Nginx

bash
sudo apt install nginx -y
sudo systemctl enable nginx
sudo systemctl start nginx
sudo systemctl status nginx

Paso 3: Crear una aplicación Node.js de prueba

Crea un directorio para tu proyecto e inicialízalo:

bash
mkdir ~/mi_app_node
cd ~/mi_app_node
npm init -y

Instala Express, el framework web más usado en el ecosistema Node:

bash
npm install express

Crea un archivo index.js con una aplicación mínima:

javascript
const express = require('express');
const app = express();
const PORT = 3000;

app.get('/', (req, res) => {
  res.send('¡Servidor Node.js funcionando correctamente!');
});

app.listen(PORT, () => {
  console.log(`Servidor corriendo en http://localhost:${PORT}`);
});

Inicia el servidor para probarlo:

bash
node index.js

Mantén tu app viva con PM2

Si ejecutas node index.js directamente, el proceso se detiene en cuanto cierras la sesión SSH. PM2 es un gestor de procesos diseñado específicamente para mantener aplicaciones Node.js corriendo en segundo plano, con reinicio automático ante fallos:

bash
sudo npm install -g pm2
pm2 start index.js
pm2 startup

El comando pm2 startup genera las instrucciones necesarias para que tu aplicación arranque automáticamente si el servidor se reinicia.

Paso 4: Configurar Nginx como proxy reverso

Crea un archivo de configuración dedicado para tu sitio:

bash
sudo nano /etc/nginx/sites-available/mi_app_node

Y define el bloque server que redirige el tráfico hacia tu aplicación Node.js, con soporte para WebSockets incluido:

nginx
server {
    listen 80;
    server_name tu_dominio.com;

    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;
    }
}

Activa la configuración creando un enlace simbólico:

bash
sudo ln -s /etc/nginx/sites-available/mi_app_node /etc/nginx/sites-enabled/

Verifica que la sintaxis sea correcta y reinicia Nginx:

bash
sudo nginx -t
sudo systemctl restart nginx

Sin este proxy reverso, tu aplicación Node.js quedaría expuesta directamente en el puerto 3000 sin ninguna capa intermedia de protección o terminación SSL.

Paso 5: Configurar el firewall

Permite únicamente el tráfico esencial: SSH y el tráfico web gestionado por Nginx.

bash
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
sudo ufw status

Nota que no necesitas abrir el puerto 3000 directamente: Nginx se encarga de recibir el tráfico externo y reenviarlo internamente hacia tu aplicación.

Paso 6: Configurar HTTPS con Let's Encrypt

bash
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d tu_dominio.com

Verifica que la renovación automática funcione correctamente:

bash
sudo certbot renew --dry-run

Más allá de proteger a tus usuarios, servir tu aplicación por HTTPS también es una señal positiva para el posicionamiento en buscadores.

Paso 7: Optimizar Nginx para producción

Ajusta los tiempos de espera para evitar desconexiones prematuras en peticiones que tardan más de lo habitual:

nginx
server {
    # ... resto de la configuración
    proxy_read_timeout 90s;
    proxy_connect_timeout 90s;
    proxy_send_timeout 90s;
}

Habilita compresión Gzip para reducir el tamaño de las respuestas transferidas:

bash
sudo nano /etc/nginx/nginx.conf
nginx
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
bash
sudo systemctl restart nginx

Colocar Nginx como proxy reverso frente a Node.js te da lo mejor de ambos mundos: la velocidad y flexibilidad de Node para tu lógica de aplicación, y la robustez de Nginx para terminación SSL, compresión y una capa adicional de seguridad. Combinado con PM2 para mantener tu proceso siempre activo, tienes una base sólida y lista para producción. Si tienes dudas durante la implementación, nuestro equipo de soporte técnico está disponible 24/7 para ayudarte.

Ready to take your site to the next level?

LiteSpeed hosting, NVMe and 24/7 support from $3/mo.

View hosting plans

Frequently asked questions