Apache vs nginx: de verschillen en hoe u config vertaalt
Apache vs nginx
Apache vs nginx: processen, .htaccess en config vertalen | We.Inc
Apache en nginx vergeleken op hoe ze verbindingen afhandelen, .htaccess per map tegenover centrale config, herladen en proxying, met een vertaler voor gangbare rewrite-regels.
Beide zijn volwassen open source webservers. Apache laadt modules in een keuze uit procesmodellen (prefork, worker of event) en laat elke map instellingen overschrijven met .htaccess-bestanden. nginx draait één masterproces en een paar event-gedreven workers, leest alleen zijn centrale config en wordt vaak als reverse proxy voor applicatieservers geplaatst.
Apache en nginx naast elkaar
Onderwerp
Apache httpd 2.4
Verbindingen afhandelen
Kies een MPM: prefork, worker of event (event is de gebruikelijke standaard op moderne Unix)
Eén masterproces plus workerprocessen met een event-gebaseerd model
Config per map
.htaccess-bestanden, als AllowOverride het toestaat (standaard None)
upstream: round robin, least_conn, ip_hash, hash, random
Testen en herladen
apachectl configtest, daarna apachectl graceful
nginx -t, daarna nginx -s reload
De keuze tussen beide gaat vooral over waar de configuratie staat en wie die mag wijzigen. Deze pagina slaat benchmarkclaims over, die volledig afhangen van de workload en de tuning, en richt zich op de verschillen die u tegenkomt bij het draaien van een site: hoe elke server verbindingen afhandelt, waarom .htaccess bestaat en hoe de rewrite-regels die u al hebt zich vertalen. Gebruik de vertaler om de nginx-versie van een bekende Apache-regel te zien.
Kies een taak in de vertaler, zoals HTTPS afdwingen of elk onbekend pad naar index.html sturen.
Typ uw eigen domein zodat beide versies klaar zijn om te plakken.
Zet de Apache-versie in de virtual host of in .htaccess, of de nginx-versie in het bijbehorende server-blok.
Test voordat u herlaadt: apachectl configtest voor Apache, nginx -t voor nginx.
Kies bij Apache liever de hoofdconfig van de server dan .htaccess als u de machine beheert. De Apache-documentatie zegt dat letterlijk, omdat httpd bij toegestane .htaccess bij elk verzoek in elke map op het pad naar het bestand zoekt.
In nginx is een if-blok dat de host test bijna altijd beter geschreven als apart server-blok met return 301.
Vervang ketens van RewriteCond-bestandscontroles door één try_files-regel; nginx controleert de opgegeven paden op volgorde.
Denk eraan dat add_header-regels van nginx niet worden geërfd in een blok dat zijn eigen add_header definieert. Herhaal beveiligingsheaders in elke location die een header instelt.
Beide draaien is gebruikelijk: nginx aan de rand voor TLS en statische bestanden, dat dynamische verzoeken doorstuurt naar Apache op een lokale poort.
Veelgestelde vragen
Is nginx sneller dan Apache?
Dat hangt af van de taak en de tuning, dus wees voorzichtig met één enkel getal. De event-gedreven workers van nginx zijn ontworpen om veel inactieve verbindingen goedkoop open te houden. De event-MPM van Apache heeft dat verschil verkleind door ook thread-safe polling te gebruiken. Meet uw eigen workload voordat u alleen voor snelheid overstapt.
Ondersteunt nginx .htaccess-bestanden?
Nee. nginx heeft geen override-bestanden per map, dus regels uit een .htaccess moeten naar de serverconfiguratie worden verplaatst, waarna nginx wordt herladen. Dat is een bewuste afweging: geen bestandscontroles bij elk verzoek, maar alleen mensen met toegang tot de hoofdconfig kunnen regels wijzigen.
Kan ik .htaccess automatisch omzetten naar nginx?
Eenvoudige redirects en fallbacks vertalen netjes, zoals de vertaler op deze pagina laat zien. Lange ketens van RewriteCond met flags zoals [P] of omgevingsvariabelen moeten door een mens worden gelezen, omdat nginx dezelfde bedoeling met andere bouwstenen uitdrukt.
Welke kies ik voor een WordPress- of PHP-site?
Als uw host u alleen bestandstoegang geeft, is Apache met .htaccess de enige manier om regels te wijzigen. Op een server die u beheert, werken beide met PHP-FPM; in nginx schrijft u de fallback voor nette URL's één keer met try_files in het server-blok.
Hoe herlaad ik de config zonder verbindingen te verbreken?
Voor nginx voert u nginx -s reload uit: de master controleert de nieuwe config, start nieuwe workers en vraagt de oude om netjes af te ronden. Voor Apache doet apachectl graceful hetzelfde voor zijn childprocessen.
Procesmodellen in gewone taal
Apache laat het afhandelen van verbindingen over aan een Multi-Processing Module. prefork gebruikt één proces per verbinding en heeft geen threads nodig. worker draait meerdere processen met elk veel threads. event bouwt voort op worker en gebruikt thread-safe polling, zodat inactieve keep-alive-verbindingen geen thread bezet houden. Op huidige Linux- en BSD-systemen wordt standaard event gekozen.
nginx heeft één masterproces dat de configuratie leest en de workers beheert, en een klein aantal workerprocessen die elk veel verbindingen afhandelen via een event loop.
Waarom .htaccess ertoe doet
Met .htaccess kan iemand zonder rootrechten de regels voor één map wijzigen, en daarom leunen gedeelde hosts erop. De prijs is dat Apache bij elk verzoek elke bovenliggende map op het bestand controleert, ook als er geen is. Met AllowOverride None, de standaard, worden die bestanden volledig genegeerd.
Dezelfde site in beide servers
Apache virtual host
Statische bestanden uit één map plus een SPA-fallback, ingesteld in de vhost zodat er geen .htaccess nodig is.
nginx server-blok
Hetzelfde gedrag: rootmap, try_files-fallback en een eigen foutpagina.
HTTPS afdwingen
Apache test de HTTPS-flag; nginx gebruikt een aparte server op poort 80 die alleen doorstuurt.
Kaal domein naar www sturen
De nginx-documentatie raadt een apart server-blok met return aan in plaats van een if op de host.
Fallback voor single-page apps
Serveer echte bestanden als ze bestaan en index.html voor elk ander pad.
Eén oude pagina doorsturen
Redirect van mod_alias heeft geen rewrite-engine nodig; nginx matcht het exacte pad met location =.
Eigen 404-pagina
Beide wijzen de fout naar een pagina op dezelfde site.
/api doorsturen naar een app-server
Apache heeft mod_proxy en mod_proxy_http geladen nodig, met overeenkomende afsluitende slashes in beide argumenten; proxying is in nginx ingebouwd.
Verborgen bestanden zoals .git blokkeren
Voorkomt dat bestanden waarvan de naam met een punt begint, worden geserveerd.
Een beveiligingsheader toevoegen
Met always voegen beide servers de header ook toe aan foutresponses, niet alleen aan geslaagde.