Apache vs nginx : leurs différences et comment convertir la config
Apache vs nginx
Apache vs nginx : processus, .htaccess et conversion de config | We.Inc
Apache et nginx comparés sur la gestion des connexions, le .htaccess par dossier face à la config centrale, les rechargements et le proxy, avec un convertisseur pour les règles rewrite courantes.
Ce sont deux serveurs web open source éprouvés. Apache charge des modules dans un modèle de processus au choix (prefork, worker ou event) et laisse chaque dossier surcharger des réglages avec des fichiers .htaccess. nginx exécute un processus maître et quelques workers pilotés par événements, ne lit que sa config centrale, et se place souvent devant des serveurs d'application comme reverse proxy.
Apache et nginx côte à côte
Sujet
Apache httpd 2.4
Gestion des connexions
Choisissez un MPM : prefork, worker ou event (event est le choix par défaut habituel sur les Unix modernes)
Un processus maître plus des processus workers utilisant un modèle événementiel
Config par dossier
Fichiers .htaccess, si AllowOverride le permet (None par défaut)
Aucune : tout se trouve dans les fichiers de config principaux
upstream : round robin, least_conn, ip_hash, hash, random
Tester et recharger
apachectl configtest, puis apachectl graceful
nginx -t, puis nginx -s reload
Choisir entre les deux revient surtout à savoir où vit la configuration et qui a le droit de la modifier. Cette page laisse de côté les benchmarks, qui dépendent entièrement de la charge et des réglages, et se concentre sur les différences que vous rencontrez en faisant tourner un site : comment chaque serveur gère les connexions, pourquoi .htaccess existe, et comment se convertissent les règles rewrite que vous avez déjà. Utilisez le convertisseur pour voir la version nginx d'une règle Apache familière.
Choisissez une tâche dans le convertisseur, comme forcer HTTPS ou envoyer tout chemin inconnu vers index.html.
Tapez votre propre domaine pour que les deux versions soient prêtes à coller.
Placez la version Apache dans le virtual host ou le .htaccess, ou la version nginx dans le bloc server correspondant.
Testez avant de recharger : apachectl configtest pour Apache, nginx -t pour nginx.
Sous Apache, préférez la config principale du serveur au .htaccess quand vous contrôlez la machine. La documentation d'Apache le dit clairement, car autoriser .htaccess oblige httpd à chercher le fichier dans chaque dossier du chemin de chaque requête.
Dans nginx, un bloc if qui teste l'hôte s'écrit presque toujours mieux comme un bloc server séparé avec return 301.
Remplacez les chaînes de vérifications de fichiers RewriteCond par une seule ligne try_files ; nginx vérifie les chemins listés dans l'ordre.
N'oubliez pas que les lignes add_header de nginx ne sont pas héritées dans un bloc qui définit son propre add_header. Répétez les en-têtes de sécurité dans chaque location qui définit un en-tête.
Faire tourner les deux est courant : nginx en frontal pour le TLS et les fichiers statiques, qui transmet les requêtes dynamiques à Apache sur un port local.
Questions fréquentes
nginx est-il plus rapide qu'Apache ?
Cela dépend de la tâche et des réglages, alors méfiez-vous de tout chiffre unique. Les workers événementiels de nginx sont conçus pour maintenir à moindre coût de nombreuses connexions inactives. Le MPM event d'Apache a réduit cet écart en utilisant lui aussi un polling thread-safe. Mesurez votre propre charge avant de changer pour la seule vitesse.
nginx prend-il en charge les fichiers .htaccess ?
Non. nginx n'a pas de fichiers de surcharge par dossier, donc les règles d'un .htaccess doivent être déplacées dans la configuration du serveur, puis nginx rechargé. C'est un compromis délibéré : aucune recherche de fichier à chaque requête, mais seules les personnes ayant accès à la config principale peuvent modifier les règles.
Puis-je convertir un .htaccess en nginx automatiquement ?
Les redirections et fallbacks simples se convertissent proprement, comme le montre le convertisseur de cette page. Les longues chaînes de RewriteCond avec des flags comme [P] ou des variables d'environnement doivent être relues par une personne, car nginx exprime la même intention avec d'autres briques.
Lequel choisir pour un site WordPress ou PHP ?
Si votre hébergeur ne vous donne qu'un accès aux fichiers, Apache avec .htaccess est ce qui vous permet tout simplement de modifier les règles. Sur un serveur que vous contrôlez, les deux fonctionnent avec PHP-FPM ; dans nginx, vous écrivez une seule fois le fallback des URL propres avec try_files dans le bloc server.
Comment recharger la config sans couper les connexions ?
Pour nginx, lancez nginx -s reload : le maître vérifie la nouvelle config, démarre de nouveaux workers et demande aux anciens de terminer proprement. Pour Apache, apachectl graceful fait l'équivalent pour ses processus enfants.
Les modèles de processus en termes simples
Apache délègue la gestion des connexions à un Multi-Processing Module. prefork utilise un processus par connexion et n'a pas besoin de threads. worker exécute plusieurs processus avec de nombreux threads chacun. event s'appuie sur worker et utilise un polling thread-safe pour que les connexions keep-alive inactives n'occupent pas de thread. Sur les systèmes Linux et BSD actuels, event est choisi par défaut.
nginx a un processus maître qui lit la configuration et gère les workers, et un petit nombre de processus workers qui gèrent chacun de nombreuses connexions grâce à une boucle d'événements.
Pourquoi .htaccess compte
.htaccess permet à quelqu'un sans accès root de modifier les règles d'un dossier, c'est pourquoi les hébergements mutualisés en dépendent. Le prix à payer est qu'à chaque requête, Apache vérifie la présence du fichier dans chaque dossier parent, même quand il n'en existe aucun. Avec AllowOverride None, qui est la valeur par défaut, ces fichiers sont entièrement ignorés.
Le même site dans les deux serveurs
Virtual host Apache
Des fichiers statiques depuis un dossier plus un fallback SPA, configurés dans le vhost pour qu'aucun .htaccess ne soit nécessaire.
Bloc server nginx
Le même comportement : dossier racine, fallback try_files et page d'erreur personnalisée.
Forcer HTTPS
Apache teste le flag HTTPS ; nginx utilise un server séparé sur le port 80 qui ne fait que rediriger.
Envoyer le domaine nu vers www
La documentation de nginx recommande un bloc server dédié avec return plutôt qu'un if sur l'hôte.
Fallback pour application monopage
Servir les vrais fichiers quand ils existent et index.html pour tout autre chemin.
Rediriger une ancienne page
Redirect de mod_alias n'a pas besoin du moteur de réécriture ; nginx cible le chemin exact avec location =.
Page 404 personnalisée
Les deux renvoient l'erreur vers une page du même site.
Transmettre /api à un serveur d'application
Apache nécessite mod_proxy et mod_proxy_http chargés, avec des slashs finaux identiques sur les deux arguments ; le proxy de nginx est intégré.
Bloquer les fichiers cachés comme .git
Empêche de servir les fichiers dont le nom commence par un point.
Ajouter un en-tête de sécurité
Avec always, les deux serveurs ajoutent aussi l'en-tête aux réponses d'erreur, pas seulement aux réponses réussies.