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.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 :
Les actions suivantes peuvent ĂȘtre rĂ©alisĂ©es dans votre code afin dâamĂ©liorer les performances de votre application :
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.
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.
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.
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.
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 ?
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.
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 :
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.
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.
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 :
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 :
Les actions suivantes peuvent ĂȘtre rĂ©alisĂ©es dans votre environnement systĂšme afin dâamĂ©liorer les performances de votre application :
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.
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.
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.
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 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.
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 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 :
start myapp
â DĂ©marre lâapplicationrestart myapp
â RedĂ©marre lâapplicationstop myapp
â ArrĂȘte lâapplicationPour plus dâinformations sur Upstart, voir Upstart Intro, Cookbook and Best Practises.
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.
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().
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.
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.
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.
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.
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).
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.