Configurar servicio nodejs y proxy en nginx

Share this post on:
Para crear un servicio en Ubuntu que mantenga tu API de Node.js funcionando (incluso tras un reinicio), lo más profesional es usar systemd.
Aquí tienes el paso a paso:

1. Preparar tu aplicación

Asegúrate de que tu aplicación está en una carpeta accesible y de que sabes la ruta absoluta. Por ejemplo: /home/usuario/mi-api.
Prueba que arranque manualmente: node /home/usuario/mi-api/index.js.

2. Crear el archivo del servicio

Crea un archivo con extensión .service en el directorio de servicios de Ubuntu:
sudo nano /etc/systemd/system/mi-api.service

3. Configurar el servicio

Pega el siguiente contenido, ajustando las rutas y el usuario:
[Unit]
Description=Servicio API Node.js
After=network.target

[Service]
# Usuario que ejecutará el servicio (no uses root por seguridad)
User=tu_usuario
# Carpeta donde está tu proyecto
WorkingDirectory=/home/tu_usuario/mi-api
# Ruta absoluta a node y al archivo principal
ExecStart=/usr/bin/node /home/tu_usuario/mi-api/index.js
# Reinicia el servicio automáticamente si falla
Restart=always
# Tiempo de espera antes de reiniciar
RestartSec=10
# Entorno (puedes pasarle el puerto o variables de producción)
Environment=NODE_ENV=production PORT=3000

[Install]
WantedBy=multi-user.target
Nota: Si no sabes dónde está node, ejecuta which node en la terminal.

4. Activar e iniciar el servicio

Una vez guardado el archivo (Ctrl+O, Enter, Ctrl+X), ejecuta estos comandos:
  1. Recargar systemd para que reconozca el nuevo archivo:
    sudo systemctl daemon-reload
    
  2. Habilitar el arranque automático al encender el servidor:
    sudo systemctl enable mi-api
    
  3. Iniciar el servicio ahora mismo:
    sudo systemctl start mi-api
    

5. Comandos útiles de gestión

  • Ver el estado: sudo systemctl status mi-api (ideal para ver si hay errores).
  • Ver los logs (consola): journalctl -u mi-api -f
  • Reiniciar: sudo systemctl restart mi-api

Alternativa rápida: PM2

Si prefieres algo menos manual, puedes usar PM2 (Process Manager 2):
  1. Instala: npm install -g pm2
  2. Inicia: pm2 start index.js --name mi-api
  3. Configura arranque automático: pm2 startup (ejecuta el comando que te devuelva la terminal) y luego pm2 save.
Configurar Nginx como proxy inverso es el paso final para que tu API sea profesional. Esto permite que el tráfico llegue al puerto estándar 80 (HTTP) o 443 (HTTPS) y Nginx lo redirija internamente al puerto de tu app Node.js (por ejemplo, el 3000).
Aquí tienes los pasos:

1. Instalar Nginx

sudo apt update
sudo apt install nginx

2. Crear el archivo de configuración

Crea un archivo para tu API (sustituye mi-api por el nombre que quieras):
sudo nano /etc/nginx/sites-available/mi-api

3. Configurar el Proxy

Pega el siguiente bloque. Si no tienes un dominio todavía, puedes usar la IP de tu servidor en server_name:
server {
    listen 80;
    server_name tu_dominio.com o_tu_ip_publica;

    location / {
        # Redirige el tráfico al puerto donde corre tu Node.js
        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;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

4. Activar la configuración

Para activar este sitio, crea un “enlace simbólico” hacia la carpeta de sitios habilitados:
sudo ln -s /etc/nginx/sites-available/mi-api /etc/nginx/sites-enabled/

5. Verificar y Reiniciar

Es vital revisar que no haya errores de sintaxis antes de reiniciar:
sudo nginx -t
Si dice que el test es exitoso (syntax is ok), reinicia Nginx:
sudo systemctl restart nginx

Pasos Extra Recomendados:

  • Firewall: Si usas ufw, permite el tráfico de Nginx:
    sudo ufw allow 'Nginx Full'
  • Seguridad (SSL/HTTPS): Si ya tienes un dominio apuntando a tu IP, puedes ponerle candadito (SSL) gratis en 2 minutos con Certbot:
    sudo apt install python3-certbot-nginx
    sudo certbot --nginx -d tu_dominio.com
    
Para que los logs de tu API no se mezclen con los de otros sitios y sea más fácil encontrar errores, vamos a definir rutas específicas para los archivos de log dentro del bloque de Nginx.

1. Crear la carpeta para los logs (opcional pero recomendado)

Es buena idea tener una carpeta dedicada, aunque Nginx puede escribirlos en /var/log/nginx/ directamente:
sudo mkdir -p /var/log/nginx/mi-api/
sudo chown -R www-data:www-data /var/log/nginx/mi-api/

2. Modificar la configuración de Nginx

Abre el archivo que creamos antes:
sudo nano /etc/nginx/sites-available/mi-api
Añade las líneas access_log y error_log dentro del bloque server:
server {
    listen 80;
    server_name tu_dominio.com;

    # Logs específicos para esta API
    access_log /var/log/nginx/mi-api/access.log;
    error_log /var/log/nginx/mi-api/error.log;

    location / {
        proxy_pass http://localhost:3000;
        # ... resto de la configuración que ya pusimos ...
    }
}

3. Aplicar los cambios

Verifica que todo esté bien y recarga:
sudo nginx -t
sudo systemctl reload nginx

4. Cómo monitorear tu API en tiempo real

Ahora puedes ver qué está pasando con tu API (peticiones entrantes o errores) usando el comando tail:
  • Ver quién entra: tail -f /var/log/nginx/mi-api/access.log
  • Ver solo los errores: tail -f /var/log/nginx/mi-api/error.log

Tip Pro: Loguear el tiempo de respuesta

Si quieres saber cuánto tarda tu API de Node.js en responder a cada petición desde la perspectiva de Nginx, puedes definir un formato de log personalizado en /etc/nginx/nginx.conf, pero por ahora, con los logs separados tendrás suficiente control.
Para evitar que los archivos de log llenen el disco duro, Ubuntu usa una herramienta llamada logrotate. Por defecto, Nginx ya tiene una configuración general, pero como creamos una carpeta personalizada, debemos asegurarnos de que se incluya.

1. Crear el archivo de configuración para tu API

Crea un nuevo archivo en el directorio de logrotate:
sudo nano /etc/logrotate.d/mi-api

2. Definir las reglas de rotación

Pega el siguiente contenido (asumiendo que usamos la ruta /var/log/nginx/mi-api/):
/var/log/nginx/mi-api/*.log {
    daily            # Rota los logs cada día
    missingok        # Si el archivo no existe, no da error
    rotate 14        # Guarda los últimos 14 días de logs
    compress         # Comprime los logs viejos (.gz) para ahorrar espacio
    delaycompress    # No comprime el log del día anterior (por si se sigue escribiendo)
    notifempty       # No rota el log si está vacío
    create 0640 www-data adm # Permisos y dueño del nuevo archivo
    sharedscripts    # Ejecuta el postrotate solo una vez para todos los archivos
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

3. Explicación de los comandos clave:

  • daily: Ideal para APIs con mucho tráfico. Si tienes poco tráfico, puedes cambiarlo a weekly.
  • rotate 14: Después de dos semanas, el log más viejo se borra permanentemente.
  • postrotate: Este bloque es fundamental. Envía una señal (USR1) a Nginx para decirle: “He movido el archivo de log actual, por favor abre uno nuevo y sigue escribiendo ahí”.

4. Probar que funciona

No necesitas reiniciar ningún servicio, pero puedes forzar una prueba para ver si hay errores de sintaxis:
sudo logrotate -d /etc/logrotate.d/mi-api
(El parámetro -d es “debug”: simula el proceso pero no borra ni mueve nada).

¡Listo! Ya tienes:
  1. API Node.js corriendo como servicio (systemd).
  2. Servidor web (Nginx) como proxy.
  3. Logs independientes para monitoreo.
  4. Sistema de limpieza automática de logs.
Share this post on:

Leave a Reply

Your email address will not be published. Required fields are marked *