Come ottimizzare l'infrastruttura di produzione Node.js: migliori pratiche
Prefazione
Da Forward Email, abbiamo trascorso anni a perfezionare la configurazione del nostro ambiente di produzione Node.js. Questa guida completa condivide le nostre migliori pratiche collaudate per il deployment in produzione di Node.js, concentrandosi sull'ottimizzazione delle prestazioni, il monitoraggio e le lezioni apprese scalando applicazioni Node.js per gestire milioni di transazioni giornaliere.
La nostra rivoluzione del 573% nell'ottimizzazione delle prestazioni su singolo core
Quando siamo passati dai processori Intel agli AMD Ryzen, abbiamo ottenuto un miglioramento delle prestazioni del 573% nelle nostre applicazioni Node.js. Non si è trattato solo di una piccola ottimizzazione, ma ha cambiato radicalmente il modo in cui le nostre applicazioni Node.js performano in produzione e dimostra l'importanza dell'ottimizzazione delle prestazioni su singolo core per qualsiasi applicazione Node.js.
Tip
Per le migliori pratiche di deployment in produzione di Node.js, la scelta dell'hardware è fondamentale. Abbiamo scelto specificamente l'hosting DataPacket per la disponibilità di AMD Ryzen perché le prestazioni su singolo core sono cruciali per le applicazioni Node.js dato che l'esecuzione di JavaScript è single-thread.
Perché l'ottimizzazione delle prestazioni su singolo core è importante per Node.js
La nostra migrazione da Intel ad AMD Ryzen ha portato a:
- Miglioramento delle prestazioni del 573% nell'elaborazione delle richieste (documentato in il nostro status page GitHub Issue #1519)
- Eliminazione dei ritardi di elaborazione fino a risposte quasi istantanee (menzionato in GitHub Issue #298)
- Miglior rapporto prezzo-prestazioni per ambienti di produzione Node.js
- Tempi di risposta migliorati su tutti i nostri endpoint applicativi
Il miglioramento delle prestazioni è stato così significativo che ora consideriamo i processori AMD Ryzen essenziali per qualsiasi deployment serio di Node.js in produzione, sia che si tratti di applicazioni web, API, microservizi o qualsiasi altro carico di lavoro Node.js.
Contenuti correlati
Per maggiori dettagli sulle nostre scelte infrastrutturali, consulta:
- Miglior servizio di inoltro email - Confronti di prestazioni
- Soluzione self-hosted - Raccomandazioni hardware
Configurazione dell'ambiente di produzione Node.js: il nostro stack tecnologico
Le nostre migliori pratiche per il deployment in produzione di Node.js includono scelte tecnologiche deliberate basate su anni di esperienza in produzione. Ecco cosa usiamo e perché queste scelte si applicano a qualsiasi applicazione Node.js:
Package Manager: pnpm per l'efficienza in produzione
Cosa usiamo: pnpm (versione fissata)
Abbiamo scelto pnpm rispetto a npm e yarn per la configurazione del nostro ambiente di produzione Node.js perché:
- Tempi di installazione più rapidi nelle pipeline CI/CD
- Efficienza dello spazio su disco tramite hard linking
- Risoluzione rigorosa delle dipendenze che previene dipendenze fantasma
- Prestazioni migliori nei deployment di produzione
Note
Come parte delle nostre migliori pratiche per il deployment in produzione di Node.js, fissiamo versioni esatte di strumenti critici come pnpm per garantire un comportamento coerente in tutti gli ambienti e sulle macchine dei membri del team.
Dettagli di implementazione:
Framework Web: Koa per una produzione Node.js moderna
Cosa usiamo:
@koa/router@koa/multer@ladjs/koa-simple-ratelimitAbbiamo scelto Koa invece di Express per la nostra infrastruttura di produzione Node.js grazie al suo moderno supporto async/await e a una composizione middleware più pulita. Il nostro fondatore Nick Baugh ha contribuito sia a Express che a Koa, offrendoci una profonda conoscenza di entrambi i framework per l'uso in produzione.
Questi modelli si applicano sia che tu stia costruendo API REST, server GraphQL, applicazioni web o microservizi.
I nostri esempi di implementazione:
- Configurazione del server web
- Configurazione del server API
- Guida all'implementazione dei moduli di contatto
Elaborazione di Job in Background: Bree per l'Affidabilità in Produzione
Cosa usiamo: scheduler bree
Abbiamo creato e manteniamo Bree perché gli scheduler di job esistenti non soddisfacevano le nostre esigenze di supporto ai worker thread e alle funzionalità moderne di JavaScript negli ambienti Node.js di produzione. Questo vale per qualsiasi applicazione Node.js che necessita di elaborazione in background, attività programmate o worker thread.
I nostri esempi di implementazione:
- Configurazione del server Bree
- Tutte le nostre definizioni di job
- Job di controllo salute PM2
- Implementazione del job di pulizia
Gestione degli Errori: @hapi/boom per l'Affidabilità in Produzione
Cosa usiamo: @hapi/boom
Usiamo @hapi/boom per risposte di errore strutturate in tutte le nostre applicazioni Node.js di produzione. Questo modello funziona per qualsiasi applicazione Node.js che necessita di una gestione coerente degli errori.
I nostri esempi di implementazione:
Come Monitorare le Applicazioni Node.js in Produzione
Il nostro approccio al monitoraggio delle applicazioni Node.js in produzione si è evoluto attraverso anni di gestione di applicazioni su larga scala. Implementiamo il monitoraggio a più livelli per garantire affidabilità e prestazioni per qualsiasi tipo di applicazione Node.js.
Monitoraggio di Produzione a Livello di Sistema per Node.js
La nostra implementazione principale: helpers/monitor-server.js
Cosa usiamo: node-os-utils
Le nostre soglie di monitoraggio in produzione (dal nostro codice di produzione reale):
- Limite di heap size di 2GB con avvisi automatici
- Soglia di avviso al 25% di utilizzo della memoria
- Soglia di allarme all'80% di utilizzo CPU
- Soglia di avviso al 75% di utilizzo del disco
Warning
Queste soglie funzionano per la nostra specifica configurazione hardware. Quando implementi il monitoraggio di produzione Node.js, rivedi l'implementazione di monitor-server.js per comprendere la logica esatta e adattare i valori alla tua configurazione.
Monitoraggio a Livello di Applicazione per Node.js in Produzione
La nostra classificazione degli errori: helpers/is-code-bug.js
Questo helper distingue tra:
- Bug reali nel codice che richiedono attenzione immediata
- Errori dell'utente che sono comportamenti previsti
- Fallimenti di servizi esterni che non possiamo controllare
Questo modello si applica a qualsiasi applicazione Node.js - app web, API, microservizi o servizi in background.
La nostra implementazione del logging: helpers/logger.js
Implementiamo una completa redazione dei campi per proteggere le informazioni sensibili mantenendo al contempo utili capacità di debug nel nostro ambiente di produzione Node.js.
Monitoraggio Specifico per Applicazione
Le nostre implementazioni server:
Monitoraggio della coda: Implementiamo limiti di coda da 5GB e timeout di 180 secondi per l'elaborazione delle richieste per prevenire l'esaurimento delle risorse. Questi schemi si applicano a qualsiasi applicazione Node.js con code o elaborazione in background.
Monitoraggio di Produzione Node.js con PM2 Health Checks
Abbiamo perfezionato la configurazione del nostro ambiente di produzione Node.js con PM2 grazie a anni di esperienza in produzione. I nostri health check PM2 sono essenziali per mantenere l'affidabilità in qualsiasi applicazione Node.js.
Il nostro Sistema di Health Check PM2
La nostra implementazione principale: jobs/check-pm2.js
Il nostro monitoraggio di produzione Node.js con health check PM2 include:
- Esecuzione ogni 20 minuti tramite pianificazione cron
- Richiede un uptime minimo di 15 minuti prima di considerare un processo sano
- Valida lo stato del processo e l'uso della memoria
- Riavvia automaticamente i processi falliti
- Previene loop di riavvio tramite controlli di salute intelligenti
Caution
Per le best practice di deployment in produzione Node.js, richiediamo un uptime superiore a 15 minuti prima di considerare un processo sano per evitare loop di riavvio. Questo previene guasti a cascata quando i processi hanno problemi di memoria o altri problemi.
La nostra Configurazione di Produzione PM2
La nostra configurazione dell'ecosistema: Studia i nostri file di avvio server per la configurazione dell'ambiente di produzione Node.js:
Questi schemi si applicano sia che tu stia eseguendo app Express, server Koa, API GraphQL o qualsiasi altra applicazione Node.js.
Deployment PM2 Automatizzato
Deployment PM2: ansible/playbooks/node.yml
Automatizziamo l'intera configurazione PM2 tramite Ansible per garantire deployment di produzione Node.js coerenti su tutti i nostri server.
Sistema di Gestione e Classificazione degli Errori in Produzione
Una delle nostre best practice più preziose per il deployment di produzione Node.js è la classificazione intelligente degli errori che si applica a qualsiasi applicazione Node.js:
La nostra Implementazione isCodeBug per la Produzione
Sorgente: helpers/is-code-bug.js
Questo helper fornisce una classificazione intelligente degli errori per applicazioni Node.js in produzione per:
- Dare priorità ai bug reali rispetto agli errori degli utenti
- Migliorare la nostra risposta agli incidenti concentrandoci sui problemi reali
- Ridurre l'affaticamento da alert causato da errori utente previsti
- Comprendere meglio i problemi generati dall'applicazione rispetto a quelli generati dall'utente
Questo schema funziona per qualsiasi applicazione Node.js - che tu stia costruendo siti e-commerce, piattaforme SaaS, API o microservizi.
Integrazione con il Nostro Logging di Produzione
La nostra integrazione del logger: helpers/logger.js
Il nostro logger utilizza isCodeBug per determinare i livelli di allerta e la redazione dei campi, assicurandoci di essere notificati riguardo a problemi reali mentre filtriamo il rumore nel nostro ambiente di produzione Node.js.
Contenuti correlati
Scopri di più sui nostri modelli di gestione degli errori:
- Costruire un sistema di pagamento affidabile - Modelli di gestione degli errori
- Protezione della privacy delle email - Gestione degli errori di sicurezza
Debugging avanzato delle prestazioni con v8-profiler-next e cpupro
Utilizziamo strumenti di profilazione avanzati per analizzare gli snapshot dell'heap e debug di problemi OOM (Out of Memory), colli di bottiglia delle prestazioni e problemi di memoria in Node.js nel nostro ambiente di produzione. Questi strumenti sono essenziali per qualsiasi applicazione Node.js che sperimenti perdite di memoria o problemi di prestazioni.
Il nostro approccio di profilazione per la produzione Node.js
Strumenti che consigliamo:
v8-profiler-next- Per generare snapshot dell'heap e profili CPUcpupro- Per analizzare profili CPU e snapshot dell'heap
Tip
Utilizziamo v8-profiler-next e cpupro insieme per creare un flusso di lavoro completo di debugging delle prestazioni per le nostre applicazioni Node.js. Questa combinazione ci aiuta a identificare perdite di memoria, colli di bottiglia delle prestazioni e ottimizzare il nostro codice di produzione.
Come implementiamo l'analisi degli snapshot dell'heap
La nostra implementazione di monitoraggio: helpers/monitor-server.js
Il nostro monitoraggio di produzione include la generazione automatica di snapshot dell'heap quando vengono superate le soglie di memoria. Questo ci aiuta a debug di problemi OOM prima che causino crash dell'applicazione.
Modelli chiave di implementazione:
- Snapshot automatici quando la dimensione dell'heap supera la soglia di 2GB
- Profilazione basata su segnali per analisi on-demand in produzione
- Politiche di conservazione per la gestione dello storage degli snapshot
- Integrazione con i nostri job di pulizia per manutenzione automatizzata
Flusso di lavoro per il debugging delle prestazioni
Studia la nostra implementazione reale:
- Implementazione del server di monitoraggio - Monitoraggio dell'heap e generazione degli snapshot
- Job di pulizia - Conservazione e pulizia degli snapshot
- Integrazione del logger - Logging delle prestazioni
Implementazione consigliata per la tua applicazione Node.js
Per l'analisi degli snapshot dell'heap:
- Installa v8-profiler-next per la generazione degli snapshot
- Usa cpupro per analizzare gli snapshot generati
- Implementa soglie di monitoraggio simili a quelle di monitor-server.js
- Configura la pulizia automatizzata per gestire lo storage degli snapshot
- Crea gestori di segnali per la profilazione on-demand in produzione
Per la profilazione CPU:
- Genera profili CPU durante i periodi di carico elevato
- Analizza con cpupro per identificare colli di bottiglia
- Concentrati sui percorsi caldi e sulle opportunità di ottimizzazione
- Monitora le prestazioni prima/dopo i miglioramenti
Warning
Generare snapshot dell'heap e profili CPU può influire sulle prestazioni. Raccomandiamo di implementare limitazioni e di abilitare la profilazione solo quando si indagano problemi specifici o durante le finestre di manutenzione.
Integrazione con il nostro monitoraggio di produzione
I nostri strumenti di profilazione si integrano con la nostra strategia di monitoraggio più ampia:
- Attivazione automatica basata su soglie di memoria/CPU
- Integrazione degli alert quando vengono rilevati problemi di prestazioni
- Analisi storica per tracciare le tendenze delle prestazioni nel tempo
- Correlazione con metriche applicative per un debugging completo Questo approccio ci ha aiutato a identificare e risolvere perdite di memoria, ottimizzare i percorsi di codice critici e mantenere prestazioni stabili nel nostro ambiente di produzione Node.js.
Sicurezza dell'Infrastruttura di Produzione Node.js
Implementiamo una sicurezza completa per la nostra infrastruttura di produzione Node.js tramite automazione Ansible. Queste pratiche si applicano a qualsiasi applicazione Node.js:
Sicurezza a Livello di Sistema per la Produzione Node.js
La nostra implementazione Ansible: ansible/playbooks/security.yml
Le nostre principali misure di sicurezza per ambienti di produzione Node.js:
- Swap disabilitato per evitare che dati sensibili vengano scritti su disco
- Core dump disabilitati per prevenire dump di memoria contenenti informazioni sensibili
- Archiviazione USB bloccata per impedire accessi non autorizzati ai dati
- Ottimizzazione dei parametri del kernel sia per la sicurezza che per le prestazioni
Warning
Quando si implementano le best practice per il deployment di produzione Node.js, disabilitare lo swap può causare terminazioni per esaurimento memoria se la tua applicazione supera la RAM disponibile. Monitoriamo attentamente l'uso della memoria e dimensioniamo i nostri server di conseguenza.
Sicurezza dell'Applicazione per Applicazioni Node.js
La nostra redazione dei campi di log: helpers/logger.js
Redigiamo i campi sensibili dai log inclusi password, token, chiavi API e informazioni personali. Questo protegge la privacy degli utenti mantenendo le capacità di debug in qualsiasi ambiente di produzione Node.js.
Automazione della Sicurezza dell'Infrastruttura
La nostra configurazione completa Ansible per la produzione Node.js:
Il Nostro Contenuto sulla Sicurezza
Scopri di più sul nostro approccio alla sicurezza:
- Migliori Aziende per Audit di Sicurezza
- Email Crittografata Quantum Safe
- Perché la Sicurezza Email Open Source
Architettura del Database per Applicazioni Node.js
Utilizziamo un approccio ibrido al database ottimizzato per le nostre applicazioni Node.js. Questi modelli possono essere adattati a qualsiasi applicazione Node.js:
Implementazione SQLite per la Produzione Node.js
Cosa usiamo:
La nostra configurazione: ansible/playbooks/sqlite.yml
Usiamo SQLite per i dati specifici degli utenti nelle nostre applicazioni Node.js perché offre:
- Isolamento dei dati per utente/tenant
- Prestazioni migliori per query a singolo utente
- Backup e migrazione semplificati
- Minore complessità rispetto ai database condivisi
Questo modello funziona bene per applicazioni SaaS, sistemi multi-tenant o qualsiasi applicazione Node.js che necessita isolamento dei dati.
Implementazione MongoDB per la Produzione Node.js
Cosa usiamo:
@ladjs/mongoose@ladjs/mongoose-error-messages@zainundin/mongoose-factoryLa nostra implementazione di setup:helpers/setup-mongoose.js
La nostra configurazione: config/mongoose.js
Utilizziamo MongoDB per i dati dell'applicazione nel nostro ambiente di produzione Node.js perché offre:
- Schema flessibile per strutture dati in evoluzione
- Migliori prestazioni per query complesse
- Capacità di scalabilità orizzontale
- Linguaggio di query ricco
Note
Il nostro approccio ibrido è ottimizzato per il nostro caso d'uso specifico. Studia i modelli di utilizzo effettivi del database nel codice per capire se questo approccio si adatta alle esigenze della tua applicazione Node.js.
Elaborazione di Job in Background in Produzione Node.js
Abbiamo costruito la nostra architettura di job in background attorno a Bree per un deployment affidabile in produzione Node.js. Questo vale per qualsiasi applicazione Node.js che necessita di elaborazione in background:
La nostra configurazione del server Bree per la produzione
La nostra implementazione principale: bree.js
Il nostro deployment Ansible: ansible/playbooks/bree.yml
Esempi di job in produzione
Monitoraggio della salute: jobs/check-pm2.js
Automazione della pulizia: jobs/cleanup-tmp.js
Tutti i nostri job: Esplora la nostra directory completa di job
Questi modelli si applicano a qualsiasi applicazione Node.js che necessita di:
- Attività programmate (elaborazione dati, report, pulizia)
- Elaborazione in background (ridimensionamento immagini, invio email, importazione dati)
- Monitoraggio della salute e manutenzione
- Utilizzo di thread worker per attività intensive in CPU
I nostri modelli di scheduling dei job per la produzione Node.js
Studia i nostri modelli effettivi di scheduling dei job nella nostra directory jobs per capire:
- Come implementiamo uno scheduling simile a cron in produzione Node.js
- La nostra gestione degli errori e la logica di retry
- Come utilizziamo i thread worker per attività intensive in CPU
Manutenzione automatizzata per applicazioni Node.js in produzione
Implementiamo una manutenzione proattiva per prevenire problemi comuni in produzione Node.js. Questi modelli si applicano a qualsiasi applicazione Node.js:
La nostra implementazione di pulizia
Sorgente: jobs/cleanup-tmp.js
La nostra manutenzione automatizzata per applicazioni Node.js in produzione si concentra su:
- File temporanei più vecchi di 24 ore
- File di log oltre i limiti di conservazione
- File di cache e dati temporanei
- File caricati non più necessari
- Heap snapshot da debugging delle prestazioni
Questi modelli si applicano a qualsiasi applicazione Node.js che genera file temporanei, log o dati in cache.
Gestione dello spazio su disco per la produzione Node.js
Le nostre soglie di monitoraggio: helpers/monitor-server.js
- Limiti di coda per l'elaborazione in background
- Soglia di avviso al 75% di utilizzo disco
- Pulizia automatica quando le soglie sono superate
Automazione della manutenzione dell'infrastruttura
La nostra automazione Ansible per la produzione Node.js:
Guida all'implementazione del deployment in produzione Node.js
Studia il Nostro Codice Reale per le Best Practice in Produzione
Inizia con questi file chiave per la configurazione dell'ambiente di produzione Node.js:
- Configurazione:
config/index.js - Monitoraggio:
helpers/monitor-server.js - Gestione degli errori:
helpers/is-code-bug.js - Logging:
helpers/logger.js - Salute del processo:
jobs/check-pm2.js
Impara dai Nostri Post del Blog
Le nostre guide tecniche per l'implementazione in produzione Node.js:
- Ecosistema dei pacchetti NPM
- Costruire sistemi di pagamento
- Implementazione della privacy email
- Moduli di contatto JavaScript
- Integrazione email con React
Automazione dell'Infrastruttura per la Produzione Node.js
I nostri playbook Ansible da studiare per il deployment in produzione Node.js:
I Nostri Case Study
Le nostre implementazioni enterprise:
Conclusione: Best Practice per il Deployment in Produzione Node.js
La nostra infrastruttura di produzione Node.js dimostra che le applicazioni Node.js possono raggiungere affidabilità di livello enterprise attraverso:
- Scelte hardware comprovate (AMD Ryzen per un’ottimizzazione delle prestazioni single core del 573%)
- Monitoraggio di produzione Node.js collaudato con soglie specifiche e risposte automatizzate
- Classificazione intelligente degli errori per migliorare la risposta agli incidenti in ambienti di produzione
- Debugging avanzato delle prestazioni con v8-profiler-next e cpupro per la prevenzione di OOM
- Rafforzamento completo della sicurezza tramite automazione Ansible
- Architettura ibrida del database ottimizzata per le esigenze dell’applicazione
- Manutenzione automatizzata per prevenire problemi comuni in produzione Node.js
Punto chiave: Studia i nostri file di implementazione reali e i post del blog invece di seguire best practice generiche. Il nostro codice fornisce modelli reali per il deployment in produzione Node.js che possono essere adattati a qualsiasi applicazione Node.js - web app, API, microservizi o servizi in background.
Elenco Completo delle Risorse per la Produzione Node.js
I Nostri File di Implementazione Principali
- Configurazione principale
- Dipendenze dei pacchetti
- Monitoraggio server
- Classificazione degli errori
- Sistema di logging
- Controlli di salute PM2
- Pulizia automatizzata
Le nostre implementazioni server
La nostra automazione infrastrutturale
- Tutti i nostri playbook Ansible
- Rafforzamento della sicurezza
- Configurazione Node.js
- Configurazione database
I nostri post tecnici sul blog
- Analisi dell’ecosistema NPM
- Implementazione del sistema di pagamento
- Guida tecnica alla privacy delle email
- Moduli di contatto JavaScript
- Integrazione email con React
- Guida alla soluzione self-hosted