Introduction à Apache et Nginx
Les serveurs web et les protocoles sont conçus pour permettre aux utilisateurs de visualiser des pages web. Ils envoient une requête pour afficher un document qui est acceptée par le serveur. L'hôte fournit ensuite essentiellement le document ou l'information à l'utilisateur. Le serveur web joue un rôle central pour vous permettre de visualiser et d'accéder aux pages web sur votre navigateur.

Serveur web facilitant la communication entre le client et les serveurs d'applications
Il existe de nombreux serveurs web que vous pouvez utiliser à cette fin. Parmi les plus populaires, on trouve Nginx et Apache. En fait, ces serveurs hébergent la plupart des sites web actuellement disponibles sur Internet.
Apache et Nginx sont assez similaires à bien des égards. Pour commencer, les deux serveurs web sont open-source. Cela signifie que n'importe qui dans le monde peut les utiliser tout à fait gratuitement. Mais il existe de nombreuses fonctionnalités propres à chacun de ces serveurs. Ces caractéristiques particulières les rendent plus adaptés à diverses applications et utilisations.
Pour vous aider à décider quel serveur web est supérieur ou idéal pour vous, nous allons comparer Nginx et Apache. La comparaison sera effectuée sur un certain nombre de paramètres essentiels qui sont cruciaux pour les utilisateurs des serveurs web. Commençons !
Présentation générale
Nous commencerons par un aperçu général des deux serveurs web. Apache et Nginx ont tous deux acquis une excellente réputation au sein de la communauté. Ils sont salués pour leurs performances et utilisés par plusieurs organisations de premier plan à travers le monde.
Apache
Apache est sorti en 1995. Robert McCool a développé ce serveur HTTP sous la Apache Software Foundation, d'où son nom. Depuis sa sortie, des centaines de milliers de personnes à travers le monde utilisent Apache.
Sa grande popularité signifie que de nombreux logiciels et sources tiers collaborent fréquemment avec lui. Ainsi, si vous recherchez un bon réseau de support avec de nombreuses intégrations, Apache est fait pour vous. Apache est également préféré par beaucoup de personnes car il est plus dynamique et flexible. Il offre également un plus large éventail de langages qu'il peut interpréter.
Nginx
Nginx est un serveur web relativement plus récent, sorti en 2004. Il est le résultat des efforts d'Igor Syosev pour faire face à ce que l'on appelle aujourd'hui le problème C10K. Ce problème est apparu lorsqu'il a commencé à devenir difficile pour les serveurs de gérer de grandes quantités de trafic. À mesure que de plus en plus de personnes commençaient à utiliser Internet, les serveurs de sites web ont commencé à être submergés. L'incapacité de ces serveurs à gérer plusieurs milliers de connexions en même temps a provoqué le plantage et la panne des sites.
Nginx a été conçu pour tenter de résoudre ce problème. C'est pourquoi son architecture présente une conception incroyablement légère, capable de fonctionner avec des ressources et du matériel limités. Bien qu'il soit le plus adapté pour fonctionner avec du contenu statique, il peut également s'intégrer à des logiciels capables de gérer de manière appropriée le contenu dynamique.
Capacités de gestion du trafic
Maintenant que nous avons une idée de base de chacun de ces serveurs, nous pouvons entrer plus en détail. La première caractéristique par laquelle nous allons commencer est la capacité de gestion du trafic de chaque serveur. C'est l'un des points majeurs qui sépare ces deux plateformes. Leurs architectures fonctionnent sur des principes différents lorsqu'il s'agit de gérer plusieurs connexions simultanément.
Apache
Apache utilise ce que l'on appelle MPM - Modules multi-processus. Les administrateurs utilisent une variété de MPM pour manipuler et modifier l'architecture de gestion des connexions. Une partie de l'attrait du serveur web Apache réside dans la flexibilité offerte par son architecture. Une telle infrastructure basée sur des modules, qui divise le traitement en threads individuels et en groupes de threads, facilite la mise à l'échelle et l'adaptation à différents types de connexions.
Jetons un coup d’œil à certains des modules individuels utilisés dans Apache :
- mpm_prefork
Le premier est mpm_prefork. Il s'agit d'un module de traitement chargé de gérer les requêtes entrantes des visiteurs. Il crée un thread ou un processus fils pour gérer une connexion à un moment donné. Cela signifie que si le nombre de requêtes est inférieur au nombre de processus, mpm_prefork est assez efficace dans sa fonction.
Les requêtes sont traitées rapidement car un processus fils distinct traite chacune d'elles individuellement. Mais cela signifie également que si le nombre de requêtes dépasse le nombre de processus, cela peut ralentir considérablement les choses. Par conséquent, l'étape de traitement des requêtes consomme beaucoup de RAM.
- mpm_worker
Comme nous le savons déjà, un thread est responsable d'une connexion. Ce module va encore plus loin et vous permet de gérer plusieurs threads à la fois. C'est un module beaucoup plus évolutif par rapport à mpm_prefork qui éprouve des difficultés au-delà d'un certain seuil. Les nouvelles connexions peuvent se connecter immédiatement à un thread au lieu de devoir attendre.
- mpm_event
Mpm_event est responsable du maintien des connexions persistantes (keep-alive). Le but principal de ce module est d'éviter que le système ne soit ralenti par les requêtes keep-alive. Il y parvient en attribuant un thread à une connexion même en l'absence de requête active. Le thread restera dédié tant que la connexion est active. Toutes les requêtes entrantes sont transférées vers des threads inoccupés.
Nginx
Contrairement à Apache, Nginx a été conçu dans un but très précis. Nous connaissions déjà les problèmes de connexion et d'évolutivité à ce niveau. C'est pourquoi il utilise un algorithme asynchrone et non bloquant. Il ne dédie pas de threads individuels à chaque connexion. Au lieu de cela, Nginx produit de nombreux processus de travail (worker processes) capables de gérer des milliers de connexions à la fois.
Le principe de fonctionnement de l'architecture de Nginx est le mécanisme de boucle rapide (fast looping). Cet algorithme traite et surveille constamment les événements. Cela signifie que les processus sont pilotés par les événements et que chaque processus de travail n'est dédié qu'à ses propres connexions. Toutes les connexions d'un processus de travail sont situées dans une boucle d'événements (event loop). Ici, elles coexistent et sont traitées de manière asynchrone avec les autres connexions de ce processus de travail particulier.
Le principal avantage d'une telle architecture est qu'elle permet une grande capacité d'évolutivité. Cela devient particulièrement applicable si vous disposez de ressources limitées ou si vous souhaitez travailler avec un matériel minimal. Même si vous rencontrez d'importants volumes de trafic, l'impact sur l'utilisation de la RAM sera minime. En effet, vous ne générez pas de threads individuels pour chaque connexion.
Gestion du contenu statique et dynamique
Un autre paramètre que nous pouvons utiliser pour comparer les deux serveurs web est la façon dont ils gèrent le contenu statique et le contenu dynamique.
Apache
Apache utilise une méthode basée sur les fichiers pour gérer le contenu statique. Son système de traitement MPM lui permet de fonctionner avec cette méthode conventionnelle.
Lorsqu'il s'agit de traiter du contenu dynamique, Apache peut le faire sans l'aide de composants externes. Vous pouvez activer les processeurs dynamiques en chargeant un module. Ce module traitera le contenu en analysant le langage, puis en intégrant le processeur approprié dans le worker.
Le principal avantage de ne pas avoir à utiliser de composants externes pour traiter le contenu dynamique est évident lors de la configuration et de la coordination. Il est beaucoup plus facile de coordonner uniquement les composants internes entre eux.
Nginx
La plus grande différence entre la façon dont Apache et Nginx gèrent le contenu est que Nginx est tout simplement incapable de traiter le contenu dynamique en interne. Il doit être associé à un composant externe pour traiter les requêtes de contenu dynamique. Cela signifie que vous devrez utiliser votre serveur Nginx en conjonction avec un processeur externe. Le composant recevra la requête de PHP/contenu dynamique, la traitera, puis la renverra au serveur.
Puisque les informations doivent être relayées entre les deux composants, vous devrez coordonner la communication entre eux. Vous devrez déterminer le nombre de connexions que vous souhaitez autoriser et configurer le protocole. Vous devrez utiliser le protocole qui peut être lu et compris par Nginx, tel que HTTP, FastCGI, SCGI, uWSGI ou memcache, entre autres.
D'un autre côté, Nginx gère très bien le contenu statique. Il a besoin de l'aide de sources externes pour ce faire. Il n'activera également l'interpréteur que lorsqu'il en aura besoin. C'est l'un des avantages de l'utilisation de Nginx. L'interpréteur n'est pas intégré au processus. Cela signifie qu'il ne sera présent que pour le traitement du contenu dynamique.
Répertoires de contenu : configuration distribuée vs centralisée
Chaque serveur web a son propre répertoire de contenu. L'un des paramètres les plus critiques pour juger Apache et Nginx est de savoir s'ils permettent ou non une configuration au niveau du répertoire.
Apache
Il existe certains fichiers cachés dans les répertoires de contenu qui contiennent des directives. Ce sont les fichiers .htaccess. Avec Apache, vous pouvez interpréter ces directives par répertoire. Ainsi, lorsque vous envoyez une requête, Apache inspectera le chemin d'accès au fichier pour trouver un fichier .htaccess. Lorsqu'il le trouve, il interprète et applique immédiatement les directives qu'il contient. Apache ne redémarrera pas le serveur pour appliquer ces directives.
Le processus défini ci-dessus permet une configuration décentralisée des répertoires dans le serveur web. La configuration décentralisée est utile pour les réécritures d'URL, la mise en œuvre de restrictions d'accès, la confirmation des autorisations et la définition des politiques de mise en cache.
L'un des avantages du fichier .htaccess est que l'utilisateur, qui ne dispose pas d'authentification, peut contrôler et modifier au moins certains aspects du contenu qu'il consulte dans son navigateur. C'est pourquoi Apache est fréquemment utilisé par les hébergeurs partagés. Les fournisseurs de services ont un accès autorisé à la configuration centrale. Les clients sont en mesure d'exercer un contrôle sur certains répertoires sans avoir accès à la configuration principale.
Si vous le souhaitez, il vous est possible de désactiver l'interprétation du .htaccess dans Apache.
Nginx
Contrairement à Apache, Nginx ne fonctionne pas avec les fichiers .htaccess. Cela le rend comparativement moins flexible. Cependant, Nginx apporte à la place un certain nombre d'améliorations dans son style de configuration. Pour commencer, il est capable de traiter les requêtes à un rythme beaucoup plus rapide qu'Apache. En effet, il ne recherche pas, ne lit pas, n'interprète pas et n'applique pas chaque fichier .htaccess qu'il trouve sur son chemin. Au lieu de rechercher dans chaque répertoire parent, Nginx ne fait qu'une seule recherche de répertoire pour une requête.
De plus, Nginx présente un avantage majeur en matière de sécurité par rapport à Apache. Nginx ne cède aucune partie de la configuration des répertoires de contenu à des utilisateurs individuels, contrairement à Apache. Bien que vous puissiez maintenir des mesures de sécurité strictes, qui dit que les utilisateurs individuels sont capables de faire de même ? Avec Nginx, vous conservez le contrôle sur l'état de sécurité et la configuration de l'ensemble du réseau de répertoires.
Interprétation des requêtes
Une autre façon de différencier les deux serveurs est la manière dont ils interprètent les requêtes.
Apache
Lorsque le serveur reçoit une requête, il l'interprète puis la connecte aux ressources système correspondantes. Il interprète la requête soit comme une ressource physique sur le système de fichiers, soit comme un URI emplacement.
Lors de l'interprétation en tant que ressource physique, il utilise les blocs <Directory> ou <Files> . C'est la méthode d'interprétation par défaut du serveur. Il prend la racine du document. Ensuite, il suit l'hôte et le numéro de port dans la requête pour trouver le fichier correspondant dans l'arborescence du document.
L'emplacement de l'URI, en revanche, nécessite une évaluation abstraite. Apache utilise donc les blocs <Location> pour les ressources abstraites au lieu de travailler avec le système de fichiers.
Il existe un certain nombre d'autres alternatives à l'utilisation du système par défaut basé sur les fichiers, en dehors des URI. Par exemple, vous pouvez utiliser la directive Alias pour trouver un emplacement alternatif vers lequel effectuer la correspondance. Vous pouvez également utiliser des variantes d'expression pour rendre la configuration du système de fichiers plus flexible.
Nginx
Là où Apache est né pour être un serveur web, Nginx joue un double rôle de serveur web et de serveur proxy. C'est pourquoi, au lieu de s'orienter vers le système de fichiers, Nginx préfère travailler avec des URI. Vous pouvez visualiser cette préférence par le fait qu'il n'y a aucun moyen de spécifier une configuration pour un répertoire du système de fichiers dans Nginx. Il peut cependant effectuer la conversion vers le système de fichiers si et quand cela est nécessaire.
Server et location sont les blocs de configuration principalement utilisés dans Nginx. Le premier interprète l'hôte demandé. Le second fait correspondre les parties de l'URI après l'hôte et le port. Par conséquent, le serveur interprète la requête comme un emplacement d'URI plutôt que comme un fichier réel sur le système.
En raison de son système d'interprétation basé sur les URI, Nginx est capable de remplir son rôle de serveur web, de serveur proxy et de serveur de messagerie. Comme il ne fait pas référence au système de fichiers lors de l'interprétation de la requête, il est compréhensible qu'il n'implémente pas non plus de fichiers .htaccess.
Systèmes de modules
Bien qu'Apache et Nginx proposent tous deux des systèmes de modules de support pour les extensions, il existe des différences majeures dans leur fonctionnement interne.
Apache
Avec Apache, vous pouvez charger et décharger dynamiquement des modules lors de l'exécution du serveur. Le cœur reste au centre des processus et les modules servent à étendre les fonctionnalités. Vous pouvez utiliser ces modules rattachables pour accomplir un certain nombre de tâches. Les options sont pratiquement infinies grâce à la vaste bibliothèque d'Apache.
En fait, vous pouvez même modifier le fonctionnement du cœur du serveur en utilisant des modules comme mod_php. Comme nous l'avons mentionné précédemment, ce module vous permet d'intégrer un interpréteur PHP dans les processus de travail individuels. Cela est utile lorsque vous devez traiter du contenu dynamique.
But the story does not end there. You can also add modules to enable functions such as client authentication, server hardening, caching, URL rewriting, proxies, rate limiting, compression, as well as encryption.
Nginx
Le système de modules de Nginx est différent dans le sens où vous ne pouvez pas charger dynamiquement les modules sur le serveur principal. Au lieu de cela, ils doivent être rassemblés et compilés sur le logiciel de base. Cela laisse beaucoup à désirer en termes de flexibilité et de facilité d'utilisation. Bien que les paquets de distribution contiennent certains modules courants, vous devrez compiler le serveur pour d'autres modules. Par conséquent, vous devez savoir comment maintenir votre logiciel compilé en dehors du système de paquets traditionnel.
Quoi qu'il en soit, l'avantage de ce système de modules non standard est qu'il vous offre un haut degré de spécificité. Vous pouvez personnaliser vos modules en n'incorporant que les fonctionnalités dont vous avez besoin. Cela vous permet de laisser de côté les composants inutiles et de vous prémunir contre les risques de sécurité par la même occasion. En même temps, vous pouvez accomplir les mêmes tâches avec les modules Nginx qu'avec Apache. Celles-ci incluent la réécriture d'URL, la journalisation, l'authentification, etc.
Écosystème et support
Les intégrations et le support logiciel sont très importants lorsqu'il s'agit de serveurs web. Ensuite, nous explorerons la compatibilité et le support disponibles pour Apache et Nginx.
Apache
Apache est une plateforme plus ancienne et plus populaire. Il est donc compréhensible qu'elle dispose d'une plus large gamme d'outils et de logiciels de support par rapport à Nginx. Une multitude de documentations tierces est à votre disposition pour soutenir le serveur de base. De plus, vous pouvez également l'associer à d'autres logiciels pour accomplir des tâches spécifiques. Vous pouvez ajouter ces outils soit à votre projet, soit à votre paquet. Ils s'intègrent facilement au sein de l'écosystème Apache.
Nginx
Bien que Nginx soit derrière Apache à cet égard, il fait certainement de son mieux pour rattraper son retard. De plus en plus de personnes adoptent Nginx à mesure qu'elles réalisent tout son potentiel. Le support pour la plateforme continue de croître parallèlement à sa croissance organique en tant que serveur web utile et rapide.
L'un des principaux obstacles au support que Nginx a dû surmonter a été de trouver de la documentation en anglais. En effet, la majeure partie de Nginx a été écrite à l'origine en russe, y compris la plupart de sa documentation. Cependant, à mesure que le serveur s'est répandu et est devenu plus célèbre, de nombreuses ressources tierces sont désormais disponibles dans la langue universelle.
Une solution collaborative ?
À présent, vous comprenez beaucoup mieux les composants essentiels et le fonctionnement interne d'Apache et de Nginx. Bien qu'ils soient assez différents l'un de l'autre, certains utilisateurs tirent parti de ce fait pour tirer le meilleur des deux mondes. C’est exact : il vous est possible d'utiliser Apache et Nginx ensemble.
Classiquement, les utilisateurs ont tendance à utiliser Nginx comme un proxy inverse et à le placer devant Apache. Cela permet de compenser le manque de rapidité d'Apache dans le traitement et la gestion des requêtes. Nginx reçoit et gère toutes les requêtes au maximum de sa vitesse. Il vous permet également de traiter rapidement un grand nombre de requêtes simultanées sans avoir à investir beaucoup de ressources.
Une autre fonctionnalité de Nginx dont les utilisateurs tirent parti est sa capacité à gérer efficacement le contenu statique. Pour compenser le fait que Nginx a besoin d'un composant externe pour traiter le contenu dynamique, nous pouvons rediriger PHP et les autres requêtes concernées vers Apache via un proxy. Apache convertira la requête en page web et la renverra à Nginx afin qu'il puisse la servir au client.
Voici quelques ressources que vous pouvez trouver sur notre blog pour vous aider à démarrer avec les deux serveurs web :
Apache
- Installer le serveur Apache sur Ubuntu 18.04 : un guide pratique
- Configuration des hôtes virtuels Apache sur Ubuntu 20.04
- Comment installer la pile Linux, Apache, MySQL, PHP (LAMP) sur CentOS 7
- Sécuriser Apache avec Let’s Encrypt sur Ubuntu 18.04
Nginx
- Installer Nginx sur Ubuntu 18.04
- Automatiser le renouvellement des certificats SSL LetsEncrypt pour Nginx
- Comment sécuriser Nginx avec Let’s Encrypt sur Ubuntu 20.04
- Comment installer la pile LEMP (Linux, Nginx, MySQL PHP) sur Ubuntu 20.04
Conclusion
En fin de compte, Apache et Nginx ont tous deux leurs forces et leurs faiblesses. Il n'y a pas de règles strictes ni de recommandations absolues quant au serveur que vous devriez utiliser pour votre projet. Vous êtes le mieux placé pour juger de ce qui convient le mieux à votre application en fonction de vos besoins uniques.
Vous devez identifier les aspects et fonctionnalités sur lesquels vous ne pouvez pas faire de compromis et choisir en conséquence. Si la décision est difficile à prendre, vous pouvez toujours choisir d'utiliser les deux serveurs ensemble dans une solution personnalisée.
Bonne informatique !
Commentaires
Aucun commentaire pour l'instant. Soyez le premier.