Présentation
Les serveurs Web sont un élément fondamental d'Internet depuis les débuts du World Wide Web. Le logiciel de serveur Web reçoit les demandes des clients distants et fournit aux clients des pages Web stockées sur du matériel, tel que des serveurs dédiés.
Dans cet article de comparaison, vous découvrirez les différences entre les deux serveurs Web open source les plus populaires aujourd'hui :Apache et Nginx.
À propos du serveur Apache
Apache HTTP Server (ou Apache en abrégé) est un logiciel de serveur Web open source développé par Apache Software Foundation. Il a été initialement conçu comme un serveur Web basé sur des processus, mais à partir de la version 2.0 et de l'introduction des modules de traitement multiple, il peut être configuré à la fois comme un serveur basé sur des processus et sur des threads. L'architecture modulaire du serveur permet également des fonctionnalités telles que la gestion modulaire des protocoles.
Une autre caractéristique essentielle de l'architecture d'Apache sont les filtres, qui permettent aux modules d'interagir avec le contenu créé par d'autres modules. Cette interaction comprend le chiffrement, les analyses antivirus et la compression du contenu statique et dynamique.
Remarque : Le serveur HTTP Apache fonctionne mieux sous Linux. Découvrez comment installer Apache sur CentOS. Pour Ubuntu, lisez Comment installer le serveur Web Apache sur Ubuntu. Pour la gestion de base du serveur Web Apache, découvrez comment démarrer, arrêter et redémarrer Apache.
À propos du serveur Nginx
Nginx (prononcé moteur-x) est un serveur Web open source développé par Nginx, qui fait partie de F5, Inc.
En tant que serveur HTTP, Nginx utilise une architecture hautement évolutive pilotée par les événements (asynchrone) permettant des performances élevées et une faible empreinte mémoire.
Nginx peut également fonctionner comme un proxy inverse, un équilibreur de charge, un proxy de messagerie et un cache HTTP. Dans certains cas d'utilisation, Nginx sert également d'accélérateur Web ou de terminateur SSL/TLS.
Remarque : Comme Apache, Nginx est également le plus compatible avec Linux. Pour installer Nginx sur CentOS, reportez-vous à Comment installer Nginx sur CentOS. Pour l'installer sur Ubuntu, lisez Comment installer Nginx sur Ubuntu. Pour obtenir des instructions de base sur la gestion de Nginx, découvrez comment démarrer, arrêter et redémarrer Nginx.
Apache contre Nginx :un aperçu rapide
Ci-dessous un aperçu rapide des principaux points de comparaison entre Apache et Nginx.
Catégories | Apache | Nginx |
---|---|---|
Coût | Disponible gratuitement | Le produit principal, OSS Nginx, est disponible gratuitement. Nginx Plus est une option payante, offrant une assistance et des fonctionnalités supplémentaires. |
Licences | Licence Apache 2.0 | Licence BSD à 2 clauses |
Écrit en | C, XML | C |
Systèmes d'exploitation | Linux, Microsoft Windows, autres systèmes de type Unix, OpenVMS | Linux, macOS, Microsoft Windows, autres systèmes de type Unix, HP-UX, IBM AIX |
Architecture | Modulaire, basé sur les processus/thread | Modulaire, événementiel |
Configuration | Distribué | Centralisé |
Interprétation | Principalement basé sur des fichiers | Principalement basé sur l'URI |
Fonctionnalités | - Modules multi-traitements - Prise en charge de la configuration par répertoire - Proxy inverse avec mise en cache - Équilibrage de charge compatible IPv6 - Prend en charge HTTP/2 - Prise en charge XML Prise en charge FTP (avec un module séparé) | - Servir des fichiers statiques et d'index - Ouvrir le cache des descripteurs de fichiers - Proxy inverse accéléré avec mise en cache - Équilibrage de charge et tolérance aux pannes - IPv6 pris en charge, non activé par défaut - Prend en charge HTTP/2 - Proxy de messagerie - Mise en cache HTTP |
Assistance | - Documentation du serveur HTTP Apache - Liste des utilisateurs du serveur HTTP Apache - CRI - Débordement de pile - Support commercial par des prestataires tiers | - Liste de diffusion gérée par la communauté - CRI - Débordement de pile - Support officiel payant pour Nginx Plus |
Architecture
Le serveur HTTP Apache comporte un petit noyau de serveur et plusieurs modules. Les modules sont soit compilés statiquement, soit chargés dynamiquement.
Au démarrage, Apache démarre plusieurs processus serveur. Le but de ces processus est de partager la charge de travail. Le processus principal est le processus parent , tandis que d'autres sont des processus enfants . Chaque processus enfant crée un nombre prédéterminé de threads de serveur qui gèrent les requêtes entrantes.
Afin d'optimiser le serveur pour le système d'exploitation, Apache utilise le module de traitement multiple (MPM) . L'objectif de ce module est de se lier aux ports réseau, d'accepter les demandes et de gérer la gestion des demandes en affectant des processus enfants pour effectuer ces tâches. Apache installe le MPM le mieux adapté à l'environnement en fonction du système d'exploitation détecté et de ses capacités.
Les bibliothèques Apache Portable Runtime (APR) sont une autre partie importante d'un serveur Apache. Les APR fournissent une couche de système d'exploitation multiplateforme. Cette couche sert d'API universelle pour les développeurs, éliminant ainsi le besoin de coder autour de problèmes ou de fonctionnalités spécifiques à la plate-forme.
Nginx dispose d'une architecture basée sur les événements qui permet une mise à l'échelle facile sur du matériel moderne.
Comme Apache, Nginx a un processus principal maître . Le but de ce processus est de contrôler la liaison de port et la lecture de la configuration. Cependant, contrairement à Apache, les processus créés par le processus maître sont conçus sur la base d'un modèle de processus prévisible, dont l'objectif principal est de tirer le meilleur parti des ressources matérielles.
- Le chargeur de cache est un processus qui s'exécute au démarrage et charge le cache sur disque en mémoire.
- Le gestionnaire de cache s'assure que les entrées du cache disque respectent les limites de taille définies.
- Les processus de travail effectuer des opérations de lecture et d'écriture et gérer les connexions réseau.
Les processus de travail commencent par écouter et attendre les événements. Chaque fois qu'une nouvelle connexion entrante est demandée, un événement est lancé. Lors de l'établissement de la connexion, Nginx crée un descripteur de fichier qui n'occupe qu'une petite quantité de mémoire de processus de travail. Cette fonctionnalité rend Nginx nettement plus évolutif qu'Apache, qui utilise l'approche basée sur les processus, où chaque connexion distincte consomme une grande quantité de ressources.
Modules
Apache et Nginx utilisent tous deux des approches basées sur des modules. Cependant, la mise en œuvre est différente.
Apache propose des modules chargés dynamiquement qui peuvent être utilisés chaque fois que vous en avez besoin. Le serveur prend en charge de nombreux modules différents, officiels et tiers. Cela fait d'Apache une plate-forme très personnalisable que les utilisateurs peuvent adapter à leurs besoins.
Nginx les modules doivent être intégrés dans le noyau et ne peuvent pas être chargés dynamiquement. Pour inclure des modules non standard, les utilisateurs doivent compiler leur serveur à partir de la source. Bien que ce manque de flexibilité puisse sembler limitant, cela signifie également une meilleure sécurité car permettre l'intégration dynamique de modules pose des problèmes de sécurité.
Performances
En utilisant une variété de modules de multitraitement pris en charge, Apache peut fonctionner en trois modes :
- Mode basé sur les processus.
- Processus hybride et mode thread.
- Mode événement hybride.
L'utilisateur peut configurer Apache d'une manière qui répond à ses besoins. Ainsi, les ressources du serveur sont utilisées efficacement pour un cas d'utilisation particulier.
Apache propose un ensemble d'optimisations pour augmenter son débit et son évolutivité. Certaines de ces optimisations font partie de la configuration par défaut du serveur, et les administrateurs de serveur peuvent configurer le reste en fonction des besoins spécifiques de leur système. Le réglage des performances peut résoudre de nombreux problèmes de configuration d'exécution et de compilation d'Apache.
Nginx est un serveur Web créé spécifiquement pour surpasser Apache. Il réussit à le faire dans plusieurs catégories, telles que le temps de connexion, le nombre de requêtes reçues par seconde, le taux de transfert et le temps passé à traiter une requête.
Les administrateurs de serveur peuvent optimiser les performances de Nginx en modifiant la configuration du serveur pour l'adapter aux spécifications du système. L'ajustement des processus de travail et des connexions, l'activation de la compression Gzip et la mise en cache des fichiers statiques améliorent considérablement les performances de Nginx.
Contenu statique ou dynamique
Apache traite à la fois le contenu statique et dynamique en utilisant des modules chargés dynamiquement et ne dépend pas de composants externes.
Alors que les deux serveurs affichent des performances similaires en matière de chargement de contenu dynamique, Nginx utilise beaucoup moins de mémoire et gère environ quatre fois plus de requêtes par seconde pour servir des fichiers statiques. Cela est principalement dû au fait que l'interpréteur de contenu dynamique ne fait pas partie intégrante d'un serveur Nginx. Au lieu de cela, le serveur transmet toutes les demandes de pages Web dynamiques à un processus externe, attend que le processus renvoie le contenu, puis fournit le contenu au client. Bien que cela complique le traitement des pages dynamiques, cela simplifie le processus de diffusion des pages statiques.
Configuration distribuée vs centralisée
Apache configuration est distribuée. Le serveur prend en charge un fichier .htaccess pour faciliter ce type de configuration.
Le .htaccess
file est un fichier de configuration au niveau du répertoire pris en charge par plusieurs serveurs Web, utilisé pour traiter les problèmes d'accès au site Web, tels que la redirection d'URL, le raccourcissement d'URL, le contrôle d'accès (pour différentes pages Web et fichiers), etc. Le principal avantage de cette approche est que les modifications apportées dans .htaccess
sont immédiatement appliqués au système. La modification du fichier de configuration principal nécessite un redémarrage du système pour appliquer les modifications.
De plus, sur les serveurs qui hébergent plusieurs sites Web, .htaccess
permet à chacun des utilisateurs d'apporter des modifications à la configuration de son site Web sans altérer le fichier de configuration principal du serveur.
Nginx la configuration est centralisée et ne supporte pas .htaccess
. La raison en est que l'utilisation de .htaccess
présente également plusieurs inconvénients. Un élément important est la perte de performances - chaque fois qu'un serveur reçoit une requête HTTP, il doit vérifier tous les répertoires parents qui peuvent héberger un .htaccess
fichier, pour voir s'ils le contiennent. Une autre préoccupation importante est la sécurité. Autoriser les utilisateurs non privilégiés à modifier la configuration du serveur peut être dangereux s'il n'est pas correctement mis en œuvre.
Puisqu'il n'y a pas de configuration au niveau du répertoire dans Nginx, les utilisateurs effectuent toutes les modifications de configuration en écrivant des directives dans le fichier de configuration principal, nginx.conf
. Les modifications sont appliquées après le rechargement du serveur.
Architecture de gestion des connexions
Apache gère les demandes des clients en utilisant ses modules multi-traitement. Le principal avantage de ceci est que l'architecture de gestion des connexions peut être remplacée sans effort chaque fois que nécessaire. Ces modules sont :
mpm_prefork_module
– Le module prefork crée des processus avec un thread pour chaque requête à traiter. Chaque processus enfant peut prendre en charge une connexion. Bien que le nombre de processus créés soit supérieur au nombre de requêtes, ce module fonctionne bien. Le principal problème des modules est que les volumes de requêtes importants affectent négativement les performances et augmentent considérablement la consommation de RAM.mpm_worker_module
– Le module de travail crée des processus enfants. Chaque processus enfant gère plusieurs threads, chaque thread prenant en charge une connexion. Étant donné que les threads sont plus efficaces que les processus, ce module est plus performant que le module prefork.mpm_event_module
– Le module événement dispose d'un mécanisme similaire au mécanisme du module travailleur. Cependant, il tente également de résoudre le problème "garder en vie ' problème - le fait qu'Apache, après avoir terminé la première demande du client, garde l'ensemble du processus ou du thread enfant en attente de nouvelles demandes par le client. Le module d'événement traite ce problème en faisant en sorte qu'un thread d'écoute désigné surveille l'état des sockets.
Nginx gère les connexions à l'aide d'un algorithme asynchrone, non bloquant et piloté par les événements. À l'aide d'une fonction de boucle rapide, les processus de travail du serveur peuvent gérer de nombreuses connexions en même temps en recherchant et en traitant en permanence des événements.
Lorsqu'un agent établit une connexion, la connexion rejoint la boucle d'événements, où elle subit un traitement asynchrone. Lorsque la connexion se ferme, elle quitte la boucle. Ce type de gestion des connexions permet à Nginx d'évoluer et d'utiliser les ressources de manière économique.
Interprétation basée sur fichier vs URI
Apache interprète principalement les requêtes comme des ressources de système de fichiers, en utilisant Directory
et File
blocs. Le serveur commence par DocumentRoot
et essaie de localiser le fichier en utilisant la partie de la requête suivant l'hôte et le numéro de port.
Apache propose d'autres moyens de servir la requête lorsque la bonne correspondance ne peut pas être trouvée en passant par le système de fichiers :
Alias
mappe les URL aux emplacements du système de fichiers. Il permet de stocker les documents ailleurs que dansDocumentRoot
.Redirect
mappe une ancienne URL dans une nouvelle URL. Le serveur demande au client de trouver la ressource recherchée à un autre emplacement.Location
les blocs permettent de travailler avec des URI.
Contrairement à Apache, dont la conception reflète principalement les besoins d'un serveur Web, l'architecture Nginx permet d'utiliser le serveur comme proxy. Par conséquent, Nginx traite principalement des URI.
Nginx utilise les blocs de serveur et d'emplacement comme blocs de configuration principaux :
- Un bloc serveur est un sous-ensemble du fichier de configuration qui définit le serveur virtuel pour la gestion des requêtes. Étant donné que les serveurs virtuels peuvent être affectés pour gérer des types de connexion spécifiques, les administrateurs de serveur peuvent affecter différents blocs pour différents noms de domaine, ports et adresses IP.
- Un bloc de localisation fait partie d'un bloc de serveur qui gère les requêtes pour diverses ressources et URI. Il achemine les requêtes vers l'emplacement correct dans le système de fichiers.
Étant donné que plusieurs blocs peuvent agir comme des instances de serveur Web individuelles, Nginx dispose d'un système pour trouver la meilleure correspondance pour chaque demande. Ceci est effectué en utilisant le listen
directive, qui trouve les correspondances de bloc possibles, et le server_name
directive, qui choisit la meilleure correspondance.
Lorsque Nginx fonctionne avec des fichiers statiques, il mappe les requêtes sur le système de fichiers. Cependant, le serveur n'effectue cette opération qu'après avoir sélectionné les blocs de serveur et d'emplacement et connecté la racine du document et l'URI. Le fait que Nginx ne traite pas le système de fichiers tant qu'il n'est pas prêt à répondre à la demande est l'une des raisons pour lesquelles il ne comporte pas de .htaccess
fichier équivalent.
Mise en cache
Apache offre la mise en cache pour améliorer les performances d'un serveur. Il existe trois types de mise en cache :
- Mise en cache HTTP RFC2616 à trois états offre une mise en cache intelligente compatible HTTP lorsqu'il s'agit de contenu proxy ou de contenu dynamique stocké localement.
- Mise en cache d'objet partagé clé/valeur à deux états offre un cache d'objets partagés basé sur des clés/valeurs.
- Mise en cache de fichiers spécialisée permet de précharger les fichiers au démarrage, améliorant ainsi les temps d'accès aux fichiers fréquemment utilisés.
Nginx accélère les temps de chargement et réduit la charge du serveur en mettant en cache le contenu dynamique pour un accès rapide. Bien que la mise en cache aide à accélérer les sites Web avec un trafic et un volume de contenu élevés, elle n'est pas recommandée dans d'autres scénarios.
La mise en cache de base dans Nginx n'utilise que deux directives :
proxy_cache_path
pour définir le chemin et la configuration du cache etproxy_cache
pour activer le cache.
Une fonctionnalité utile de Nginx est la possibilité de configurer le serveur pour afficher le contenu du site Web mis en cache lorsque le serveur est en panne ou occupé.
Sécurité
Apache et Nginx sont tous deux considérés comme sécurisés. Les risques de sécurité potentiels proviennent principalement d'une mauvaise configuration. Par conséquent, suivez les meilleures pratiques de sécurité du serveur Web pour améliorer la sécurité :
Pour Apache :
- Ajustez la configuration pour empêcher les attaques DoS. Certaines des directives pertinentes pour cela sont
RequestReadTimeout
,KeepAliveTimeout
, etTimeOut
. - Ajuster les autorisations sur
ServerRoot
répertoires. - Soyez prudent avec les inclusions côté serveur (SSI).
- Soyez prudent avec les scripts CGI.
- Protéger les paramètres système contre
.htaccess
remplace en configurant le fichier de configuration du serveur. - Surveillez vos journaux.
- Maintenir le serveur à jour.
Pour Nginx :
- Réduire le risque d'exploitation de vulnérabilités potentielles en désactivant les modules indésirables.
- Désactiver les
server_tokens
directive, qui rend votre version Nginx visible publiquement. - Désactivez les méthodes HTTP inutiles.
- Contrôlez les ressources et les limites pour prévenir les attaques DoS potentielles.
- Configurez, configurez et surveillez les journaux d'accès et d'erreurs pour mieux comprendre l'état du serveur.
- Inclure des en-têtes de sécurité.
- Maintenir le serveur à jour.
Assistance et documentation
Apache offre un support communautaire via la liste de diffusion des utilisateurs du serveur HTTP Apache. Le support est également disponible sur les canaux IRC dédiés, Stack Overflow, etc.
La documentation Apache HTTP Server propose des manuels de référence, des guides de l'utilisateur, des didacticiels et d'autres documents.
Nginx offre un support communautaire, composé d'une liste de diffusion gérée par la communauté et d'un forum, ainsi que d'autres ressources de support telles que le guide d'administration et le guide de référence des modules. Un support commercial est disponible pour l'option payante, NGINX Plus.
La documentation Nginx open source comprend des instructions d'installation, des procédures, des guides de développement, des références de modules et d'autres documents.
Apache ou Nginx
Les dernières données de recherche sur les parts de marché montrent qu'Apache est légèrement en avance sur Nginx.
Cependant, si nous ne regardons que les 1000 sites Web les mieux classés, Nginx est en avance par une large marge.
Apache et Nginx sont tous deux des serveurs raffinés et performants. Lorsque vous choisissez le bon serveur à installer sur votre matériel, vous devez tenir compte de l'utilisation que vous en ferez.
Choisissez Apache plutôt que Nginx si :
- Dans votre cas d'utilisation, il est préférable que les utilisateurs non privilégiés contrôlent leurs sites Web. L'un de ces cas est la gestion d'un environnement d'hébergement partagé, dans lequel le
.htaccess
d'Apache devient pratiquement indispensable. - Vous avez besoin de certains modules que Nginx ne prend pas en charge.
Choisissez Nginx plutôt qu'Apache si :
- Votre scénario d'utilisation inclut principalement (ou exclusivement) la diffusion de contenu statique.
- Vous vous attendez à un volume de trafic élevé sur votre site Web.
Quand utiliser à la fois Nginx et Apache
Apache et Nginx peuvent être utilisés côte à côte pour créer un serveur optimisé pour la charge de travail. Nginx est configuré pour agir comme un proxy inverse pour Apache, qui tire parti de la vitesse de traitement de Nginx et de sa capacité à gérer de gros volumes de trafic. Nginx traite et diffuse le contenu statique tout en transférant le contenu dynamique à Apache.
En laissant Nginx trier les requêtes et traiter celles qu'il peut gérer seul, Apache reçoit un plus petit volume de requêtes. Cela résout de manière préventive les problèmes de surcharge potentiels. Étant donné que Nginx peut communiquer avec un pool de serveurs dans le backend, l'ajout de serveurs supplémentaires et la mise à l'échelle peuvent être effectués facilement.