Cette traduction fournie par StrongLoop / IBM.

Il se peut que ce document soit obsolÚte par rapport à la documentation en anglais. Pour connaßtre les mises à jour les plus récentes, reportez-vous à la documentation en anglais.

✖

Meilleures pratiques en production : performances et fiabilité

Présentation

Cet article traite des meilleures pratiques en termes de performances et de fiabilité pour les applications Express déployées en production.

La prĂ©sente rubrique s’inscrit clairement dans le concept “devops”, qui couvre Ă  la fois le dĂ©veloppement traditionnel et l’exploitation. Ainsi, les informations se divisent en deux parties :

A faire dans votre code

Les actions suivantes peuvent ĂȘtre rĂ©alisĂ©es dans votre code afin d’amĂ©liorer les performances de votre application :

Utiliser la compression gzip

La compression Gzip peut considĂ©rablement rĂ©duire la taille du corps de rĂ©ponse et ainsi augmenter la vitesse d’une application Web. Utilisez le middleware compression pour la compression gzip dans votre application Express. Par exemple :

const compression = require('compression')
const express = require('express')
const app = express()
app.use(compression())

Pour un site Web en production dont le trafic est Ă©levĂ©, la meilleure mĂ©thode pour mettre en place la compression consiste Ă  l’implĂ©menter au niveau d’un proxy inverse (voir Utiliser un proxy inverse). Dans ce cas, vous n’avez pas besoin d’utiliser le middleware compression. Pour plus de dĂ©tails sur l’activation de la compression gzip dans Nginx, voir Module ngx_http_gzip_module dans la documentation Nginx.

Ne pas utiliser les fonctions synchrones

Les fonctions et les mĂ©thodes synchrones ralentissent le processus d’exĂ©cution jusqu’à leur retour. Un simple appel Ă  une fonction synchrone peut revenir en quelques microsecondes ou millisecondes ; pour les sites Web dont le trafic est Ă©levĂ©, ces appels s’additionnent et rĂ©duisent les performances de l’application. Evitez de les utiliser en production.

Bien que Node et plusieurs modules mettent Ă  disposition les versions synchrone et asynchrone de leurs fonctions, utilisez toujours la version asynchrone en production. L’utilisation d’une fonction synchrone n’est justifiĂ©e que lors du dĂ©marrage initial.

Si vous utilisez Node.js 4.0+ ou io.js 2.1.0+, vous pouvez utiliser l’option de ligne de commande --trace-sync-io pour imprimer un avertissement et une trace de pile chaque fois que votre application utilise une API synchrone. Bien entendu vous n’utiliserez pas rĂ©ellement cette option en production, mais plutĂŽt pour vĂ©rifier que votre code est prĂȘt pour la phase production. Pour plus d’informations, voir Weekly update for io.js 2.1.0.

Utiliser le middleware pour exploiter les fichiers statiques

En dĂ©veloppement, vous pouvez utiliser res.sendFile() pour exploiter les fichiers statiques. Ne l’utilisez toutefois pas en production, car cette fonction doit lire le systĂšme de fichiers pour chaque demande de fichier ; elle se heurterait Ă  des temps d’attente importants qui affecteraient les performances globales de l’application. Notez que res.sendFile() n’est pas implĂ©mentĂ©e avec l’appel systĂšme sendfile, qui la rendrait beaucoup plus efficace.

Utilisez plutĂŽt le middleware serve-static (ou tout middleware Ă©quivalent), qui est optimisĂ© pour l’utilisation des fichiers dans les applications Express.

Encore mieux, utilisez un proxy inverse pour exploiter les fichiers statiques ; pour plus d’informations, voir Utiliser un proxy inverse.

Procéder à une journalisation correcte

En rĂšgle gĂ©nĂ©rale, vous utilisez la journalisation Ă  partir de votre application Ă  deux fins : le dĂ©bogage et la journalisation de l’activitĂ© de votre application (principalement tout le reste). L’utilisation de console.log() ou de console.err() pour imprimer des messages de journal sur le terminal est une pratique courante en dĂ©veloppement. Cependant, ces fonctions sont synchrones lorsque la destination est un terminal ou un fichier ; elles ne conviennent donc pas en production, Ă  moins que vous ne dirigiez la sortie vers un autre programme.

Pour le débogage

Si vous utilisez la journalisation Ă  des fins de dĂ©bogage, utilisez un module de dĂ©bogage spĂ©cial tel que debug plutĂŽt que d’utiliser console.log(). Ce module vous permet d’utiliser la variable d’environnement DEBUG pour contrĂŽler les messages de dĂ©bogage envoyĂ©s Ă  console.err(), le cas Ă©chĂ©ant. Pour que votre application reste exclusivement asynchrone, vous devrez toujours diriger console.err() vers un autre programme. Mais bon, vous n’allez pas vraiment procĂ©der Ă  un dĂ©bogage en production, n’est-ce pas ?

Pour journaliser l’activitĂ© de votre application

Si vous journalisez l’activitĂ© de votre application (par exemple, pour suivre le trafic ou les appels API), utilisez une bibliothĂšque de journalisation telle que Winston ou Bunyan plutĂŽt que d’utiliser console.log(). Pour obtenir une comparaison dĂ©taillĂ©e de ces deux bibliothĂšques, consultez l’article StrongLoop intitulĂ© Comparing Winston and Bunyan Node.js Logging.

Traiter correctement les exceptions

Les applications Node plantent lorsqu’elles tombent sur une exception non interceptĂ©e. Si vous ne traitez pas les exceptions et ne prenez pas les dĂ©cisions appropriĂ©es, votre application Express plantera et sera dĂ©connectĂ©e. Si vous suivez les conseils de la rubrique ci-dessous intitulĂ©e VĂ©rifier que votre application redĂ©marre automatiquement, votre application pourra ĂȘtre restaurĂ©e suite Ă  un plantage. Le dĂ©lai de dĂ©marrage des applications Express est heureusement court en rĂšgle gĂ©nĂ©rale. Vous souhaitez toutefois Ă©viter tout plantage en prioritĂ© et pour ce faire, vous devez traiter les exceptions correctement.

Pour vérifier que vous traitez toutes les exceptions, procédez comme suit :

Avant de s’immerger dans les rubriques qui suivent, il est conseillĂ© de possĂ©der des connaissances de base concernant le traitement des erreurs Node/Express, Ă  savoir l’utilisation des rappels “error-first” et la propagation des erreurs dans le middleware. Node utilise la convention de “rappel error-first” pour renvoyer les erreurs issues des fonctions asynchrones, dans laquelle le premier paramĂštre de la fonction callback est l’objet error, suivi par les donnĂ©es de rĂ©sultat dans les paramĂštres suivants. Pour n’indiquer aucune erreur, indiquez null comme premier paramĂštre. La fonction de rappel doit suivre la convention de rappel “error-first” de sorte Ă  traiter l’erreur de maniĂšre significative. Dans Express, la meilleure pratique consiste Ă  utiliser la fonction next() pour propager les erreurs via la chaĂźne du middleware.

Pour plus d’informations sur les bases du traitement des erreurs, voir :

A ne pas faire

Vous ne devriez pas Ă©couter l’évĂ©nement uncaughtException, Ă©mis lorsqu’une exception remonte vers la boucle d’évĂ©nements. L’ajout d’un programme d’écoute d’évĂ©nement pour uncaughtException va modifier le comportement par dĂ©faut du processus qui rencontre une exception ; le processus va continuer Ă  s’exĂ©cuter malgrĂ© l’exception. Cela pourrait ĂȘtre un bon moyen d’empĂȘcher votre application de planter, mais continuer Ă  exĂ©cuter l’application aprĂšs une exception non interceptĂ©e est une pratique dangereuse qui n’est pas recommandĂ©e, Ă©tant donnĂ© que l’état du processus devient peu fiable et imprĂ©visible.

De plus, l’utilisation d’uncaughtException est officiellement reconnue comme Ă©tant rudimentaire et il a Ă©tĂ© proposĂ© de le supprimer. Ecouter uncaughtException n’est qu’une mauvaise idĂ©e. VoilĂ  pourquoi nous recommandons d’utiliser plusieurs processus et superviseurs Ă  la place : faire planter son application et la redĂ©marrer est souvent plus sĂ»r que de la restaurer aprĂšs une erreur.

L’utilisation de domain n’est Ă©galement pas recommandĂ©e. Ce module obsolĂšte ne rĂ©sout globalement pas le problĂšme.

Utiliser try-catch

Try-catch est un Ă©lĂ©ment de langage JavaScript que vous pouvez utiliser pour intercepter les exceptions dans le code synchrone. Utilisez try-catch pour traiter les erreurs d’analyse JSON, comme indiquĂ© ci-dessous, par exemple.

Utilisez un outil tel que JSHint ou JSLint pour vous aider à identifier les exceptions implicites comme les erreurs de référence dans les variables non définies.

Voici un exemple d’utilisation de try-catch pour traiter une exception potentielle de plantage de processus. Cette fonction middleware accepte un paramĂštre de zone de requĂȘte nommĂ© “params” qui est un objet JSON.

app.get('/search', (req, res) => {
  // Simulating async operation
  setImmediate(() => {
    const jsonStr = req.query.params
    try {
      const jsonObj = JSON.parse(jsonStr)
      res.send('Success')
    } catch (e) {
      res.status(400).send('Invalid JSON string')
    }
  })
})

Toutefois, try-catch ne fonctionne que dans le code synchrone. Etant donnĂ© que la plateforme Node est principalement asynchrone (en particulier dans un environnement de production), try-catch n’interceptera pas beaucoup d’exceptions.

Utiliser des promesses

Les promesses vont traiter n’importe quelle exception (explicite et implicite) dans les blocs de code asynchrone qui utilisent then(). Contentez-vous d’ajouter .catch(next) à la fin des chaünes de promesse. Par exemple :

app.get('/', (req, res, next) => {
  // do some sync stuff
  queryDb()
    .then((data) => makeCsv(data)) // handle data
    .then((csv) => { /* handle csv */ })
    .catch(next)
})

app.use((err, req, res, next) => {
  // handle error
})

Toutes les erreurs asynchrones et synchrones sont à présent propagées vers le middleware de traitement des erreurs.

Observez toutefois les deux avertissements suivants :

  1. L’intĂ©gralitĂ© de votre code asynchrone doit renvoyer des promesses (Ă  l’exception des Ă©metteurs). Si une bibliothĂšque spĂ©cifique ne renvoie pas de promesses, convertissez l’objet de base Ă  l’aide d’une fonction d’aide telle que Bluebird.promisifyAll().
  2. Les Ă©metteurs d’évĂ©nements (comme les flux) peuvent toujours gĂ©nĂ©rer des exceptions non interceptĂ©es. Veillez donc Ă  traiter l’évĂ©nement d’erreur de maniĂšre appropriĂ©e ; par exemple :
const wrap = fn => (...args) => fn(...args).catch(args[2])

app.get('/', wrap(async (req, res, next) => {
  const company = await getCompanyById(req.query.id)
  const stream = getLogoStreamById(company.id)
  stream.on('error', next).pipe(res)
}))

Pour plus d’informations sur le traitement des erreurs à l’aide de promesses, voir :

A faire dans votre environnement/configuration

Les actions suivantes peuvent ĂȘtre rĂ©alisĂ©es dans votre environnement systĂšme afin d’amĂ©liorer les performances de votre application :

DĂ©finir NODE_ENV sur “production”

La variable d’environnement NODE_ENV spĂ©cifie l’environnement dans lequel une application s’exĂ©cute (en rĂšgle gĂ©nĂ©rale, dĂ©veloppement ou production). Le moyen le plus simple d’amĂ©liorer vos performances consiste Ă  dĂ©finir NODE_ENV sur “production.”

En dĂ©finissant NODE_ENV sur “production”, Express :

Les tests indiquent que ce simple paramĂ©trage peut multiplier les performances d’application par trois !

Si vous avez besoin d’écrire du code spĂ©cifique Ă  un environnement, vous pouvez vĂ©rifier la valeur de NODE_ENV avec process.env.NODE_ENV. Sachez que la vĂ©rification de la valeur de n’importe quelle variable d’environnement pĂ©nalise les performances et devrait donc ĂȘtre effectuĂ©e avec modĂ©ration.

En dĂ©veloppement, vous dĂ©finissez gĂ©nĂ©ralement les variables d’environnement dans votre shell interactif, Ă  l’aide de export ou de votre fichier .bash_profile par exemple. Il n’est toutefois pas conseillĂ© de le faire sur un serveur de production ; utilisez plutĂŽt le systĂšme init de votre systĂšme d’exploitation (systemd ou Upstart). La section qui suit fournit des dĂ©tails sur l’utilisation de votre systĂšme init en gĂ©nĂ©ral, mais la dĂ©finition de NODE_ENV est tellement importante pour les performances (et facile Ă  rĂ©aliser), qu’elle est mise en Ă©vidence ici.

Avec Upstart, utilisez le mot clé env dans votre fichier de travail. Par exemple :

# /etc/init/env.conf
 env NODE_ENV=production

Pour plus d’informations, voir Upstart Intro, Cookbook and Best Practices.

Avec systemd, utilisez la directive Environment dans votre fichier d’unitĂ©. Par exemple :

# /etc/systemd/system/myservice.service
Environment=NODE_ENV=production

Pour plus d’informations, voir Using Environment Variables In systemd Units.

Si vous utilisez StrongLoop Process Manager, vous pouvez Ă©galement dĂ©finir la variable d’environnement lorsque vous installez StrongLoop PM en tant que service.

Vérifier que votre application redémarre automatiquement

En production, vous ne souhaitez jamais que votre application soit dĂ©connectĂ©e. Vous devez donc veiller Ă  ce qu’elle redĂ©marre si elle plante et si le serveur plante. MĂȘme si vous espĂ©rez que cela n’arrive pas, vous devez en rĂ©alitĂ© considĂ©rer ces deux Ă©ventualitĂ©s en :

Les applications Node plantent si elles tombent sur une exception non interceptĂ©e. Avant toute chose, vĂ©rifiez que votre application est correctement testĂ©e et qu’elle traite toutes les exceptions (voir Traiter correctement les exceptions pour plus de dĂ©tails). En cas d’échec, mettez en place un mĂ©canisme qui garantit que si et lorsque votre application plante, elle redĂ©marre automatiquement.

Utiliser un gestionnaire de processus

En dĂ©veloppement, vous avez simplement dĂ©marrĂ© votre application Ă  partir de la ligne de commande avec node server.js ou une instruction similaire. En production, cela vous mĂšnera droit au dĂ©sastre. Si l’application plante, elle sera dĂ©connectĂ©e tant que vous ne la redĂ©marrerez pas. Pour garantir que votre application redĂ©marre si elle plante, utilisez un gestionnaire de processus. Un gestionnaire de processus est un “conteneur” d’applications qui facilite le dĂ©ploiement, offre une haute disponibilitĂ© et vous permet de gĂ©rer l’application lors de son exĂ©cution.

En plus de redĂ©marrer votre application lorsqu’elle plante, un gestionnaire de processus peut vous permettre :

Les gestionnaires de processus les plus populaires pour Node sont les suivants :

Pour obtenir une comparaison détaillée de ces trois gestionnaires de processus, voir http://strong-pm.io/compare/.

L’utilisation de l’un de ces trois gestionnaires de processus suffira Ă  garder votre application active, mĂȘme si elle plantera de temps en temps.

StrongLoop PM possĂšde un grand nombre de fonctionnalitĂ©s qui ciblent en particulier le dĂ©ploiement en production. Vous pouvez l’utiliser avec les outils StrongLoop associĂ©s pour :

Comme dĂ©crit ci-dessous, lorsque vous installez StrongLoop PM en tant que service de systĂšme d’exploitation Ă  l’aide de votre systĂšme init, il redĂ©marre automatiquement au redĂ©marrage du systĂšme. Ainsi, vos processus applicatifs et vos clusters resteront toujours actifs.

Utiliser un systĂšme init

Le niveau de fiabilitĂ© suivant consiste Ă  garantir que votre application redĂ©marre lorsque le serveur redĂ©marre. Les systĂšmes peuvent toujours tomber en panne pour divers motifs. Pour garantir que votre application redĂ©marre si le serveur plante, utilisez le systĂšme init intĂ©grĂ© Ă  votre systĂšme d’exploitation. Les deux principaux systĂšmes init actuellement utilisĂ©s sont systemd et Upstart.

Vous pouvez utiliser les systĂšmes init de deux maniĂšres dans votre application Express :

Systemd

Systemd est un systÚme Linux et un gestionnaire de services. La plupart des distributions Linux principales ont adopté systemd comme leur systÚme init par défaut.

Un fichier de configuration de service systemd est appelĂ© fichier d’unitĂ© et porte l’extension .service. Voici un exemple de fichier d’unitĂ© permettant de gĂ©rer une application Node directement (remplacez le texte en gras par les valeurs appropriĂ©es Ă  votre systĂšme et votre application) :

[Unit]
Description=Awesome Express App

[Service]
Type=simple
ExecStart=/usr/local/bin/node /projects/myapp/index.js
WorkingDirectory=/projects/myapp

User=nobody
Group=nogroup

# Environment variables:
Environment=NODE_ENV=production

# Allow many incoming connections
LimitNOFILE=infinity

# Allow core dumps for debugging
LimitCORE=infinity

StandardInput=null
StandardOutput=syslog
StandardError=syslog
Restart=always

[Install]
WantedBy=multi-user.target

Pour plus d’informations sur systemd, voir la page d’aide de systemd.

StrongLoop PM en tant que service systemd

Vous pouvez facilement installer StrongLoop Process Manager en tant que service systemd. Une fois que c’est fait, lorsque le serveur redĂ©marre, il redĂ©marre automatiquement StrongLoop PM, qui redĂ©marre ensuite toutes les applications qu’il gĂšre.

Pour installer StrongLoop PM en tant que service systemd :

$ sudo sl-pm-install --systemd

DĂ©marrez ensuite le service comme suit :

$ sudo /usr/bin/systemctl start strong-pm

Pour plus d’informations, voir Setting up a production host dans la documentation StrongLoop.

Upstart

Upstart est un outil systĂšme disponible sur un grand nombre de distributions Linux et qui permet de dĂ©marrer des tĂąches et des services pendant le dĂ©marrage du systĂšme, de les arrĂȘter pendant l’arrĂȘt du systĂšme et de les superviser. Vous pouvez configurer votre application Express ou votre gestionnaire de processus en tant que service, puis Upstart le redĂ©marrera automatiquement lorsqu’il plantera.

Un service Upstart est dĂ©fini dans un fichier de configuration de travail (Ă©galement appelĂ© “travail”) portant l’extension .conf. L’exemple qui suit dĂ©crit comment crĂ©er un travail appelĂ© “myapp” pour une application nommĂ©e “myapp” avec le fichier principal situĂ© dans /projects/myapp/index.js.

Créez un fichier nommé myapp.conf dans /etc/init/ avec le contenu suivant (remplacez le texte en gras par les valeurs appropriées à votre systÚme et votre application) :

# When to start the process
start on runlevel [2345]

# When to stop the process
stop on runlevel [016]

# Increase file descriptor limit to be able to handle more requests
limit nofile 50000 50000

# Use production mode
env NODE_ENV=production

# Run as www-data
setuid www-data
setgid www-data

# Run from inside the app dir
chdir /projects/myapp

# The process to start
exec /usr/local/bin/node /projects/myapp/index.js

# Restart the process if it is down
respawn

# Limit restart attempt to 10 times within 10 seconds
respawn limit 10 10

REMARQUE : ce script nécessite Upstart 1.4 ou ultérieur, pris en charge sur Ubuntu 12.04-14.10.

Etant donnĂ© que le travail est configurĂ© pour s’exĂ©cuter au dĂ©marrage du systĂšme, votre application sera dĂ©marrĂ©e avec le systĂšme d’exploitation et sera redĂ©marrĂ©e automatiquement si l’application plante ou si le systĂšme tombe en panne.

En plus de redĂ©marrer automatiquement l’application, Upstart vous permet d’utiliser les commandes suivantes :

Pour plus d’informations sur Upstart, voir Upstart Intro, Cookbook and Best Practises.

StrongLoop PM en tant que service Upstart

Vous pouvez facilement installer StrongLoop Process Manager en tant que service Upstart. Une fois que c’est fait, lorsque le serveur redĂ©marre, il redĂ©marre automatiquement StrongLoop PM, qui redĂ©marre ensuite toutes les applications qu’il gĂšre.

Pour installer StrongLoop PM en tant que service Upstart 1.4 :

$ sudo sl-pm-install

Exécutez ensuite le service comme suit :

$ sudo /sbin/initctl start strong-pm

REMARQUE : sur les systĂšmes qui ne prennent pas en charge Upstart 1.4, les commandes sont lĂ©gĂšrement diffĂ©rentes. Pour plus d’informations, voir Setting up a production host dans la documentation StrongLoop.

Exécuter votre application dans un cluster

Dans un systĂšme multicoeur, vous pouvez augmenter les performances d’une application Node en lançant un cluster de processus. Un cluster exĂ©cute plusieurs instances de l’application, idĂ©alement une instance sur chaque coeur d’UC, rĂ©partissant ainsi la charge et les tĂąches entre les instances.

IMPORTANT : Ă©tant donnĂ© que les instances d’application s’exĂ©cutent en tant que processus distincts, elles ne partagent pas le mĂȘme espace mĂ©moire. Autrement dit, les objets sont en local sur chaque instance de l’application. Par consĂ©quent, vous ne pouvez pas conserver l’état dans le code de l’application. Vous pouvez toutefois utiliser un magasin de donnĂ©es en mĂ©moire tel que Redis pour stocker les donnĂ©es de session et l’état. Cette fonctionnalitĂ© s’applique essentiellement Ă  toutes les formes de mise Ă  l’échelle horizontale, que la mise en cluster soit effectuĂ©e avec plusieurs processus ou avec plusieurs serveurs physiques.

Dans les applications mises en cluster, les processus de traitement peuvent planter individuellement sans impacter le reste des processus. Outre les avantages en termes de performance, l’isolement des pannes constitue une autre raison d’exĂ©cuter un cluster de processus d’application. Chaque fois qu’un processus de traitement plante, veillez toujours Ă  consigner l’évĂ©nement et Ă  gĂ©nĂ©ration un nouveau processus Ă  l’aide de cluster.fork().

Utilisation du module cluster de Node

La mise en cluster peut ĂȘtre rĂ©alisĂ©e avec le module cluster de Node. Ce module permet Ă  un processus maĂźtre de gĂ©nĂ©rer des processus de traitement et de rĂ©partir les connexions entrantes parmi ces processus. Toutefois, plutĂŽt que d’utiliser ce module directement, utilisez l’un des nombreux outils qui le font pour vous, Ă  savoir node-pm ou cluster-service par exemple.

Utilisation de StrongLoop PM

Si vous dĂ©ployez votre application dans StrongLoop Process Manager (PM), vous pouvez alors utiliser la mise en cluster sans modifier votre code d’application.

Lorsque StrongLoop Process Manager (PM) exĂ©cute une application, il l’exĂ©cute automatiquement dans un cluster avec un nombre de processus de traitement Ă©gal au nombre de coeurs d’UC sur le systĂšme. Vous pouvez modifier manuellement le nombre de processus de traitement dans le cluster Ă  l’aide de l’outil de ligne de commande slc sans arrĂȘter l’application.

Par exemple, en supposant que vous avez dĂ©ployĂ© votre application sur prod.foo.com et que StrongLoop PM est en mode Ă©coute sur le port 8701 (par dĂ©faut), pour dĂ©finir la taille du cluster sur 8 Ă  l’aide de slc :

$ slc ctl -C http://prod.foo.com:8701 set-size my-app 8

Pour plus d’informations sur la mise en cluster avec StrongLoop PM, voir Clustering dans la documentation StrongLoop.

Mettre en cache les rĂ©sultats d’une demande

Pour amĂ©liorer les performances en production, vous pouvez Ă©galement mettre en cache le rĂ©sultat des demandes, de telle sorte que votre application ne rĂ©pĂšte pas l’opĂ©ration de traitement de la mĂȘme demande plusieurs fois.

Utilisez un serveur de mise en cache tel que Varnish ou Nginx (voir aussi Nginx Caching) pour améliorer considérablement la vitesse et les performances de votre application.

Utiliser un Ă©quilibreur de charge

Quel que soit le niveau d’optimisation d’une application, une instance unique ne peut traiter qu’un volume limitĂ© de charge et de trafic. Pour faire Ă©voluer une application, vous pouvez exĂ©cuter plusieurs instances de cette application et rĂ©partir le trafic en utilisant un Ă©quilibreur de charge. La configuration d’un Ă©quilibreur de charge peut amĂ©liorer les performances et la vitesse de votre application et lui permettre d’évoluer plus largement qu’avec une seule instance.

Un Ă©quilibreur de charge est gĂ©nĂ©ralement un proxy inverse qui orchestre le trafic entrant et sortant de plusieurs instances d’application et serveurs. Vous pouvez facilement configurer un Ă©quilibreur de charge pour votre application Ă  l’aide de Nginx ou de HAProxy.

Avec l’équilibrage de charge, vous devrez peut-ĂȘtre vĂ©rifier que les demandes associĂ©es Ă  un ID de session spĂ©cifique sont connectĂ©es au processus dont elles sont issues. Ce procĂ©dĂ© est appelĂ© affinitĂ© de session (ou sessions persistantes) et peut ĂȘtre effectuĂ© en utilisant un magasin de donnĂ©es tel que Redis pour les donnĂ©es de session (en fonction de votre application), comme dĂ©crit ci-dessus. Pour en savoir plus, voir Using multiple nodes.

Utilisation de StrongLoop PM avec un Ă©quilibreur de charge Nginx

StrongLoop Process Manager est intĂ©grĂ© Ă  un contrĂŽleur Nginx, ce qui permet de paramĂ©trer facilement les configurations d’environnement de production Ă  plusieurs hĂŽtes. Pour plus d’informations, voir Scaling to multiple servers (documentation StrongLoop).

Utiliser un proxy inverse

Un proxy inverse accompagne une application Web et exĂ©cute des opĂ©rations de prise en charge sur les demandes, en plus de diriger les demandes vers l’application. Il peut gĂ©rer les pages d’erreur, la compression, la mise en cache, le dĂ©pĂŽt de fichiers et l’équilibrage de charge entre autres.

La transmission de tĂąches qui ne requiĂšrent aucune connaissance de l’état d’application Ă  un proxy inverse permet Ă  Express de rĂ©aliser des tĂąches d’application spĂ©cialisĂ©es. C’est pour cette raison qu’il est recommandĂ© d’exĂ©cuter Express derriĂšre un proxy inverse tel que Nginx ou HAProxy en production.