La première version du serveur HTTP Apache a été publiée en 1995 et même aujourd’hui, plus de 20 ans plus tard, le logiciel est toujours une référence comme structure de serveur Web, mais pas sans con­cur­rence pour autant. C’est prin­ci­pa­le­ment le serveur Russe NGINX (prononcé Engine-X), un projet open source également, qui gagne des parts de marché à une vitesse ful­gu­rante. Selon le clas­se­ment Alexa, la plupart des sites Web qui ob­tien­nent de bons résultats sont livrés via NGINX. Un résultat par­ti­cu­liè­re­ment dou­lou­reux pour Apache, appuyé par les sta­tis­tiques ré­gu­liè­re­ment mises à jour de W3Techs.

Non seulement les géants russes de l’Internet tels que les moteurs de recherche Rambler et Yandex, le service de courrier élec­tro­nique Mail.RU ou le réseau social VK s'ap­puient sur ce serveur Web léger, mais les four­nis­seurs in­ter­na­tio­naux tels que Dropbox, Netflix, WordPress et FastMail.com utilisent également NGINX pour améliorer les per­for­mances de leurs services. Le serveur HTTP Apache sera-t-il bientôt obsolète ?

Note

Le serveur HTTP Apache est un projet logiciel qui dépend de la Fondation Apache. Dans le langage éco­no­mique de la com­mu­nauté Internet, le nom du serveur Web est gé­né­ra­le­ment abrégé en "Apache". Lorsque nous faisons référence à "Apache" dans la suite de notre article, nous entendons toujours le logiciel et non le fabricant.

Les défis du Web 2.0

Owen Garrett, Head of Products chez Nginx Inc., décrit le serveur Web Apache dans un article de Blog daté du 9 octobre 2015 comme la colonne ver­té­brale du Web 1.0, sou­lig­nant son im­por­tance pour le dé­ve­lop­pe­ment de l’Internet au tournant du mil­lé­naire. Le grand succès du serveur Web est prin­ci­pa­le­ment dû à l’ar­chi­tec­ture simple du logiciel. Cependant, ceci était basé sur des décisions de con­cep­tion qui étaient inspirées d’un World Wide Web différent de celui que l’on connait aujourd’hui. Il y a 20 ans, les sites Web étaient beaucoup plus simples, la bande passante était limitée et coûteuse, tandis que le temps de trai­te­ment du CPU (pro­ces­seur ou unité centrale de trai­te­ment, central pro­ces­sing unit en anglais) était re­la­ti­ve­ment avan­ta­geux.

Au­jour­d'hui, nous avons affaire à une deuxième gé­né­ra­tion du Web, et cela se manifeste bien dif­fé­rem­ment : le nombre d'uti­li­sa­teurs et le trafic Web mondial s’est multiplié. Il en va de même pour la taille moyenne des pages Web sur le réseau et le nombre de com­po­sants qu'un na­vi­ga­teur web doit in­ter­ro­ger et rendre pour les afficher aux uti­li­sa­teurs. Une partie crois­sante de la com­mu­nauté Internet a grandi avec les pos­si­bi­li­tés du Web 2.0 dès le plus jeune âge. Ce groupe d'uti­li­sa­teurs n'a pas l'ha­bi­tude d'at­tendre plusieurs secondes ou même quelques minutes pour qu'une page Web soit chargée.

Ces évo­lu­tions re­pré­sen­taient des défis pour le serveur Apache ces dernières années. Owen Garrett attribue cette situation à l’ar­chi­tec­ture basée sur les processus d’Apache, qui ne peut pas être mise à l’échelle compte tenu de l’aug­men­ta­tion rapide du trafic de volume de données. Cette faiblesse a été l’une des prin­ci­pales mo­ti­va­tions du dé­ve­lop­pe­ment de NGINX en 2002, qui a adopté une approche com­plè­te­ment dif­fé­rente avec une ar­chi­tec­ture évé­ne­men­tielle. NGINX nous vient du dé­ve­lop­peur de logiciels russe Igor Sysoev, qui a adapté le logiciel, utilisé comme un serveur Web, reverse proxy server ou comme proxy email, en par­ti­cu­lier pour les besoins du moteur de recherche Russe Rambler.

Nous comparons les deux serveurs Web et discutons des dif­fé­rences ar­chi­tec­tu­rales, de la con­fi­gu­ra­tion, des options d’extension, de la comp­ta­bi­lité, de la do­cu­men­ta­tion et de l’as­sis­tance.

Conseil

Des in­tro­duc­tions générales aux serveurs Web open source Apache et NGINX, sur leur ins­tal­la­tion et con­fi­gu­ra­tion, sont dis­po­nibles dans notre guide digital.

Dif­fé­rences ar­chi­tec­tu­rales

Les serveurs Web Apache et NGINX reposent sur des ar­chi­tec­tures lo­gi­cielles fon­da­men­ta­le­ment dif­fé­rentes. Il existe dif­fé­rents concepts en ce qui concerne la gestion des con­nexions, l’in­ter­pré­ta­tion des demandes client, du trai­te­ment des contenus Web statiques et dy­na­miques ainsi que pour la con­fi­gu­ra­tion.

Gestion des con­nexions

Les serveurs Web open source Apache et NGINX diffèrent es­sen­tiel­le­ment par la façon dont ils traitent les demandes Client entrantes (requêtes). Alors qu’Apache est basé sur une ar­chi­tec­ture orientée sur les processus, la gestion des con­nexions NGINX repose sur un al­go­rithme de trai­te­ment basé sur les évè­ne­ments. Ceci permet de traiter les demandes de manière à éco­no­mi­ser les res­sources, même si elles sont reçues si­mul­ta­né­ment d’un grand nombre de con­nexions. Ceci est annoncé, entre autres, par les dé­ve­lop­peurs de NGINX, comme un avantage majeur par rapport au serveur HTTP Apache. Cependant, à partir de la version 2.4, le programme offre également la pos­si­bi­lité d’im­plé­men­ter des évè­ne­ments. Les dif­fé­rences se situent donc dans les détails.

Le serveur Web Apache suit une approche dans laquelle chaque requête client est traitée par un processus ou Thread séparé. Ce single threading, le mode d’ex­ploi­ta­tion original du serveur HTTP Apache, provoque tôt ou tard des problèmes de blocage I/O (ou I/O Blocking pour blocage Input/Output) : les processus qui né­ces­si­tent des opé­ra­tions de lecture ou d’écriture sont exécutés stric­te­ment les uns après les autres. Une demande ul­té­rieure reste dans la boucle d’attente jusqu’à ce que l’on réponde à la pré­cé­dente. Ceci peut être évité en démarrant plusieurs processus de single threading si­mul­ta­né­ment : une stratégie associée à une con­som­ma­tion élevée de res­sources.

Al­ter­na­ti­ve­ment, on peut utiliser des mé­ca­nismes multi-threading. Con­trai­re­ment au single-threading, où un seul thread est dis­po­nible dans chaque processus pour répondre aux demandes Client, le multi-threading permet à plusieurs threads de s’exécuter au sein du même processus. Puisque les threads sous Linux né­ces­si­tent moins de res­sources en tant que processus, le multi-threading permet de compenser les besoins im­por­tants en res­sources de l’ar­chi­tec­ture du serveur HTTP Apache supportée par les processus.

Les mé­ca­nismes de trai­te­ment parallèle des requêtes Client chez Apache peuvent être intégrés par l’un des trois modules Multi-Processus (MPMs) : mpm_prefork, mpm_worker, mpm_event.

  • mpm_prefork : le module Apache « Prefork » offre une gestion multi-processus sur un mécanisme de Single Threading. Le module crée un processus parent qui fournit un pool de processus enfants. Un thread s’exécute dans chaque processus enfant, ce qui permet de répondre à une demande client à la fois. Tant qu’il y a plus de processus Single Thread (un seul fil de dis­cus­sion) que de demandes client, les demandes sont traitées si­mul­ta­né­ment.

    Le nombre de processus single-threading dis­po­nibles est défini à l’aide des options de con­fi­gu­ra­tion de serveur « Mi­niS­pa­re­Ser­vers » et « MaxS­pa­re­Ser­vers ». Prefork présente les in­con­vé­nients de per­for­mance du Single Threading men­tion­nés ci-dessus. Cependant, la grande in­dé­pen­dance de processus distincts est un avantage : si une connexion est perdue en raison d’un processus dé­fec­tueux, cela n’affecte gé­né­ra­le­ment pas les con­nexions qui sont traitées dans d’autres processus.
  • mpm_worker: avec le module « Worker », Apache met à dis­po­si­tion des uti­li­sa­teurs un mécanisme multi-threading pour le trai­te­ment parallèle des requêtes Client. Il définit combien de Threads peuvent être lancés par processus, avec l’option de con­fi­gu­ra­tion de serveur « Thread­sPer­Child ». Le module fournit un thread par connexion TCP. Tant qu’il y a plus de threads dis­po­nibles que de demandes Client, les demandes sont traitées en parallèle. Le processus parent (HTTPd) surveille les Threads inactifs.

    Les uti­li­sa­teurs peuvent utiliser les commandes « Mi­niS­pa­re­Threads » et « MaxS­pa­re­Threads » pour définir le nombre de Threads inactifs à partir desquels de nouveaux Threads sont créés ou des Threads en cours d’exécution retirés de la mémoire. Le module Worker nécessite beaucoup moins de res­sources que le module Prefork. Cependant, comme les con­nexions ne sont pas traitées dans des processus séparés, un Thread incorrect peut affecter l’ensemble du processus multi-threading et donc toutes les con­nexions qui y sont traitées. De plus, Worker et Prefork sont sensibles aux sur­charges causées par ce qu’on appelle les con­nexions keep-alive (voir plus bas).
  • mpm_event : depuis la version 2.4, le serveur HTTP Apache avec Event dispose d’un troisième module mul­ti­prop­ces­seur pour la pro­duc­tion. Il s’agit d’une variante du module de travail qui répartit la charge entre les Threads démarrés. Pour chaque processus multi-threading, un thread d’écoute est utilisé, qui reçoit les demandes Client entrantes et distribue les tâches connexes aux Threads de travail.

    Le module évènement a été développé pour optimiser le trai­te­ment des con­nexions dites keep-alive, c’est-à-dire des con­nexions TCP qui sont main­te­nues pour permettre la trans­mis­sion d’autres requêtes Client ou de réponses de serveurs. Si le module de travail classique est utilisé, les Threads de travail déjà établis une fois sont bloqués, même si aucune demande autre demande n’est reçue.

    Ceci peut conduire à une surcharge du serveur avec un nombre élevé de con­nexions keep-alive. Le module évènement, d’autre part, sous-traite la main­te­nance des con­nexions keep-alive au fil de dis­cus­sion de l’auditeur in­dé­pen­dant. Les Threads de travail ne sont donc pas bloqués et sont dis­po­nibles pour le trai­te­ment des demandes ul­té­rieures.

Le graphique suivant montre une re­pré­sen­ta­tion sché­ma­tique de l'ar­chi­tec­ture basée sur les processus du serveur Web Apache à l'aide du module Worker :

Selon le module utilisé, Apache résout le problème de con­co­mi­tance (con­cur­rency, réponse si­mul­ta­née à de multiples demandes Client) soit par des processus ou des threads sup­plé­men­taires. Les deux stra­té­gies s’ac­com­pag­nent de Threads sup­plé­men­taires. Ceci devient un facteur limitant lors de la mise à l’échelle d’un serveur Apache.

L’énorme manque de res­sources de l’approche uni-processus par connexion résulte du fait qu’un en­vi­ron­ne­ment d’exécution distinct doit être fourni pour chaque processus sup­plé­men­taire. Cela nécessite une al­lo­ca­tion du temps CPU et une mémoire séparée. De plus, chaque module Apache qui doit être dis­po­nible dans un processus Worker doit être chargé sé­pa­ré­ment pour chaque processus. Les threads, en revanche, partagent un en­vi­ron­ne­ment d’exécution (le programme) et l’espace d’adressage sur la mémoire. La surcharge des Threads sup­plé­men­taires est donc con­si­dé­ra­ble­ment plus faible que celle des processus. Cependant, le multi-threading est également intensif en calcul lorsque des chan­ge­ments de contexte (Context Switches) se pro­dui­sent.

Un chan­ge­ment de contexte est le processus dans lequel un système passe d'un processus ou d'un thread à un autre. Pour ce faire, le contexte du processus ou du thread fini doit être sau­ve­gardé et le contexte du nouveau processus ou thread doit être créé ou restauré. C’est un processus ad­mi­nis­tra­tif long et fas­ti­dieux, dans lequel les registres CPU et les dif­fé­rents tableaux et listes doivent être chargés et sau­ve­gar­dés.

Le module mpm_event fournit un mécanisme d’évènement pour le serveur HTTP Apache qui sous-traite le trai­te­ment des con­nexions entrantes à un fil d’écoute, ou Listener-Thread. Ceci permet de mettre fin aux con­nexions non né­ces­saires (les con­nexions Keep-Alive également) et de réduire ainsi la con­som­ma­tion de res­sources. Le problème des chan­ge­ments de contexte à forte intensité CPU, se pro­dui­sant lorsque le Thread de l’auditeur transmet sé­pa­ré­ment des requêtes à des Threads de travail (Worker Threads), n’est toutefois pas résolu.

L’ar­chi­tec­ture évé­ne­men­tielle de NGINX, d’autre part, permet d’obtenir la si­mul­ta­néité sans avoir besoin d’un processus ou d’un Thread sup­plé­men­taire pour chaque nouvelle connexion. Un seul processus NGINX peut gérer si­mul­ta­né­ment des milliers de con­nexions HTTP. Ceci est réalisé par un mécanisme de boucle, appelé Event-loop (boucle d‘événement). Ceci permet aux demandes Client d’être traitées de manière asyn­chrone au sein d’un même thread.

Conseil

en théorie, NGINX n’a besoin que d’un seul processus de Single-Threading pour traiter les con­nexions. Pour une uti­li­sa­tion optimale du matériel, toutefois, le serveur Web est en général démarré avec un processus de travail par pro­ces­seur (CPU) de la machine sous-jacente.

Con­trai­re­ment au serveur Web Apache, où le nombre de processus actifs ou de Threads ne peut être limité que par des valeurs minimales et maximales, NGINX offre un modèle de processus pré­vi­sible qui est par­fai­te­ment adapté au matériel. Ceci inclut un processus maître, l’assistant traite le Cache-loader, le ges­tion­naire de cache, ainsi qu’un certain nombre de processus Worker qui sont définis pré­ci­sé­ment via la con­fi­gu­ra­tion, et ajustés au nombre de cœurs de pro­ces­seur.

  • Processus maître : le processus maître est un processus de niveau supérieur qui exécute toutes les opé­ra­tions de base. Il s’agit notamment de la lecture dans la con­fi­gu­ra­tion du serveur, de la liaison de port et de la création de tous les types de processus suivants.
     
  • Processus d’aide : NGINX utilise deux processus d’aide à la gestion des Cache : le Cache-loader et le ges­tion­naire de Cache (Cache-Manager).
    • Cache-Loader: le chargeur de Cache est res­pon­sable du char­ge­ment du Cache sur disque dur dans la mémoire de travail.
    • Cache-Manager : la tâche du ges­tion­naire de cache est de s’assurer que les entrées du cache du disque dur ont la taille pré­cé­dem­ment con­fi­gu­rée, et de les découper si né­ces­saire. Ce processus est adressé pé­rio­di­que­ment.
       
  • Worker-Prozess : les processus de travail sont res­pon­sables du trai­te­ment des con­nexions, de l’accès à la lecture sur le disque dur et de la com­mu­ni­ca­tion avec les serveurs en amont (serveurs qui four­nis­sent des services à d’autres serveurs). Ce sont donc les seuls processus du modèle de processus NGINX qui sont actifs en per­ma­nence.

Le graphique suivant montre une re­pré­sen­ta­tion sché­ma­tique du modèle de processus NGINX :

Tous les processus Worker démarrés via le processus maître NGINX dans le cadre de la con­fi­gu­ra­tion partagent un ensemble de Listener Sockets (terminaux de com­mu­ni­ca­tion). Au lieu de démarrer un processus ou un Thread séparé pour chaque connexion entrante, chaque processus Worker exécute une boucle d’évè­ne­ments qui permet à plusieurs milliers de con­nexions au sein d’un Thread d’être traitées de manière asyn­chrone sans bloquer le processus. Pour ce faire, les processus Worker traitent les Listener-sockets en per­ma­nence à la recherche d’évé­ne­ments dé­clen­chés par des con­nexions entrantes, les accepte et exécute les processus de lecture et d’écriture sur Socket lors du trai­te­ment HTTP.

NGINX ne fournit pas ses propres mé­ca­nismes pour la dis­tri­bu­tion des con­nexions aux processus Worker. Au lieu de cela, les fonctions du noyau du système d’ex­ploi­ta­tion sont utilisées. Les schémas de trai­te­ment des requêtes entrantes sont fournis par des automates finis (State Machine) séparées pour HTTP, raw TCP ainsi que SMTP, IMAP et POP3.

Plus gé­né­ra­le­ment, NGINX peut être décrit comme un ges­tion­naire d’évé­ne­ments qui reçoit des in­for­ma­tions sur les évé­ne­ments du noyau et indique au système d’ex­ploi­ta­tion comment gérer les tâches associées. Le trai­te­ment asyn­chrone des tâches dans la boucle d’évé­ne­ments est basé sur des no­ti­fi­ca­tions d’évé­ne­ments, des fonctions de rappel (Callbacks) et des tem­po­ri­sa­teurs (Timers). Ces mé­ca­nismes per­met­tent à un processus Worker de déléguer une opération après l’autre au système d’ex­ploi­ta­tion sans attendre le résultat d’une opération ou la réponse des pro­grammes Client. NGINX fonc­tionne comme un or­ches­tra­teur pour le système d’ex­ploi­ta­tion, qui lit et écrit des octets.

Ce type de gestion des con­nexions ne génère qu’une surcharge minimale pour les con­nexions sup­plé­men­taires. Tout ce dont vous avez besoin est un des­crip­teur de fichier (FD pour File Des­crip­tor) sup­plé­men­taire et un minimum de mémoire sup­plé­men­taire dans le processus Worker. Toutefois, les mo­di­fi­ca­tions de contexte à forte intensité de calcul n’in­ter­vien­nent que si aucun autre événement ne se produit dans une boucle d’évé­ne­ments. Cette ef­fi­ca­cité dans le trai­te­ment des demandes à travers une variété de con­nexions pré­des­tine NGINX comme un outil équilibré pour les sites Web très fré­quen­tés tels que WordPRess.com par exemple.

En résumé

avec son ar­chi­tec­ture évé­ne­men­tielle, NGINC offre une al­ter­na­tive à la gestion des con­nexions par processus du serveur HTTP Apache. Cependant, cette seule ca­rac­té­ris­tique n’est pas suf­fi­sante pour expliquer pourquoi NGINX est si per­for­mant dans les dif­fé­rents tests. Depuis la version 2.4, Apache supporte également un mécanisme de trai­te­ment basé sur les évé­ne­ments pour les requêtes Client. Lorsque vous comparez des serveurs Web tels qu’Apache et NGINX, faites toujours attention aux modules utilisés dans le test, à la con­fi­gu­ra­tion des serveurs Web et aux tâches à maîtriser.

Trai­te­ment des contenus Web statiques et dy­na­miques

NGINX suit également une stratégie dif­fé­rente de celle du serveur HTTP Apache lorsqu’il s’agit de contenu Web dynamique.

En principe, pour délivrer un contenu Web dynamique, un serveur Web doit utiliser un in­ter­pré­teur capable de traiter un langage de pro­gram­ma­tion tel que PHP, Perl, Python ou Ruby. Apache fournit plusieurs modules comme mod_php, mod_perl, mod_python ou mod_ruby, qui per­met­tent de charger l‘in­ter­pré­teur di­rec­te­ment dans le serveur Web. Ainsi, Apache lui-même est équipé de la capacité à traiter du contenu Web dynamique créé avec le langage de pro­gram­ma­tion approprié. Les fonctions de mise à dis­po­si­tion de contenu statique sont déjà im­plé­men­tées par les modules MPM men­tion­nés ci-dessus.

NGINX, par contre, ne fournit que des mé­ca­nismes de diffusion de contenu Web statique. La mise à dis­po­si­tion de contenu dynamique est confiée à des serveurs d'ap­pli­ca­tion spé­cia­li­sés. Dans ce cas, NGINX fonc­tionne sim­ple­ment comme un proxy entre le programme client et le serveur Upsteam. La com­mu­ni­ca­tion s'ef­fec­tue via des pro­to­coles tels que HTTP, FastCGI, SCGI, SCGI, uWSGI et Memcached. WebSphere, JBoss ou Tomcat sont des serveurs d'ap­pli­ca­tion possibles pour la livraison de contenu dynamique. Cependant, le serveur HTTP Apache peut également être utilisé à cette fin.

Les deux stra­té­gies pour traiter le contenu statique et dynamique ont des avantages et des in­con­vé­nients. Un module comme mod_php permet au serveur Web d’exécuter le code PHP lui-même. Un serveur d’ap­pli­ca­tion séparé n’est pas né­ces­saire. Cela rend l’ad­mi­nis­tra­tion de sites Web dy­na­miques très pratique. Cependant, les modules d’in­ter­pré­ta­tion pour les langages de pro­gram­ma­tion dynamique doivent être chargés sé­pa­ré­ment dans chaque processus de travail qui est res­pon­sable de la livraison du contenu. Dans le cas d’un grand nombre de processus de travail, ceci s’ac­com­pagne de frais généraux im­por­tants. NGINX réduit ces frais généraux, car l’in­ter­prète ex­ter­na­lisé n’est chargé qu’en cas de besoin.

Alors que NGINX est limité à l'in­te­rac­tion avec un in­ter­pré­teur externe, les deux stra­té­gies sont ouvertes aux uti­li­sa­teurs d'Apache. Apache peut aussi être placé devant un serveur d'ap­pli­ca­tion qui in­ter­prète le contenu Web dynamique. En règle générale, le protocole FastCGI est utilisé à cette fin. Une interface cor­res­pon­dante peut être chargée avec le module mod_proxy_proxy_fcgi.

En résumé

Dans notre com­pa­rai­son, ces deux serveurs Web per­met­tent de livrer des pages Web dy­na­miques. Mais tandis qu’Apache utilise des modules pour in­ter­pré­ter et exécuter le code lui-même, NGINX sous-traite cette étape à un serveur d’ap­pli­ca­tion externe.

In­ter­pré­ta­tion des requêtes Client

Pour être en mesure de répondre de façon sa­tis­fai­sante aux demandes des pro­grammes Client (comme les na­vi­ga­teurs Web ou les pro­grammes de courrier élec­tro­nique), un serveur doit dé­ter­mi­ner quelle ressource est demandée et où elle se trouve en fonction de la demande.

Le serveur HTTP Apache a été conçu comme un serveur Web. NGINX, d'autre part, offre à la fois des fonctions de serveur Web et de serveur proxy. Cette dif­fé­rence d'orien­ta­tion se reflète dans la façon dont le logiciel respectif in­ter­prète les demandes Client et alloue les res­sources sur le serveur.

Note

le serveur HTTP Apache peut aussi être utilisé comme un serveur proxy en utilisant le module mod_proxy.

Le serveur HTTP Apache et NGINX ont tous deux des mé­ca­nismes qui per­met­tent aux requêtes entrantes d’être in­ter­pré­tées soit comme des res­sources physiques dans le système de fichiers, soit comme des URI (Uniform Resource Iden­ti­fiers). Cependant, alors qu’Apache est basé sur les fichiers par défaut, NGINX se concentre sur le trai­te­ment URI des requêtes.

Si le serveur HTTP Apache reçoit une requête Client, par défaut, il suppose qu'une ressource spé­ci­fique doit être récupérée à partir du système de fichiers du serveur. Comme Apache utilise Vir­tual­Hosts pour fournir dif­fé­rents contenus Web sur le même serveur sous dif­fé­rents noms d’hôtes, adresses IP ou numéros de port, il doit d'abord dé­ter­mi­ner à quel Vir­tual­Host la requête se réfère. Pour ce faire, le serveur Web compare le nom d’hôte, l’adresse IP et le numéro de port au début de la requête URI avec les Vir­tual­Hosts définis dans le fichier de con­fi­gu­ra­tion principal HTTPd.conf.

L’exemple de code suivant montre une con­fi­gu­ra­tion Apache dans laquelle les deux domaines www.exemple.com et www.autre-exemple.com sont exploités sous la même adresse IP :

NameVirtualHost *:80
<VirtualHost *:80>
ServerName www.exemple.com
ServerAlias exemple.com *.exemple.com
DocumentRoot /data/www/exemple
</VirtualHost>
<VirtualHost *:80>
ServerName www.autre-exemple.com
DocumentRoot /data/www/autre-exemple
</VirtualHost>

L’as­té­risque (*) sert de caractère de rem­pla­ce­ment pour toute adresse IP. Apache décide via un alig­ne­ment du nom d’hôte contenu dans la requête avec la directive Ser­ver­Name de quel Do­cu­men­tRoot (le ré­per­toire de démarrage d'un projet Web) la ressource demandée est re­cher­chée.

Une fois qu’Apache a trouvé le serveur souhaité, l’URL de la requête est mappée au système de fichiers du serveur par défaut. Apache utilise la spé­ci­fi­ca­tion de chemin continue dans l’URL. En com­bi­nai­son avec Do­cu­men­tRoot, il en résulte le chemin d’accès à la ressource

Pour une demande avec requête URL HTTP://www.exemple.org:80/public_html/images/logo.gif, Apache af­fi­che­rait (sur la base de l’exemple ci-dessus) la ressource désirée en utilisant le chemin de fichier suivant :

/data/www/exemple/public_html/images/logo.gif
Note

Puisque le port standard pour HTTP est le 80, cette spé­ci­fi­ca­tion est gé­né­ra­le­ment omise dans la pratique.

Apache compare également l’URL de la requête avec des blocs de fichiers et de ré­per­toires op­tion­nels dans la con­fi­gu­ra­tion. Ceux-ci vous per­met­tent de définir des ins­truc­tions spéciales pour les requêtes qui se réfèrent aux fichiers ou ré­per­toires sé­lec­tion­nés (y compris les sous-ré­per­toires).

L’exemple suivant définit des ins­truc­tions spéciales pour le ré­per­toire public_html/images et le fichier private.html :

<VirtualHost *:80>
    ServerName www.exemple.com
    ServerAlias exemple.com *.exemple.com
    DocumentRoot /data/www/exemple
      <Directory var/www/exemple.com/public_html/images>
          Order Allow,Deny
          Allow from all
     </Directory> 
      <Files public.html>
          Order Allow,Deny
          Deny from all
      </Files>
</VirtualHost>

En plus de cette procédure standard pour in­ter­pré­ter les requêtes des clients, la directive Alias d'Apache vous permet de spécifier un autre ré­per­toire pour re­cher­cher la ressource demandée au lieu de Do­cu­men­tRoot. De plus, le serveur HTTP Apache fournit un module appelé mod_rewrite qui permet aux uti­li­sa­teurs de réécrire ou de rediriger des URL.

Conseil

plus d’in­for­ma­tions sur le module mod_rewrite sont dis­po­nibles sur l’article de mbase sur Rewrite-Engine

Si vous voulez qu’Apache récupère les res­sources qui sont stockées en dehors du système de fichiers du serveur, utilisez la directive Location. Ceci vous permet de définir des ins­truc­tions pour des URL spé­ci­fiques.

Ce qui fait figure d’exception avec Apache est un cas standard avec NGINX. NGINX analyse d’abord l’URL de la requête et l’associe aux blocs de server et location dans la con­fi­gu­ra­tion du serveur Web. Ce n’est qu’ensuite qu’une mise en cor­res­pon­dance avec le système de fichiers et la com­bi­nai­son avec la racine (qui cor­res­pond à la racine du document du serveur Apache) est effectuée (si né­ces­saire).

En utilisant la directive Server, NGINX détermine quel hôte est res­pon­sable de répondre à la requête du Client. Le bloc serveur cor­res­pond donc à un Vir­tual­Host dans la con­fi­gu­ra­tion d'Apache. Pour ce faire, le nom d’hôte, l’adresse IP et le numéro de port de l’URL de la requête sont comparés à tous les blocs de serveur définis dans la con­fi­gu­ra­tion de serveur Web. L’exemple de code suivant montre trois blocs serveur dans le fichier de con­fi­gu­ra­tion NGINX nginx.conf :

server {
    listen 80;
    server_name example.org www.example.org;
    ...
}
server {
    listen 80;
    server_name example.net www.example.net;
    ...
}
server {
    listen 80;
    server_name example.com www.example.com;
    ...
}
Note

chaque bloc serveur contient gé­né­ra­le­ment une série de blocs de lo­ca­li­sa­tion. Dans l’exemple actuel, ceux-ci ont été remplacés par des espaces réservés (…).

L’URL de requête n’est pas comparée avec les blocs de lo­ca­li­sa­tion dans un bloc serveur jusqu'à ce que le serveur demandé soit trouvé. NGINX lit les blocs d'em­pla­ce­ment listés et recherche l'em­pla­ce­ment qui cor­res­pond le mieux à la requête URI. Chaque bloc d'em­pla­ce­ment contient des ins­truc­tions spé­ci­fiques qui montrent à NGINX comment traiter la requête cor­res­pon­dante.

Les em­pla­ce­ments peuvent être définis comme des préfixes pour un chemin, des cor­res­pon­dances exactes ou des ex­pres­sions ré­gu­lières (RegEx). Les mo­di­fi­ca­teurs suivants sont utilisés dans la syntaxe de la con­fi­gu­ra­tion de serveur :

Pas de mo­di­fi­ca­teur L'em­pla­ce­ment est in­ter­prété comme un préfixe. Toutes les requêtes dont les URL ont le préfixe défini dans la directive location sont con­si­dé­rées comme cor­res­pon­dant à l'em­pla­ce­ment. Si aucun autre em­pla­ce­ment spé­ci­fique n'est trouvé, la demande est traitée en fonction des in­for­ma­tions contenues dans ce bloc d'em­pla­ce­ment
= L’em­pla­ce­ment est in­ter­prété comme une cor­res­pon­dance exacte. Toutes les requêtes dont l'URL cor­res­pond exac­te­ment à la chaîne de ca­rac­tères listée dans la directive location sont traitées con­for­mé­ment aux spé­ci­fi­ca­tions de ce bloc de lo­ca­li­sa­tion.
~ Le lieu est in­ter­prété comme une ex­pres­sion régulière. Toutes les requêtes dont l'URL cor­res­pond à l'ex­pres­sion régulière sont traitées con­for­mé­ment aux spé­ci­fi­ca­tions de ce bloc de lo­ca­li­sa­tion. Les ma­jus­cules et mi­nus­cules sont évaluées pendant le réglage (sensible à la casse).
~* Le lieu est in­ter­prété comme une ex­pres­sion régulière. Toutes les requêtes dont l'URL cor­res­pond à l'ex­pres­sion régulière sont traitées con­for­mé­ment aux spé­ci­fi­ca­tions de ce bloc de lo­ca­li­sa­tion. Les ma­jus­cules et mi­nus­cules ne sont pas évaluées pendant l'ajus­te­ment (in­sen­sible à la casse).

L'exemple suivant montre trois blocs d'em­pla­ce­ment qui montrent comment traiter les demandes entrantes pour les domaines example.org et www.example.orgserver {

listen 80;
    server_name example.org www.example.org;
    root /data/www;
    location / {
        index index.html index.php;
    }
    location ~* \.(gif|jpg|png)$ {
        expires 30d;
    }
location ~ \.php$ {
        fastcgi_pass localhost:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

Sur la base d'une demande du client avec la demande URL, HTTP://www.example.org:80/logo.gif, NGINX pro­cé­de­rait comme suit pour in­ter­pré­ter les demandes sub­sé­quentes et livrer la ressource désirée :

HTTP://www.example.org:80/logo.gif
HTTP://www.example.org:80/index.php

Tout d’abord, NGINX détermine l’em­pla­ce­ment du préfixe le plus spé­ci­fique. Pour ce faire, le serveur Web lit tous les em­pla­ce­ments en séquence sans mo­di­fi­ca­teur et s’arrête au premier em­pla­ce­ment qui cor­res­pond à la requête. Tous les em­pla­ce­ments marqués avec le mo­di­fi­ca­teur RegEx (~) sont ensuite importés. Ici aussi, le premier coup est appliqué. Si aucun em­pla­ce­ment RegEx approprié n'est trouvé, le serveur Web accède à l'em­pla­ce­ment de préfixe pré­cé­dem­ment déterminé comme solution de secours.

Par exemple, la requête URI HTTP://www.example.org:80/logo.gif cor­res­pond à la fois au préfixe location / et à l'ex­pres­sion régulière \.(gif|jpg|png)$. NGINX mapperait donc la requête en com­bi­nai­son avec la racine vers le chemin du fichier /data/www/logo.gif et livrerait la ressource cor­res­pon­dante au Client. L'en-tête Expires spécifie quand une réponse est con­si­dé­rée comme obsolète, dans l'exemple actuel après 30 jours : expire 30d.

La demande de la page PHP avec l'URI HTTP://www.example.org:80/index.php cor­res­pond également à l’em­pla­ce­ment du préfixe / et à l’em­pla­ce­ment RegEx ~ \.php$, qui bénéficie d’un trai­te­ment pré­fé­ren­tiel. NGINX transmet donc la requête à un serveur FastCGI qui écoute sur localhost:9000 et est res­pon­sable du trai­te­ment du contenu Web dynamique. La directive fastcgi_param définit le paramètre FastCGI SCRIPT_FILENAME à /data/www/index.php. Le fichier s’exécute ensuite sur le serveur uptream. La variable $document_root cor­res­pond à la directive root, la variable $fastcgi_script_name à la partie de l’URI qui suit le nom d’hôte et le numéro de port : /index.php.

Cette procédure, à première vue quelque peu com­pli­quée, pour l’in­ter­pré­ta­tion des demandes des clients est due aux dif­fé­rents domaines d'ap­pli­ca­tion dans lesquels le NGINX est utilisé. Par rapport à l’approche prin­ci­pa­le­ment basée sur les fichiers du serveur HTTP Apache, l’in­ter­pré­ta­tion des requêtes basée sur l'URL permet une plus grande flexi­bi­lité lors du trai­te­ment de dif­fé­rents modèles de requêtes. Ceci est né­ces­saire, par exemple, si NGINX fonc­tionne comme un serveur proxy ou proxy de mes­sa­ge­rie plutôt qu'un serveur web.

En résumé

Apache est prin­ci­pa­le­ment utilisé comme serveur Web et in­ter­prète les requêtes Client prin­ci­pa­le­ment basées sur des fichiers. NGINX, d'autre part, fonc­tionne avec les URIs de manière standard et répond donc aussi à d'autres modèles de demandes.

Con­fi­gu­ra­tion

On dit que NGINX offre un énorme avantage de vitesse par rapport au serveur HTTP Apache lors de la livraison de contenu web statique. Ceci s’explique en partie par des dif­fé­rences de con­fi­gu­ra­tion.

En plus du fichier de con­fi­gu­ra­tion principal HTTPd.conf, le serveur Web Apache offre aux ad­mi­nis­tra­teurs l’option d’ad­mi­nis­tra­tion au niveau du ré­per­toire. Les fichiers .htaccess sont utilisés à cette fin. En principe, ces fichiers de con­fi­gu­ra­tion dé­cen­tra­li­sés peuvent être im­plé­men­tés dans n’importe quel ré­per­toire serveur. Les ins­truc­tions définies dans un .htaccess se réfèrent à la fois au ré­per­toire contenant le fichier de con­fi­gu­ra­tion et à ses sous-ré­per­toires. En pratique, les fichiers .htaccess sont utilisés pour res­treindre l’accès aux ré­per­toires à certains groupes d’uti­li­sa­teurs, con­fi­gu­rer la pro­tec­tion par mot de passe et définir des règles pour la na­vi­ga­tion dans les ré­per­toires, les messages d'erreur, les re­di­rec­tions ou le contenu al­ter­na­tif.

Notez que tout cela peut également être configuré de manière cen­tra­li­sée dans le fichier HTTPd.conf. Cependant,.htaccess devient pertinent pour les modèles d'hé­ber­ge­ment Web tels que l'hé­ber­ge­ment mutualisé, où l'accès au fichier de con­fi­gu­ra­tion principal est réservé au four­nis­seur de services d'hé­ber­ge­ment. La con­fi­gu­ra­tion dé­cen­tra­li­sée via.htaccess permet aux uti­li­sa­teurs d'au­to­ri­ser l'ad­mi­nis­tra­tion de certaines zones du système de fichiers du serveur, par exemple pour des ré­per­toires de projets sé­lec­tion­nés, sans leur donner accès à la con­fi­gu­ra­tion prin­ci­pale. De plus, les mo­di­fi­ca­tions prennent effet im­mé­dia­te­ment et sans re­dé­mar­rage.

NGINX, par contre, n’offre que des options de con­fi­gu­ra­tion centrale. Toutes les ins­truc­tions sont définies dans le fichier nginx.conf. L’accès à ce fichier permet à l’uti­li­sa­teur de contrôler l'en­semble du serveur. Con­trai­re­ment à Apache, l’accès ad­mi­nis­tra­tif ne peut pas être limité à des ré­per­toires sé­lec­tion­nés. Ceci présente à la fois des avantages et des in­con­vé­nients. La con­fi­gu­ra­tion centrale de NGINX est moins flexible que le concept du serveur HTTP Apache, mais offre un net avantage en termes de sécurité : les chan­ge­ments de con­fi­gu­ra­tion du serveur web ne peuvent être effectués que par des uti­li­sa­teurs ayant des droits root.

Plus important que l'ar­gu­ment de sécurité : l'in­con­vé­nient de per­for­mance d'une con­fi­gu­ra­tion dé­cen­tra­li­sée via .htaccess. Déjà dans la do­cu­men­ta­tion du serveur HTTP Apache, les dé­ve­lop­peurs re­com­man­dent de ne pas utiliser .htaccess si l'accès est possible avec HTTPd.conf. La raison à cela est la procédure dans laquelle Apache lit et in­ter­prète les fichiers de con­fi­gu­ra­tion.

Comme nous l'avons déjà mentionné, Apache suit par défaut un schéma basé sur les fichiers pour répondre aux demandes Client. Puisque l’ar­chi­tec­ture Apache permet une con­fi­gu­ra­tion dé­cen­tra­li­sée, le serveur Web recherche un fichier .htaccess dans chaque ré­per­toire le long du chemin d’accès au fichier .htaccess sur son chemin vers la ressource demandée. Tous les fichiers de con­fi­gu­ra­tion qu'il passe sont lus et in­ter­pré­tés, un schéma qui ralentit con­si­dé­ra­ble­ment le serveur web.

Note

En principe, les ad­mi­nis­tra­teurs d’Apache sont libres de décider s'ils veulent utiliser les options de con­fi­gu­ra­tion dé­cen­tra­li­sée du serveur web et accepter les avantages et in­con­vé­nients associés. Dans la do­cu­men­ta­tion, les dé­ve­lop­peurs sou­lig­nent que toutes les con­fi­gu­ra­tions .htaccess peuvent également être faites en utilisant des blocs de ré­per­toire dans la con­fi­gu­ra­tion prin­ci­pale HTTPd.conf.

Les uti­li­sa­teurs qui veulent dé­sac­ti­ver ou res­treindre la con­fi­gu­ra­tion dé­cen­tra­li­sée sous Apache utilisent la directive Al­lo­wO­ver­ride dans les blocs de ré­per­toire du fichier de con­fi­gu­ra­tion principal HTTPd.conf et la mettent à None. Ceci demande au serveur web d'ignorer tous les fichiers .htaccess dans les ré­per­toires cor­rec­te­ment con­fi­gu­rés.

<VirtualHost *:80>
    ServerName example.com;
    ...
    DocumentRoot /data/www/example
      <Directory /data/www/example>
        AllowOverride None
        ...
      </Directory>
    ...
</VirtualHost>

L‘exemple de con­fi­gu­ra­tion demande au serveur Web d’ignorer tous les fichiers .htaccess pour l’hôte example.com.

En résumé

Con­trai­re­ment à NGINX, qui n'est configuré que de manière cen­tra­li­sée, Apache, avec .htaccess, offre la pos­si­bi­lité d'une con­fi­gu­ra­tion dé­cen­tra­li­sée, basée sur des ré­per­toires. Si des fichiers .htaccess sont utilisés, le serveur Web perd de la vitesse.

Pos­si­bi­li­tés d‘ex­ten­sions

Dans notre com­pa­rai­son, les deux serveurs Web reposent sur un système modulaire dans lequel le logiciel de base peut être complété par des com­po­sants sup­plé­men­taires si né­ces­saire. Cependant, jusqu’à la version 1.9.10, NGINX pour­sui­vait une stratégie fon­da­men­ta­le­ment dif­fé­rente de celle de ses con­cur­rents en ce qui concerne les modules.

Le serveur HTTP Apache offre deux façons d’étendre le logiciel de base. Les modules peuvent être compilés dans les fichiers binaires Apache pendant le dé­ve­lop­pe­ment ou chargés dy­na­mi­que­ment et donc au moment de l'exé­cu­tion.

ON distingue trois ca­té­go­ries de modules Apache :

  • Modules de base : les modules de base d’Apache com­pren­nent tous les com­po­sants qui four­nis­sent une fonc­tion­na­lité de base du serveur Web.
  • Modules d’ex­ten­sions : ces ex­ten­sions sont des modules de la Fondation Apache, qui sont inclus dans la dis­tri­bu­tion Apache. Pour un aperçu de tous les modules inclus dans l’ins­tal­la­tion standard d’Apache 2.4, voir la do­cu­men­ta­tion d'Apache.
  • Module de four­nis­seur tiers : ces modules ne sont pas fournis par la Fondation Apache, mais par des four­nis­seurs de services externes ou des pro­gram­meurs in­dé­pen­dants.

Avec NGINX, cependant, la mo­du­la­rité a longtemps été limitée aux com­po­sants d’extension statiques qui devaient être compilés dans le fichier binaire du noyau logiciel. Surtout pour les uti­li­sa­teurs qui n'étaient pas habitués à gérer leurs propres com­po­sants logiciels sans le ges­tion­naire de paquets de la dis­tri­bu­tion res­pec­tive, ce type d'ex­ten­sion lo­gi­cielle limitait clai­re­ment la flexi­bi­lité du serveur web. L’équipe de dé­ve­lop­pe­ment a amélioré ce point : depuis la version 1.9.11 supporte des mé­ca­nismes qui per­met­tent aux modules statiques d'être convertis en modules dy­na­miques afin qu'ils puissent être chargés via des fichiers de con­fi­gu­ra­tion pendant l'exé­cu­tion. Dans les deux cas, l'API du module du serveur est utilisée.

Veuillez noter que tous les modules NGINX ne peuvent pas être convertis en modules dy­na­miques. Les modules qui patchent le code source du logiciel serveur ne doivent pas être chargés dy­na­mi­que­ment. De plus, NGINX limite, dans les pa­ra­mètres standards, le nombre de modules dy­na­miques pouvant être chargés si­mul­ta­né­ment à 128. Pour augmenter cette limite, dé­fi­nis­sez la constante pour NGX_MAX_DYNAMIC_MODULES dans le code source NGINX à la valeur souhaitée.

En plus des modules officiels de la do­cu­men­ta­tion du NGINX, les uti­li­sa­teurs ont accès à divers modules tiers.

En résumé

les deux serveurs Web peuvent être étendus de manière modulaire. En plus des modules statiques, des modules dy­na­miques sont dis­po­nibles, qui peuvent être chargés dans le programme en cours d'exé­cu­tion si né­ces­saire.

Do­cu­men­ta­tion et as­sis­tance

Les deux projets logiciels sont bien do­cu­men­tés et four­nis­sent aux uti­li­sa­teurs des in­for­ma­tions de première main via des wikis et des blogs.

Alors que la do­cu­men­ta­tion du NGINX n’est ac­ces­sible qu’en anglais et en russe, le projet Apache se ca­rac­té­rise par des documents d’in­for­ma­tion dans de nom­breuses versions lin­guis­tiques. Cependant, certaines d'entre elles sont dépassées, il est donc in­dis­pen­sable de jeter un coup d'œil à la do­cu­men­ta­tion en anglais.

Les uti­li­sa­teurs peuvent obtenir de l'aide pour résoudre des problèmes dans les deux projets open source par l'in­ter­mé­diaire de la com­mu­nauté. Les listes de mailing servent de forum de dis­cus­sion.

Des plans de pu­bli­ca­tion et des feuilles de route trans­pa­rents donnent aux uti­li­sa­teurs la pos­si­bi­lité de s’adapter aux dé­ve­lop­pe­ments futurs. Les bugs logiciels et les failles de sécurité dans les deux projets sont en­re­gis­trés et corrigés dans un rapport public des bugs.

En plus du projet open source NGINX, Nginx, Inc. offre le produit com­mer­cial NGINX Plus. Moyennant des frais d'uti­li­sa­tion annuels, les uti­li­sa­teurs peuvent obtenir des fonctions sup­plé­men­taires et un soutien pro­fes­sion­nel du fabricant. Une matrice de com­pa­rai­son des deux produits se trouve sur le site Web de NGINX.

Il n’existe pas d’édition com­mer­ciale du serveur HTTP Apache. Toutefois, des services d’as­sis­tance payants sont offerts par divers four­nis­seurs tiers.

En résumé

les serveurs HTTP Apache et NGINX sont tous deux suf­fi­sam­ment do­cu­men­tés pour une uti­li­sa­tion pro­fes­sion­nelle.

Com­pa­ti­bi­lité et éco­sys­tème

Le serveur HTTP Apache façonne le World Wide Web depuis plus de deux décennies et demeure la norme de facto pour la diffusion de contenu Web en raison de sa part de marché. NGINX peut également jeter un regard en arrière sur une histoire à succès longue de 15 ans. Les deux serveurs Web sont ca­rac­té­ri­sés par une large prise en charge des pla­te­formes. Bien qu’Apache soit re­com­mandé pour tous les systèmes d’ex­ploi­ta­tion unixoid et Windows, la do­cu­men­ta­tion NGINX énumère les systèmes suivants comme étant testés : FreeBSD, Linux, Solaris, IBM AIX, HP-UX, macOS et Windows.

En tant que serveur standard, Apache est largement com­pa­tible avec des projets tiers. Tous les standards web per­ti­nents peuvent être intégrés par le biais de modules. En outre, un grand nombre de joueurs en ligne sont familiers avec les concepts d'Apache. Les ad­mi­nis­tra­teurs et les dé­ve­lop­peurs Web mettent gé­né­ra­le­ment en œuvre leurs premiers projets sur des plates-formes d'hé­ber­ge­ment mutualisé à faible coût. La plupart d'entre eux sont basés sur Apache et la pos­si­bi­lité de con­fi­gu­ra­tion dé­cen­tra­li­sée via .htaccess. De plus, le serveur HTTP Apache fait partie de plusieurs pro­gi­ciels de dé­ve­lop­pe­ment et de test de logiciels open source tels que XAMPP ou AMPPS.

NGINX offre également aux uti­li­sa­teurs un large éco­sys­tème de modules. De plus, l’équipe de dé­ve­lop­pe­ment en­tre­tient des par­te­na­riats avec divers projets de logiciels libres et pro­prié­taires ainsi qu’avec des four­nis­seurs de services d’in­fras­truc­ture tels qu’Amazon Web Services, Windows Azure et HP.

En résumé

les deux serveurs Web sont bien établis et proposent un vaste éco­sys­tème à leurs uti­li­sa­teurs. Comparé à NGINX, Apache présente l’avantage de disposer d’une grande com­mu­nauté d'uti­li­sa­teurs, formée au fil des années, qui s'est fa­mi­lia­ri­sée avec les bases du serveur Web. Le fait que des milliers d'ad­mi­nis­tra­teurs ont vérifié et amélioré le code source du logiciel ne joue pas seulement en faveur de la sécurité du serveur Web, mais a également pour con­sé­quence que les nouveaux uti­li­sa­teurs bé­né­fi­cient de l’aide des nombreux ad­mi­nis­tra­teurs Apache ex­pé­ri­men­tés en cas de problème, dans les forums ou via des listes de diffusion.

NGINX vs. Apache : aperçu des dif­fé­rences

Malgré des dif­fé­rences dans l'ar­chi­tec­ture lo­gi­cielle, les deux serveurs Web offrent des fonctions si­mi­laires. Apache et NGINX sont utilisés dans des scénarii si­mi­laires, mais chacun utilise ses propres stra­té­gies et concepts pour répondre aux exigences spé­ci­fiques. Le tableau suivant compare les deux projets logiciels en utilisant des fonctions centrales.

Ca­rac­té­ris­tiques Apache NGINX
Fonction Serveur Web Serveur Proxy Serveur Web Serveur Proxy Email-Proxy Load-Balancer (ré­par­ti­teur de charge)
Langue de pro­gram­ma­tion C C
Système d‘ex­ploi­ta­tion Toutes les pla­te­formes Unixoid Windows FreeBSD Linux Solaris IBM AIX HP-UX macOS Windows
Pu­bli­ca­tion 1995 2002
Licence Apache License v2.0 BSD-License (Berkeley Software Dis­tri­bu­tion)
Dé­ve­lop­peur Apache Software Foun­da­tion Nginx, Inc.
Ar­chi­tec­ture lo­gi­cielle Basé sur processus/thread Basé sur des évé­ne­ments
Si­mul­ta­néité Multi-Pro­ces­sing Multi-Threading Event-Loop (boucle d’évé­ne­ments)
Contenus Web statiques Oui Oui
Contenus Web dy­na­miques Oui Non
In­ter­pre­ta­tion de requêtes Client Basé sur un fichier primaire Basé sur URI
Kon­fi­gu­ra­tion Con­fi­gu­ra­tion centrale via HTTPd.conf Con­fi­gu­ra­tion dé­cen­tra­li­sée via via .htaccess   Con­fi­gu­ra­tion centrale via nginx.conf
Er­wei­te­rung­smö­gli­ch­kei­ten Modules statiques Modules dy­na­miques Modules statiques Modules dy­na­miques
Do­ku­men­ta­tion Allemand Anglais Danois Espagnol Français Japonais Coréen Por­tu­guais Turc Mandarin Anglais
As­sis­tance dé­ve­lop­peurs Non Oui (payant via Nginx, Inc.)
Community-Support Listes Mailing Wiki Listes Mailing Wiki

Bilan

Avec Apache et NGINX, les uti­li­sa­teurs disposent de deux projets open source stables et sécurisés. Cependant, ni l’un ni l’autre des deux serveurs Web ne sort vainqueur de cette com­pa­rai­son. Les deux projets sont basés sur des décisions de con­cep­tion fon­da­men­ta­le­ment dif­fé­rentes, qui apportent des avantages ou des in­con­vé­nients en fonction de l'uti­li­sa­tion du logiciel.

Le serveur HTTP Apache offre un immense ré­per­toire de modules qui, avec les options de con­fi­gu­ra­tion flexibles, ouvre de nombreux champs d’ap­pli­ca­tion pour le logiciel. Le serveur Web est considéré comme un logiciel standard pour les scénarii d’hé­ber­ge­ment mutualisé et con­ti­nuera à se défendre contre les serveurs Web légers tels que NGINX dans ce segment d'ac­ti­vité. La pos­si­bi­lité d'in­té­grer des in­ter­prètes pour des langages de pro­gram­ma­tion tels que PHP, Perl, Python ou Ruby di­rec­te­ment dans le serveur Web via des modules permet de livrer du contenu web dynamique sans serveur d’ap­pli­ca­tion séparé. Cela fait du serveur HTTP Apache une solution pratique pour les sites Web de petite et moyenne taille où le contenu est généré dy­na­mi­que­ment pendant la ré­cu­pé­ra­tion.

NGINX, en revanche, n’offre aucune pos­si­bi­lité de traiter du contenu Web dynamique en natif ou d'in­té­grer les in­ter­prètes cor­res­pon­dants par modules. Un serveur d'ap­pli­ca­tion séparé est donc toujours né­ces­saire. Ceci peut sembler être un effort sup­plé­men­taire inutile pour les sites Web de petite à moyenne taille. Cependant, une telle structure montre ses forces dans les grands projets Web et l'aug­men­ta­tion des volumes de trafic.

NGINX est gé­né­ra­le­ment utilisé en tant qu'équi­li­breur de charge face à un groupe de serveurs d'ap­pli­ca­tions. L’équi­li­breur de charge reçoit les demandes entrantes et, selon le type de demande, décide si elle doit être transmise à un serveur spé­cia­lisé en arrière-plan. Le contenu Web statique est livré di­rec­te­ment par NGINX. Cependant, si un client demande du contenu dynamique, l’équi­li­breur de charge transmet la demande à un serveur d’ap­pli­ca­tion dédié. Celui-ci in­ter­prète le langage de pro­gram­ma­tion, assemble le contenu demandé dans une page Web et le renvoie à l’équi­li­breur de charge qui, à son tour, le livre au client. De cette façon, les volumes de trafic élevés peuvent être gérés ef­fi­ca­ce­ment.

De plus, NGINX met en cache le contenu déjà livré pendant une certaine période de temps, de sorte que le contenu dynamique demandé à nouveau peut être livré di­rec­te­ment à partir de l'équi­li­breur de charge sans que NGINX ait à accéder à nouveau à un serveur d'ap­pli­ca­tion.

L’avantage de l’ex­ter­na­li­sa­tion de l’in­ter­pré­teur à un ou plusieurs serveurs backend séparés est que le réseau de serveurs peut fa­ci­le­ment être mis à l'échelle en ajoutant des serveurs backend sup­plé­men­taires ou en dé­sac­ti­vant des systèmes qui ne sont pas né­ces­saires. Dans la pratique, de nombreux uti­li­sa­teurs s'ap­puient sur la com­bi­nai­son de NGINX et d'Apache pour une telle con­fi­gu­ra­tion et utilisent donc les points forts des deux serveurs Web.

Aller au menu principal