Conceptos básicos de operaciones en tiempo de ejecución
10 ejemplos para operar procesos Node.js 24 de larga duración en producción: 7 básicos y 3 intermedios.
Busca en todas las páginas de la documentación
10 ejemplos para operar procesos Node.js 24 de larga duración en producción: 7 básicos y 3 intermedios.
mkdir prod-api && cd prod-api
npm init -y
npm pkg set type=module
npm install express@5 pg
npm install -D typescript@5.6 @types/nodePara patrones de apagado y despliegue, consulta Apagado elegante y Despliegues sin tiempo de inactividad.
Kubernetes / ECS / systemd / PM2
-> inicia `node dist/main.js`
-> reinicia al salir con código de error != 0
-> envía SIGTERM en despliegue o reducción de escala
-> lee los logs de stdout
console.log(JSON.stringify({
event: "boot",
node: process.version,
env: process.env.NODE_ENV,
pid: process.pid,
}));app.get("/health", (_req, res) => res.json({ status: "ok" }));
app.get("/ready", async (_req, res) => {
const ok = await pool.query("SELECT 1");
res.status(ok ? 200 : 503).json({ status: ok ? "ready" : "not_ready" });
});uncaughtExceptionprocess.on("uncaughtException", (err) => {
console.error(JSON.stringify({ event: "uncaughtException", message: err.message, stack: err.stack }));
// Política A: salir y dejar que el supervisor reinicie (recomendado para APIs)
process.exit(1);
});uncaughtException; salir es más seguro para las APIs HTTPunhandledRejectionprocess.on("unhandledRejection", (reason) => {
console.error(JSON.stringify({ event: "unhandledRejection", reason: String(reason) }));
process.exit(1);
});app.get("/metrics/memory", (_req, res) => {
const m = process.memoryUsage();
res.json({
rss: m.rss,
heapUsed: m.heapUsed,
heapTotal: m.heapTotal,
external: m.external,
});
});nodejs_heap_size_bytes de Prometheus para una monitorización realNODE_OPTIONSNODE_OPTIONS="--max-old-space-size=384"const server = app.listen(port, "0.0.0.0");
function shutdown(signal: string) {
console.log(JSON.stringify({ event: "shutdown", signal }));
server.close(async () => {
await pool.end();
process.exit(0);
});
setTimeout(() => process.exit(1), 30_000).unref();
}
process.on("SIGTERM", () => shutdown("SIGTERM"));
process.on("SIGINT", () => shutdown("SIGINT"));// ecosystem.config.cjs
module.exports = {
apps: [{
name: "api",
script: "dist/main.js",
instances: 2,
exec_mode: "cluster",
max_memory_restart: "512M",
kill_timeout: 30_000,
listen_timeout: 10_000,
}],
};pm2 start ecosystem.config.cjs
pm2 save| Síntoma | Comprobar |
|---|---|
| CPU alta | ¿Despliegue reciente? ¿Pico de tráfico? ¿Bucle infinito en los logs? |
| Memoria alta | ¿Fuga de heap? ¿max-old-space-size vs límite? |
| 502 desde LB | ¿Pods listos? ¿Drenaje SIGTERM? ¿Tiempo de espera del upstream? |
Consulta Manuales de operaciones de guardia.
kubelet + controlador de despliegue. Tu aplicación maneja SIGTERM; K8s reinicia los contenedores fallidos.
No. Escala las réplicas de pod en lugar del módulo cluster de Node dentro de un contenedor.
Menos de terminationGracePeriodSeconds (a menudo 30-45s). Coincide con el retraso de la anulación del registro de LB + el cierre del pool de DB.
Solo stdout. Los agentes envían los logs fuera del nodo.
Node 24 LTS, coincidiendo con CI y la imagen base de Docker.
El despliegue de plataforma es dónde/cómo ejecutas los contenedores. Las operaciones en tiempo de ejecución son cómo se comporta el proceso Node una vez que está en ejecución.
Versiones de pila: Esta página fue escrita para Node.js 24.18.0 (LTS activa), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 y NestJS 11.
Revisado por Chris St. John·Última actualización: 16 jul 2026