Comment optimiser l'infrastructure de production Node.js : meilleures pratiques
Avant-propos
Chez Forward Email, nous avons passé des années à perfectionner notre configuration d'environnement de production Node.js. Ce guide complet partage nos meilleures pratiques éprouvées pour le déploiement en production de Node.js, en mettant l'accent sur l'optimisation des performances, la surveillance et les leçons que nous avons apprises en faisant évoluer des applications Node.js pour gérer des millions de transactions quotidiennes.
Notre révolution d'optimisation des performances monocœur de 573 %
Lorsque nous sommes passés des processeurs Intel aux processeurs AMD Ryzen, nous avons obtenu une amélioration des performances de 573 % dans nos applications Node.js. Ce n'était pas simplement une optimisation mineure — cela a fondamentalement changé la façon dont nos applications Node.js fonctionnent en production et démontre l'importance de l'optimisation des performances monocœur pour toute application Node.js.
Tip
Pour les meilleures pratiques de déploiement en production Node.js, le choix du matériel est crucial. Nous avons spécifiquement choisi l'hébergement DataPacket pour leur disponibilité des processeurs AMD Ryzen car la performance monocœur est essentielle pour les applications Node.js puisque l'exécution de JavaScript est mono-thread.
Pourquoi l'optimisation des performances monocœur est importante pour Node.js
Notre migration d'Intel vers AMD Ryzen a entraîné :
- Une amélioration des performances de 573 % dans le traitement des requêtes (documentée dans le GitHub Issue #1519 de notre page de statut)
- Élimination des délais de traitement pour des réponses quasi instantanées (mentionné dans GitHub Issue #298)
- Un meilleur rapport qualité-prix pour les environnements de production Node.js
- Des temps de réponse améliorés sur tous nos points d'accès applicatifs
Le gain de performance a été si important que nous considérons désormais les processeurs AMD Ryzen comme essentiels pour tout déploiement sérieux de Node.js en production, que vous exécutiez des applications web, des API, des microservices ou toute autre charge de travail Node.js.
Contenu connexe
Pour plus de détails sur nos choix d'infrastructure, consultez :
- Meilleur service de redirection d'email - Comparaisons de performances
- Solution auto-hébergée - Recommandations matérielles
Configuration de l'environnement de production Node.js : notre stack technologique
Nos meilleures pratiques de déploiement en production Node.js incluent des choix technologiques délibérés basés sur des années d'expérience en production. Voici ce que nous utilisons et pourquoi ces choix s'appliquent à toute application Node.js :
Gestionnaire de paquets : pnpm pour une efficacité en production
Ce que nous utilisons : pnpm (version figée)
Nous avons choisi pnpm plutôt que npm et yarn pour notre configuration d'environnement de production Node.js parce que :
- Des temps d'installation plus rapides dans les pipelines CI/CD
- Efficacité de l'espace disque grâce au hard linking
- Résolution stricte des dépendances qui empêche les dépendances fantômes
- Meilleure performance dans les déploiements en production
Note
Dans le cadre de nos meilleures pratiques de déploiement en production Node.js, nous fixons des versions exactes des outils critiques comme pnpm pour garantir un comportement cohérent sur tous les environnements et les machines des membres de l'équipe.
Détails de l'implémentation :
Framework web : Koa pour une production Node.js moderne
Ce que nous utilisons :
@koa/router@koa/multer@ladjs/koa-simple-ratelimitNous avons choisi Koa plutôt qu’Express pour notre infrastructure de production Node.js en raison de son support moderne d’async/await et de sa composition de middleware plus propre. Notre fondateur Nick Baugh a contribué à la fois à Express et à Koa, ce qui nous donne une connaissance approfondie des deux frameworks pour une utilisation en production.
Ces modèles s’appliquent que vous construisiez des API REST, des serveurs GraphQL, des applications web ou des microservices.
Nos exemples d’implémentation :
- Configuration du serveur web
- Configuration du serveur API
- Guide d’implémentation des formulaires de contact
Traitement des tâches en arrière-plan : Bree pour la fiabilité en production
Ce que nous utilisons : planificateur bree
Nous avons créé et maintenons Bree car les planificateurs de tâches existants ne répondaient pas à nos besoins en matière de support des threads workers et des fonctionnalités modernes de JavaScript dans les environnements Node.js de production. Cela s’applique à toute application Node.js nécessitant un traitement en arrière-plan, des tâches planifiées ou des threads workers.
Nos exemples d’implémentation :
- Configuration du serveur Bree
- Toutes nos définitions de tâches
- Tâche de vérification de santé PM2
- Implémentation de la tâche de nettoyage
Gestion des erreurs : @hapi/boom pour la fiabilité en production
Ce que nous utilisons : @hapi/boom
Nous utilisons @hapi/boom pour des réponses d’erreur structurées dans toutes nos applications Node.js en production. Ce modèle fonctionne pour toute application Node.js nécessitant une gestion cohérente des erreurs.
Nos exemples d’implémentation :
Comment surveiller les applications Node.js en production
Notre approche de la surveillance des applications Node.js en production a évolué au fil des années d’exploitation à grande échelle. Nous mettons en œuvre la surveillance à plusieurs niveaux pour garantir la fiabilité et la performance de tout type d’application Node.js.
Surveillance Node.js au niveau système en production
Notre implémentation principale : helpers/monitor-server.js
Ce que nous utilisons : node-os-utils
Nos seuils de surveillance en production (tirés de notre code de production réel) :
- Limite de taille du tas à 2 Go avec alertes automatiques
- Seuil d’avertissement à 25 % d’utilisation mémoire
- Seuil d’alerte à 80 % d’utilisation CPU
- Seuil d’avertissement à 75 % d’utilisation disque
Warning
Ces seuils fonctionnent pour notre configuration matérielle spécifique. Lors de la mise en œuvre de la surveillance Node.js en production, consultez notre implémentation monitor-server.js pour comprendre la logique exacte et adapter les valeurs à votre configuration.
Surveillance au niveau application pour Node.js en production
Notre classification des erreurs : helpers/is-code-bug.js
Cet assistant distingue entre :
- Bugs réels dans le code nécessitant une attention immédiate
- Erreurs utilisateur qui sont un comportement attendu
- Défaillances de services externes que nous ne pouvons pas contrôler
Ce modèle s’applique à toute application Node.js – applications web, API, microservices ou services en arrière-plan.
Notre implémentation de journalisation : helpers/logger.js
Nous mettons en œuvre une rédaction complète des champs pour protéger les informations sensibles tout en maintenant des capacités de débogage utiles dans notre environnement de production Node.js.
Surveillance spécifique à l'application
Nos implémentations serveur :
Surveillance de la file d'attente : Nous appliquons des limites de file d'attente de 5 Go et des délais d'attente de 180 secondes pour le traitement des requêtes afin d'éviter l'épuisement des ressources. Ces modèles s'appliquent à toute application Node.js avec des files d'attente ou un traitement en arrière-plan.
Surveillance de production Node.js avec les contrôles de santé PM2
Nous avons affiné notre configuration d'environnement de production Node.js avec PM2 au fil des années d'expérience en production. Nos contrôles de santé PM2 sont essentiels pour maintenir la fiabilité dans toute application Node.js.
Notre système de contrôle de santé PM2
Notre implémentation principale : jobs/check-pm2.js
Notre surveillance de production Node.js avec les contrôles de santé PM2 inclut :
- Exécution toutes les 20 minutes via une planification cron
- Nécessite un temps de fonctionnement minimum de 15 minutes avant de considérer un processus comme sain
- Valide le statut du processus et l'utilisation de la mémoire
- Redémarre automatiquement les processus en échec
- Prévient les boucles de redémarrage grâce à un contrôle de santé intelligent
Caution
Pour les meilleures pratiques de déploiement en production Node.js, nous exigeons un temps de fonctionnement de plus de 15 minutes avant de considérer un processus comme sain afin d'éviter les boucles de redémarrage. Cela prévient les défaillances en cascade lorsque les processus rencontrent des problèmes de mémoire ou autres.
Notre configuration de production PM2
Notre configuration d'écosystème : Étudiez nos fichiers de démarrage serveur pour la configuration de l'environnement de production Node.js :
Ces modèles s'appliquent que vous exécutiez des applications Express, des serveurs Koa, des API GraphQL ou toute autre application Node.js.
Déploiement automatisé PM2
Déploiement PM2 : ansible/playbooks/node.yml
Nous automatisons toute notre configuration PM2 via Ansible pour garantir des déploiements de production Node.js cohérents sur tous nos serveurs.
Système de gestion et classification des erreurs en production
L'une de nos meilleures pratiques de déploiement en production Node.js les plus précieuses est la classification intelligente des erreurs applicable à toute application Node.js :
Notre implémentation isCodeBug pour la production
Source : helpers/is-code-bug.js
Cet assistant fournit une classification intelligente des erreurs pour les applications Node.js en production afin de :
- Prioriser les bugs réels par rapport aux erreurs utilisateur
- Améliorer notre réponse aux incidents en se concentrant sur les problèmes réels
- Réduire la fatigue des alertes causée par les erreurs utilisateur attendues
- Mieux comprendre les problèmes liés à l'application versus ceux générés par l'utilisateur
Ce modèle fonctionne pour toute application Node.js - que vous développiez des sites e-commerce, des plateformes SaaS, des API ou des microservices.
Intégration avec notre journalisation de production
Notre intégration du logger : helpers/logger.js
Notre journal utilise isCodeBug pour déterminer les niveaux d'alerte et la rédaction des champs, garantissant que nous soyons informés des vrais problèmes tout en filtrant le bruit dans notre environnement de production Node.js.
Contenu Connexe
En savoir plus sur nos modèles de gestion des erreurs :
- Construire un système de paiement fiable - Modèles de gestion des erreurs
- Protection de la vie privée par email - Gestion des erreurs de sécurité
Débogage avancé des performances avec v8-profiler-next et cpupro
Nous utilisons des outils de profilage avancés pour analyser les instantanés du tas et déboguer les problèmes d'OOM (Out of Memory), les goulets d'étranglement de performance et les problèmes de mémoire Node.js dans notre environnement de production. Ces outils sont essentiels pour toute application Node.js rencontrant des fuites de mémoire ou des problèmes de performance.
Notre approche de profilage pour la production Node.js
Outils que nous recommandons :
v8-profiler-next- Pour générer des instantanés du tas et des profils CPUcpupro- Pour analyser les profils CPU et les instantanés du tas
Tip
Nous utilisons v8-profiler-next et cpupro ensemble pour créer un flux de travail complet de débogage des performances pour nos applications Node.js. Cette combinaison nous aide à identifier les fuites de mémoire, les goulets d'étranglement de performance et à optimiser notre code de production.
Comment nous implémentons l'analyse des instantanés du tas
Notre implémentation de surveillance : helpers/monitor-server.js
Notre surveillance en production inclut la génération automatique d'instantanés du tas lorsque les seuils de mémoire sont dépassés. Cela nous aide à déboguer les problèmes d'OOM avant qu'ils ne provoquent des plantages de l'application.
Modèles clés d'implémentation :
- Instantanés automatiques lorsque la taille du tas dépasse le seuil de 2 Go
- Profilage basé sur les signaux pour une analyse à la demande en production
- Politiques de rétention pour gérer le stockage des instantanés
- Intégration avec nos tâches de nettoyage pour une maintenance automatisée
Flux de travail de débogage des performances
Étudiez notre implémentation réelle :
- Implémentation du serveur de surveillance - Surveillance du tas et génération d'instantanés
- Tâche de nettoyage - Rétention et nettoyage des instantanés
- Intégration du journal - Journalisation des performances
Implémentation recommandée pour votre application Node.js
Pour l'analyse des instantanés du tas :
- Installer v8-profiler-next pour la génération d'instantanés
- Utiliser cpupro pour analyser les instantanés générés
- Implémenter des seuils de surveillance similaires à notre monitor-server.js
- Mettre en place un nettoyage automatisé pour gérer le stockage des instantanés
- Créer des gestionnaires de signaux pour le profilage à la demande en production
Pour le profilage CPU :
- Générer des profils CPU pendant les périodes de forte charge
- Analyser avec cpupro pour identifier les goulets d'étranglement
- Se concentrer sur les chemins chauds et les opportunités d'optimisation
- Surveiller avant/après les améliorations de performance
Warning
La génération d'instantanés du tas et de profils CPU peut impacter les performances. Nous recommandons d'implémenter un contrôle de débit et de n'activer le profilage que lors de l'investigation de problèmes spécifiques ou pendant les fenêtres de maintenance.
Intégration avec notre surveillance de production
Nos outils de profilage s'intègrent à notre stratégie de surveillance globale :
- Déclenchement automatique basé sur les seuils de mémoire/CPU
- Intégration des alertes lorsque des problèmes de performance sont détectés
- Analyse historique pour suivre les tendances de performance dans le temps
- Corrélation avec les métriques applicatives pour un débogage complet Cette approche nous a aidés à identifier et résoudre des fuites de mémoire, optimiser les chemins de code critiques et maintenir des performances stables dans notre environnement de production Node.js.
Sécurité de l'infrastructure de production Node.js
Nous mettons en œuvre une sécurité complète pour notre infrastructure de production Node.js via l'automatisation Ansible. Ces pratiques s'appliquent à toute application Node.js :
Sécurité au niveau système pour la production Node.js
Notre implémentation Ansible : ansible/playbooks/security.yml
Nos principales mesures de sécurité pour les environnements de production Node.js :
- Swap désactivé pour empêcher l'écriture de données sensibles sur le disque
- Core dumps désactivés pour éviter les vidages mémoire contenant des informations sensibles
- Stockage USB bloqué pour empêcher l'accès non autorisé aux données
- Ajustement des paramètres du noyau pour la sécurité et la performance
Warning
Lors de la mise en œuvre des meilleures pratiques de déploiement en production Node.js, la désactivation du swap peut entraîner des arrêts pour manque de mémoire si votre application dépasse la RAM disponible. Nous surveillons attentivement l'utilisation de la mémoire et dimensionnons nos serveurs en conséquence.
Sécurité des applications pour les applications Node.js
Notre redaction des champs de logs : helpers/logger.js
Nous rédigeons les champs sensibles des logs, y compris mots de passe, jetons, clés API et informations personnelles. Cela protège la vie privée des utilisateurs tout en maintenant les capacités de débogage dans tout environnement de production Node.js.
Automatisation de la sécurité de l'infrastructure
Notre configuration complète Ansible pour la production Node.js :
Notre contenu sur la sécurité
En savoir plus sur notre approche de la sécurité :
- Meilleures entreprises d'audit de sécurité
- Email chiffré quantique sécurisé
- Pourquoi la sécurité email open source
Architecture de base de données pour les applications Node.js
Nous utilisons une approche hybride de base de données optimisée pour nos applications Node.js. Ces modèles peuvent être adaptés à toute application Node.js :
Implémentation SQLite pour la production Node.js
Ce que nous utilisons :
Notre configuration : ansible/playbooks/sqlite.yml
Nous utilisons SQLite pour les données spécifiques aux utilisateurs dans nos applications Node.js car il offre :
- Isolation des données par utilisateur/locataire
- Meilleure performance pour les requêtes mono-utilisateur
- Sauvegarde et migration simplifiées
- Complexité réduite comparée aux bases de données partagées
Ce modèle fonctionne bien pour les applications SaaS, les systèmes multi-locataires ou toute application Node.js nécessitant une isolation des données.
Implémentation MongoDB pour la production Node.js
Ce que nous utilisons :
@ladjs/mongoose@ladjs/mongoose-error-messages@zainundin/mongoose-factoryNotre implémentation de configuration :helpers/setup-mongoose.js
Notre configuration : config/mongoose.js
Nous utilisons MongoDB pour les données applicatives dans notre environnement de production Node.js car il offre :
- Schéma flexible pour des structures de données évolutives
- Meilleure performance pour les requêtes complexes
- Capacités de mise à l’échelle horizontale
- Langage de requête riche
Note
Notre approche hybride est optimisée pour notre cas d’utilisation spécifique. Étudiez nos modèles d’utilisation réels de la base de données dans la base de code pour comprendre si cette approche convient aux besoins de votre application Node.js.
Traitement des tâches en arrière-plan en production Node.js
Nous avons construit notre architecture de tâches en arrière-plan autour de Bree pour un déploiement fiable en production Node.js. Cela s’applique à toute application Node.js nécessitant un traitement en arrière-plan :
Notre configuration du serveur Bree pour la production
Notre implémentation principale : bree.js
Notre déploiement Ansible : ansible/playbooks/bree.yml
Exemples de tâches en production
Surveillance de la santé : jobs/check-pm2.js
Automatisation du nettoyage : jobs/cleanup-tmp.js
Toutes nos tâches : Parcourez notre répertoire complet de tâches
Ces modèles s’appliquent à toute application Node.js nécessitant :
- Tâches planifiées (traitement de données, rapports, nettoyage)
- Traitement en arrière-plan (redimensionnement d’images, envoi d’emails, importations de données)
- Surveillance de la santé et maintenance
- Utilisation de threads workers pour les tâches intensives en CPU
Nos modèles de planification de tâches pour la production Node.js
Étudiez nos modèles réels de planification de tâches dans notre répertoire de tâches pour comprendre :
- Comment nous implémentons une planification de type cron en production Node.js
- Notre gestion des erreurs et logique de réessai
- Comment nous utilisons les threads workers pour les tâches intensives en CPU
Maintenance automatisée pour les applications Node.js en production
Nous mettons en œuvre une maintenance proactive pour prévenir les problèmes courants en production Node.js. Ces modèles s’appliquent à toute application Node.js :
Notre implémentation de nettoyage
Source : jobs/cleanup-tmp.js
Notre maintenance automatisée pour les applications Node.js en production cible :
- Fichiers temporaires de plus de 24 heures
- Fichiers journaux au-delà des limites de rétention
- Fichiers cache et données temporaires
- Fichiers téléchargés qui ne sont plus nécessaires
- Instantanés de heap issus du débogage de performance
Ces modèles s’appliquent à toute application Node.js générant des fichiers temporaires, des journaux ou des données mises en cache.
Gestion de l’espace disque pour la production Node.js
Nos seuils de surveillance : helpers/monitor-server.js
- Limites de file d’attente pour le traitement en arrière-plan
- Seuil d’alerte à 75 % d’utilisation du disque
- Nettoyage automatique lorsque les seuils sont dépassés
Automatisation de la maintenance de l’infrastructure
Notre automatisation Ansible pour la production Node.js :
Guide d’implémentation du déploiement en production Node.js
Étudiez Notre Code Réel pour les Meilleures Pratiques en Production
Commencez par ces fichiers clés pour la configuration de l’environnement de production Node.js :
- Configuration :
config/index.js - Surveillance :
helpers/monitor-server.js - Gestion des erreurs :
helpers/is-code-bug.js - Journalisation :
helpers/logger.js - Santé du processus :
jobs/check-pm2.js
Apprenez de Nos Articles de Blog
Nos guides techniques d’implémentation pour la production Node.js :
- Écosystème des packages NPM
- Construction de systèmes de paiement
- Implémentation de la confidentialité des emails
- Formulaires de contact JavaScript
- Intégration d’emails avec React
Automatisation de l’Infrastructure pour la Production Node.js
Nos playbooks Ansible à étudier pour le déploiement en production Node.js :
Nos Études de Cas
Nos implémentations en entreprise :
- Étude de cas Linux Foundation
- Étude de cas Canonical Ubuntu
- Redirection d’emails pour anciens élèves
Conclusion : Meilleures Pratiques pour le Déploiement en Production Node.js
Notre infrastructure de production Node.js démontre que les applications Node.js peuvent atteindre une fiabilité de niveau entreprise grâce à :
- Choix matériels éprouvés (AMD Ryzen pour une optimisation de performance monocœur de 573 %)
- Surveillance de production Node.js éprouvée avec seuils spécifiques et réponses automatisées
- Classification intelligente des erreurs pour améliorer la réponse aux incidents en production
- Débogage avancé des performances avec v8-profiler-next et cpupro pour la prévention des OOM
- Renforcement complet de la sécurité via l’automatisation Ansible
- Architecture hybride de base de données optimisée pour les besoins applicatifs
- Maintenance automatisée pour prévenir les problèmes courants en production Node.js
Conclusion clé : Étudiez nos fichiers d’implémentation réels et nos articles de blog plutôt que de suivre des meilleures pratiques génériques. Notre base de code fournit des modèles concrets pour le déploiement en production Node.js qui peuvent être adaptés à toute application Node.js - applications web, API, microservices ou services en arrière-plan.
Liste Complète des Ressources pour la Production Node.js
Nos Fichiers d’Implémentation Principaux
- Configuration principale
- Dépendances des packages
- Surveillance du serveur
- Classification des erreurs
- Système de journalisation
- Contrôles de santé PM2
- Nettoyage automatisé
Nos Implémentations Serveur
Notre Automatisation d'Infrastructure
- Tous nos playbooks Ansible
- Renforcement de la sécurité
- Configuration Node.js
- Configuration de la base de données
Nos Articles Techniques de Blog
- Analyse de l'écosystème NPM
- Implémentation du système de paiement
- Guide technique sur la confidentialité des emails
- Formulaires de contact JavaScript
- Intégration d'email React
- Guide de solution auto-hébergée