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:
Prueba que arranque manualmente:
/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:
- Recargar systemd para que reconozca el nuevo archivo:
sudo systemctl daemon-reload - Habilitar el arranque automático al encender el servidor:
sudo systemctl enable mi-api - 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):
- Instala:
npm install -g pm2 - Inicia:
pm2 start index.js --name mi-api - Configura arranque automático:
pm2 startup(ejecuta el comando que te devuelva la terminal) y luegopm2 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:
- API Node.js corriendo como servicio (systemd).
- Servidor web (Nginx) como proxy.
- Logs independientes para monitoreo.
- Sistema de limpieza automática de logs.