Aysad Kozanoglu - Mimarist

Server Howtos & Tutorials

nginx vs. apache - Entscheidende Unterschiede

26 Februar, 2018 | Server Anleitungen

Die entscheidende zwei Worte:

Workerprozesse vs. Events

nginx ist im Vergleich zu Apache nicht Workerprozess-, sondern Eventbasierend.

Apache nutzt für jeden Request einen Workerprozess bzw. eigene Threads.So ein Prozess enthält immer das komplette Bundle aller installierten Apache-Module, unabhängig vom Request bzw. Requestfile. Das wiederum heißt, an jeden Prozess wird unter anderem auch immer das PHP Modul gebunden, egal, ob eine PHP-Datei, ein Bild oder eine Textdatei angefragt wurde. Dadurch jeder Requestprozess locker 30+MB im RAM inne, und das ist noch vorsichtig geschätzt.

undefinedundefined

nginx geht einen anderen Weg: Events. Anstatt für jeden Request einen eigenen Prozess zu starten bzw. zu nutzen, frühstückt nginx die Requests mit Events ab. Jeder Request ist dabei ein Event. Dadurch, dass nur wenige Prozesse und Threads auf Events lauschen, ist nginx viel resourcenfreundlicher. So braucht nginx für 10.000 gleichzeitige HTTP-Requests nur ca. 2,5MB RAM.

undefined

Während nginx nun Request für Request bzw. Event für Event seine Warteschlange durchballert, erstellt Apache für jeden Request einen neuen Workerprozess oder -thread. Das hat zur Folge, dass der Apache irgendwann an seine Grenzen stösst und in die Knie geht (Slashdot-Effekt).
Benchmark Apache vs. nginx

Eigene Tests mit ApacheBench auf einem Rootserver (Intel® Xeon® E3-1245 Quad-Core, 32 GB ECC RAM, 3 TB SATA 6 Gb/s HDD 7200 rpm) mit 10.000 Requests, Concurrencylevel 1.000, haben den Apache nach 4.200 Requests zur Aufgabe gezwungen. nginx hingegen hat auf dem gleichen Server die 10.000 Anfragen auf die gleiche Datei locker abgearbeitet.

Bei einem weiteren Test mit einer .jpg Datei und nur 100 gleichzeitigen Requests hat nginx 10x soviele Anfragen wie Apache in der gleichen Zeit geschafft.

Darüber hinaus ist folgt nginx eine non-blocking philospohie für jeden Request (event), wobei Apache die Requests einfach blockiert und nicht mehr annimmt, kurz gesagt nginx nimmt alle Requests bis der NIC interface brennt.