Cómo optimizar la infraestructura de producción de Node.js: mejores prácticas

Prólogo
En Forward Email, hemos dedicado años a perfeccionar la configuración de nuestro entorno de producción de Node.js. Esta guía completa comparte nuestras prácticas recomendadas para la implementación de Node.js en producción, con una eficacia comprobada, centrándose en la optimización del rendimiento, la monitorización y las lecciones aprendidas al escalar aplicaciones de Node.js para gestionar millones de transacciones diarias.
Nuestra revolución de optimización del rendimiento de un solo núcleo del 573%
Al migrar de procesadores Intel a AMD Ryzen, logramos una mejora del rendimiento del 573 % en nuestras aplicaciones Node.js. Esto no fue solo una optimización menor, sino que cambió radicalmente el rendimiento de nuestras aplicaciones Node.js en producción y demuestra la importancia de la optimización del rendimiento de un solo núcleo para cualquier aplicación Node.js.
Tip
Para las mejores prácticas de implementación de producción de Node.js, la elección del hardware es crucial. Elegimos específicamente el alojamiento de DataPacket por su disponibilidad en AMD Ryzen, ya que el rendimiento de un solo núcleo es crucial para las aplicaciones Node.js, ya que la ejecución de JavaScript es de un solo subproceso.
Por qué es importante la optimización del rendimiento de un solo núcleo para Node.js
Nuestra migración de Intel a AMD Ryzen resultó en:
- Mejora del rendimiento del 573 % en el procesamiento de solicitudes (documentado en [Problema de GitHub #1519](https://github.com/forwardemail/status.forwardemail.net/issues/1519#issuecomment-2652177671 de nuestra página de estado
- Eliminación de retrasos en el procesamiento para obtener respuestas casi instantáneas (mencionado en Problema de GitHub #298)
- Mejor relación precio-rendimiento para entornos de producción de Node.js
- Tiempos de respuesta mejorados en todos los endpoints de nuestras aplicaciones
La mejora del rendimiento fue tan significativa que ahora consideramos los procesadores AMD Ryzen esenciales para cualquier implementación de producción de Node.js, ya sea que ejecute aplicaciones web, API, microservicios o cualquier otra carga de trabajo de Node.js.
Contenido relacionado {#related-content})
Para obtener más información sobre nuestras opciones de infraestructura, consulte:
- [Mejor servicio de reenvío de correo electrónico]](https://forwardemail.net/blog/docs/best-email-forwarding-service) - Comparaciones de rendimiento)
- Solución autoalojada - Recomendaciones de hardware
Configuración del entorno de producción de Node.js: nuestra pila de tecnología
Nuestras mejores prácticas para la implementación de Node.js en producción incluyen la selección de tecnologías deliberadas, basadas en años de experiencia en producción. A continuación, explicamos qué usamos y por qué estas decisiones se aplican a cualquier aplicación Node.js:
Administrador de paquetes: pnpm para eficiencia de producción
Lo que usamos: pnpm
(versión fijada)
Elegimos pnpm en lugar de npm y yarn para la configuración de nuestro entorno de producción Node.js porque:
- Tiempos de instalación más rápidos en pipelines de CI/CD
- Eficiencia del espacio en disco mediante enlaces físicos
- Resolución estricta de dependencias que evita dependencias fantasma
- Mejor rendimiento en implementaciones de producción
Note
Como parte de nuestras mejores prácticas de implementación de producción de Node.js, fijamos versiones exactas de herramientas críticas como pnpm para garantizar un comportamiento consistente en todos los entornos y las máquinas de los miembros del equipo.
Detalles de implementación:
Marco web: Koa para la producción moderna de Node.js
Lo que usamos:
Elegimos Koa en lugar de Express para nuestra infraestructura de producción de Node.js por su moderna compatibilidad con async/await y su estructura de middleware más limpia. Nuestro fundador, Nick Baugh, contribuyó tanto a Express como a Koa, brindándonos un conocimiento profundo de ambos frameworks para su uso en producción.
Estos patrones se aplican independientemente de si estás creando API REST, servidores GraphQL, aplicaciones web o microservicios.
Nuestros ejemplos de implementación:
- Configuración del servidor web
- Configuración del servidor API
- Guía de implementación de formularios de contacto
Procesamiento de trabajos en segundo plano: Bree para confiabilidad de producción
Lo que usamos: Programador bree
Creamos y mantenemos Bree porque los programadores de tareas existentes no satisfacían nuestras necesidades de compatibilidad con subprocesos de trabajo y funciones modernas de JavaScript en entornos de producción de Node.js. Esto aplica a cualquier aplicación de Node.js que requiera procesamiento en segundo plano, tareas programadas o subprocesos de trabajo.
Nuestros ejemplos de implementación:
- Configuración del servidor Bree
- Todas nuestras definiciones de trabajo
- Trabajo de verificación de salud de PM2
- Implementación del trabajo de limpieza
Manejo de errores: @hapi/boom para confiabilidad de producción
Lo que usamos: @hapi/boom
Usamos @hapi/boom para respuestas de error estructuradas en nuestras aplicaciones de producción de Node.js. Este patrón funciona para cualquier aplicación de Node.js que requiera una gestión de errores consistente.
Nuestros ejemplos de implementación:
Cómo monitorear aplicaciones Node.js en producción
Nuestro enfoque para la monitorización de aplicaciones Node.js en producción ha evolucionado a lo largo de años de ejecución a gran escala. Implementamos la monitorización en múltiples capas para garantizar la fiabilidad y el rendimiento de cualquier tipo de aplicación Node.js.
Monitoreo de producción de Node.js a nivel de sistema
Nuestra implementación principal: helpers/monitor-server.js
Lo que usamos: node-os-utils
Nuestros umbrales de monitorización de la producción (según nuestro código de producción real):
- Límite de tamaño de pila de 2 GB con alertas automáticas
- Umbral de advertencia de uso de memoria del 25 %
- Umbral de advertencia de uso de CPU del 80 %
- Umbral de advertencia de uso de disco del 75 %
Warning
Estos umbrales funcionan para nuestra configuración de hardware específica. Al implementar la monitorización de producción de Node.js, revise la implementación de monitor-server.js para comprender la lógica exacta y adaptar los valores a su configuración.
Monitoreo a nivel de aplicación para la producción de Node.js
Nuestra clasificación de error: helpers/is-code-bug.js
Este ayudante distingue entre:
- Errores de código reales que requieren atención inmediata
- Errores de usuario que son comportamiento esperado
- Errores de servicios externos que escapan a nuestro control
Este patrón se aplica a cualquier aplicación Node.js: aplicaciones web, API, microservicios o servicios en segundo plano.
Nuestra implementación de registro: helpers/logger.js
Implementamos una redacción de campos integral para proteger la información confidencial y al mismo tiempo mantener capacidades de depuración útiles en nuestro entorno de producción Node.js.
Monitoreo específico de la aplicación
Nuestras implementaciones de servidor:
Monitoreo de colas: Implementamos límites de cola de 5 GB y tiempos de espera de 180 segundos para el procesamiento de solicitudes para evitar el agotamiento de recursos. Estos patrones se aplican a cualquier aplicación Node.js con colas o procesamiento en segundo plano.
Monitoreo de producción de Node.js con comprobaciones de estado de PM2
Hemos perfeccionado la configuración de nuestro entorno de producción de Node.js con PM2 a lo largo de años de experiencia en producción. Nuestras comprobaciones de estado de PM2 son esenciales para mantener la fiabilidad de cualquier aplicación Node.js.
Nuestro sistema de control de salud PM2
Nuestra implementación principal: jobs/check-pm2.js
Nuestra monitorización de producción de Node.js con comprobaciones de estado de PM2 incluye:
- Se ejecuta cada 20 minutos mediante programación cron
- Requiere un mínimo de 15 minutos de actividad para considerar que un proceso funciona correctamente
- Valida el estado del proceso y el uso de memoria
- Reinicia automáticamente los procesos fallidos
- Evita bucles de reinicio mediante la comprobación inteligente del estado
Caution
Para las mejores prácticas de implementación de producción de Node.js, requerimos un tiempo de actividad superior a 15 minutos antes de considerar que un proceso está en buen estado para evitar bucles de reinicio. Esto evita fallos en cascada cuando los procesos tienen problemas de memoria u otros problemas.
Nuestra configuración de producción de PM2
Configuración de nuestro ecosistema: Estudie nuestros archivos de inicio del servidor para la configuración del entorno de producción de Node.js:
Estos patrones se aplican independientemente de si está ejecutando aplicaciones Express, servidores Koa, API GraphQL o cualquier otra aplicación Node.js.
Implementación automatizada de PM2
Implementación de PM2: ansible/playbooks/node.yml
Automatizamos toda nuestra configuración de PM2 a través de Ansible para garantizar implementaciones de producción de Node.js consistentes en todos nuestros servidores.
Sistema de clasificación y manejo de errores de producción
Una de nuestras prácticas recomendadas de implementación de producción de Node.js más valiosas es la clasificación inteligente de errores que se aplica a cualquier aplicación Node.js:
Nuestra implementación de isCodeBug para producción
Fuente: helpers/is-code-bug.js
Este ayudante proporciona una clasificación de errores inteligente para aplicaciones Node.js en producción para:
- Priorizar los errores reales sobre los errores del usuario
- Mejorar nuestra respuesta a incidentes centrándonos en los problemas reales
- Reducir la fatiga de alertas causada por errores esperados del usuario
- Comprender mejor los problemas de la aplicación frente a los generados por el usuario
Este patrón funciona para cualquier aplicación Node.js, ya sea que esté creando sitios de comercio electrónico, plataformas SaaS, API o microservicios.
Integración con nuestro registro de producción
Nuestra integración del registrador: helpers/logger.js
Nuestro registrador utiliza isCodeBug
para determinar los niveles de alerta y la redacción de campos, lo que garantiza que recibamos notificaciones sobre problemas reales mientras filtramos el ruido en nuestro entorno de producción Node.js.
Contenido relacionado
Obtenga más información sobre nuestros patrones de manejo de errores:
- Construyendo un sistema de pago confiable - Patrones de gestión de errores
- Protección de la privacidad del correo electrónico - Gestión de errores de seguridad
Depuración de rendimiento avanzada con v8-profiler-next y cpupro
Utilizamos herramientas avanzadas de perfilado para analizar instantáneas del montón y depurar problemas de memoria insuficiente (OOM), cuellos de botella de rendimiento y problemas de memoria de Node.js en nuestro entorno de producción. Estas herramientas son esenciales para cualquier aplicación Node.js que experimente fugas de memoria o problemas de rendimiento.
Nuestro enfoque de creación de perfiles para la producción de Node.js
Herramientas que recomendamos:
v8-profiler-next
- Para generar instantáneas de montón y perfiles de CPUcpupro
- Para analizar perfiles de CPU e instantáneas de montón
Tip
Utilizamos v8-profiler-next y cpupro para crear un flujo de trabajo completo de depuración de rendimiento para nuestras aplicaciones Node.js. Esta combinación nos ayuda a identificar fugas de memoria y cuellos de botella de rendimiento, y a optimizar nuestro código de producción.
Cómo implementamos el análisis de instantáneas de montón
Nuestra implementación de monitoreo: helpers/monitor-server.js
Nuestra monitorización de producción incluye la generación automática de instantáneas del montón cuando se superan los umbrales de memoria. Esto nos ayuda a depurar problemas de memoria insuficiente (OOM) antes de que provoquen fallos en las aplicaciones.
Patrones de implementación clave:
- Instantáneas automáticas cuando el tamaño del montón supera el límite de 2 GB
- Perfiles basados en señales para análisis bajo demanda en producción
- Políticas de retención para la gestión del almacenamiento de instantáneas
- Integración con nuestras tareas de limpieza para un mantenimiento automatizado
Flujo de trabajo de depuración de rendimiento
Estudie nuestra implementación real:
- Supervisar la implementación del servidor - Monitoreo de montón y generación de instantáneas
- Trabajo de limpieza - Retención y limpieza de instantáneas
- Integración del registrador - Registro de rendimiento
Implementación recomendada para su aplicación Node.js
Para el análisis de instantáneas del montón:
- Instalar v8-profiler-next para generar instantáneas
- Usar cpupro para analizar las instantáneas generadas
- Implementar umbrales de monitorización similares a nuestro monitor-server.js
- Configurar la limpieza automatizada para gestionar el almacenamiento de instantáneas
- Crear controladores de señales para la generación de perfiles bajo demanda en producción
Para la creación de perfiles de CPU:
- Generar perfiles de CPU durante periodos de alta carga
- Analizar con cpupro para identificar cuellos de botella
- Enfocarse en rutas de alto rendimiento y oportunidades de optimización
- Monitorear antes y después de las mejoras de rendimiento
Warning
La generación de instantáneas del montón y perfiles de CPU puede afectar el rendimiento. Recomendamos implementar la limitación y habilitar la generación de perfiles solo al investigar problemas específicos o durante periodos de mantenimiento.
Integración con nuestro monitoreo de producción
Nuestras herramientas de elaboración de perfiles se integran con nuestra estrategia de monitoreo más amplia:
- Activación automática según los umbrales de memoria/CPU
- Integración de alertas al detectar problemas de rendimiento
- Análisis histórico para rastrear las tendencias de rendimiento a lo largo del tiempo
- Correlación con las métricas de la aplicación para una depuración completa
Este enfoque nos ha ayudado a identificar y resolver fugas de memoria, optimizar rutas de código activo y mantener un rendimiento estable en nuestro entorno de producción Node.js.
Seguridad de la infraestructura de producción de Node.js
Implementamos una seguridad integral para nuestra infraestructura de producción de Node.js mediante la automatización de Ansible. Estas prácticas se aplican a cualquier aplicación de Node.js:
Seguridad a nivel de sistema para la producción de Node.js
Nuestra implementación de Ansible: ansible/playbooks/security.yml
Nuestras medidas de seguridad clave para entornos de producción de Node.js:
- Intercambio deshabilitado para evitar que se escriban datos confidenciales en el disco
- Volcados de memoria deshabilitados para evitar volcados de memoria que contengan información confidencial
- Almacenamiento USB bloqueado para evitar acceso no autorizado a datos
- Ajuste de parámetros del kernel para seguridad y rendimiento
Warning
Al implementar las mejores prácticas de implementación en producción de Node.js, deshabilitar el intercambio puede causar interrupciones por falta de memoria si la aplicación excede la RAM disponible. Monitoreamos cuidadosamente el uso de memoria y dimensionamos nuestros servidores adecuadamente.
Seguridad de aplicaciones para aplicaciones Node.js
Redacción de nuestro campo de registro: helpers/logger.js
Reducimos los campos sensibles de los registros, como contraseñas, tokens, claves API e información personal. Esto protege la privacidad del usuario y mantiene la capacidad de depuración en cualquier entorno de producción de Node.js.
Automatización de seguridad de infraestructura
Nuestra configuración completa de Ansible para la producción de Node.js:
Nuestro contenido de seguridad
Obtenga más información sobre nuestro enfoque de seguridad:
- Las mejores empresas de auditoría de seguridad
- Correo electrónico cifrado Quantum Safe
- ¿Por qué la seguridad del correo electrónico de código abierto?
Arquitectura de base de datos para aplicaciones Node.js
Utilizamos un enfoque de base de datos híbrida optimizado para nuestras aplicaciones Node.js. Estos patrones se pueden adaptar a cualquier aplicación Node.js:
Implementación de SQLite para la producción de Node.js
Lo que usamos:
Nuestra configuración: ansible/playbooks/sqlite.yml
Usamos SQLite para datos específicos del usuario en nuestras aplicaciones Node.js porque proporciona:
- Aislamiento de datos por usuario/inquilino
- Mejor rendimiento para consultas de un solo usuario
- Copia de seguridad y migración simplificadas
- Menor complejidad en comparación con bases de datos compartidas
Este patrón funciona bien para aplicaciones SaaS, sistemas multiinquilino o cualquier aplicación Node.js que necesite aislamiento de datos.
Implementación de MongoDB para la producción de Node.js
Lo que usamos:
Nuestra implementación de configuración: helpers/setup-mongoose.js
Nuestra configuración: config/mongoose.js
Usamos MongoDB para los datos de la aplicación en nuestro entorno de producción Node.js porque proporciona:
- Esquema flexible para estructuras de datos en evolución
- Mejor rendimiento para consultas complejas
- Capacidades de escalamiento horizontal
- Lenguaje de consulta enriquecido
Note
Nuestro enfoque híbrido se optimiza para nuestro caso de uso específico. Analice los patrones de uso de la base de datos en el código fuente para comprender si este enfoque se adapta a las necesidades de su aplicación Node.js.
Procesamiento de trabajo en segundo plano de producción de Node.js
Desarrollamos nuestra arquitectura de trabajos en segundo plano en torno a Bree para una implementación de producción confiable de Node.js. Esto aplica a cualquier aplicación Node.js que requiera procesamiento en segundo plano:
Nuestra configuración del servidor Bree para producción
Nuestra implementación principal: bree.js
Nuestra implementación de Ansible: ansible/playbooks/bree.yml
Ejemplos de trabajos de producción
Monitoreo de salud: jobs/check-pm2.js
Automatización de limpieza: jobs/cleanup-tmp.js
Todos nuestros trabajos: Explora nuestro directorio completo de empleos
Estos patrones se aplican a cualquier aplicación Node.js que necesite:
- Tareas programadas (procesamiento de datos, informes, limpieza)
- Procesamiento en segundo plano (redimensionamiento de imágenes, envío de correos electrónicos, importación de datos)
- Monitoreo y mantenimiento del estado
- Utilización de subprocesos de trabajo para tareas con uso intensivo de CPU
Nuestros patrones de programación de trabajos para la producción de Node.js
Estudie nuestros patrones reales de programación de trabajos en nuestro directorio de trabajos para comprender:
- Cómo implementamos la programación similar a la de cron en la producción de Node.js
- Nuestra gestión de errores y lógica de reintentos
- Cómo usamos los subprocesos de trabajo para tareas que consumen mucha CPU
Mantenimiento automatizado para aplicaciones de producción Node.js
Implementamos mantenimiento proactivo para prevenir problemas comunes en producción de Node.js. Estos patrones se aplican a cualquier aplicación Node.js:
Nuestra implementación de limpieza
Fuente: jobs/cleanup-tmp.js
Nuestro mantenimiento automatizado para aplicaciones de producción Node.js tiene como objetivo:
- Archivos temporales con más de 24 horas de antigüedad
- Archivos de registro que superan los límites de retención
- Archivos de caché y datos temporales
- Archivos subidos que ya no se necesitan
- Instantáneas de montón de la depuración de rendimiento
Estos patrones se aplican a cualquier aplicación Node.js que genere archivos temporales, registros o datos almacenados en caché.
Gestión del espacio en disco para la producción de Node.js
Nuestros umbrales de monitoreo: helpers/monitor-server.js
- Límites de cola para procesamiento en segundo plano
- Umbral de advertencia de 75 % de uso del disco
- Limpieza automática al superar los umbrales
Automatización del mantenimiento de infraestructura
Nuestra automatización de Ansible para la producción de Node.js:
Guía de implementación de producción de Node.js
Estudie nuestro código actual para conocer las mejores prácticas de producción
Comience con estos archivos clave para la configuración del entorno de producción de Node.js:
- Configuración:
config/index.js
- Monitoreo:
helpers/monitor-server.js
- Gestión de errores:
helpers/is-code-bug.js
- Registro:
helpers/logger.js
- Estado del proceso:
jobs/check-pm2.js
Aprenda de nuestras publicaciones de blog
Nuestras guías de implementación técnica para la producción de Node.js:
- Ecosistema de paquetes NPM
- Construcción de sistemas de pago
- Implementación de la privacidad del correo electrónico
- Formularios de contacto de JavaScript
- Integración de correo electrónico de React
Automatización de infraestructura para la producción de Node.js
Nuestros playbooks de Ansible para estudiar para la implementación de producción de Node.js:
Nuestros casos de estudio
Nuestras implementaciones empresariales:
- Estudio de caso de la Fundación Linux
- Caso práctico de Ubuntu de Canonical
- Reenvío de correo electrónico de exalumnos
Conclusión: Mejores prácticas de implementación de producción de Node.js
Nuestra infraestructura de producción Node.js demuestra que las aplicaciones Node.js pueden lograr una confiabilidad de nivel empresarial a través de:
- Opciones de hardware probadas (AMD Ryzen para una optimización del rendimiento de un solo núcleo del 573 %)
- Monitoreo de producción de Node.js probado en campo con umbrales específicos y respuestas automatizadas
- Clasificación inteligente de errores para mejorar la respuesta a incidentes en entornos de producción
- Depuración avanzada del rendimiento con v8-profiler-next y cpupro para la prevención de OOM
- Refuerzo integral de la seguridad mediante la automatización de Ansible
- Arquitectura de base de datos híbrida optimizada para las necesidades de la aplicación
- Mantenimiento automatizado para prevenir problemas comunes de producción de Node.js
Conclusión clave: Estudie nuestros archivos de implementación y publicaciones de blog en lugar de seguir las mejores prácticas genéricas. Nuestro código base proporciona patrones reales para la implementación en producción de Node.js, adaptables a cualquier aplicación Node.js: aplicaciones web, API, microservicios o servicios en segundo plano.
Lista completa de recursos para la producción de Node.js
Nuestros archivos de implementación principales
- Configuración principal
- Dependencias del paquete
- Monitoreo de servidores
- Clasificación de errores
- Sistema de registro
- Controles de salud de PM2
- Limpieza automatizada
Nuestras implementaciones de servidor
Nuestra Automatización de Infraestructura
- Todos nuestros playbooks de Ansible
- Fortalecimiento de la seguridad
- Configuración de Node.js
- Configuración de la base de datos
Nuestras publicaciones de blog técnico
- Análisis del ecosistema de NPM
- Implementación del sistema de pago
- Guía técnica de privacidad del correo electrónico
- Formularios de contacto de JavaScript
- Integración de correo electrónico de React
- Guía de soluciones autoalojadas