Veröffentlicht von & unter Apache.

Erster kleine Helfer für Apache Webserver

Hier eine kleine Zusammenstellung von Tips wie Apache 2.x ohne große Kentnisse optimiert werden kann.

HostnameLookups Off
HostnameLookups sollte auf jeden Fall auf „off“ stehen. Dies verhindert das Apache für jede IP den Hostname auflöst, was immens viel Zeit spart.  Ein Lookup braucht heutzutage niemand mehr und kostet unötig Zeit.

EnableMMAP off
Wird Apache in einer NFS-Umgebung betrieben sollte auf keinen Fall Memory Mapping aktiviert sein da Apache sich unter umständen aufhängen kann wenn 2 Prozesse gleichzeitig auf eine Datei zugreifen. Dies gilt auch für Server mit Dual CPU’s oder aktivierten Hyperthreading. Auf einem Multicore System kann die Datei auch meist schneller ausgeliefert werden als über MMAP.

Options none
Viele PHP Anwendungen benutzen leider eine .htaccess Datei um Funktionalitäten wie ReWrite oder Zugriffschutz zu implementieren. Hierfür wird die Direktive  „Option FollowSymLinks“ / „SymLinksIfOwnerMatch“ benötigt. Wenn man dies so lässt muss Apache für jede Anfrage ein Zugriff auf die Festplatte ausführen um die Datei zu lesen. Das hier immense Performance-Verluste enstehen ist vorprogrammiert. Wer Rewrites und Authentifizierung benötigt sollte diese in der Directory / Virtualhost Direktive unterbringen. Leider wird bei den PHP Anwendungen z.B. WordPress nicht auf dieses Problem hingewiesen.

DirectoryIndex 
Hier sollte man auf keinem Fall Wildcards wie index.* benutzen. Es sollte eine Liste mit allen möglichen Startdateien angelegt werden. Den Aufwand den Apche für Wildcards benötigt kann sich jeder selber ausmalen.

EnableSendfile off
Greift der HTTP Server mittels NFS, Samba etc. auf einen File-Server zu sollte EnableSendfile auf off gestellt werden. Dies ist zwar kein Performance-Tip aber wenn mal keine Bilder ausgeliefert werden wisst ihr bescheid ;)

Apache MPM Workers
Der wichtigste und schwierigste Teil beim optimieren von Apache sind die Einstellungen der Worker Threads. Da hier die Hardware, Netzwerkumgebung, aktivierte Apache Module und die laufende Software eine sehr große Rolle spielen, ist es kaum möglich hier Handfeste Tips zu geben. Hier hilft nur schlau machen wie Apache mit den Threads arbeitet und testen, testen und nochmals testen. Die Beschreibung in der Aapche Dokumentation sind leider schwer zu verstehen, aber da muss man durch! Ich verdeutliche anhand eines Beispiels die Einstellungen:

Wir haben:
ThreadLimit 50
ServerLimit 30
StartServers 5
MaxClients 1500
MinSpareThreads 30
MaxSpareThreads 50
ThreadsPerChild 50

Diese Konfiguration kann 1500 gleichzeitig bedienen. Es werden beim starten 5 Apache instanziert. Jede Apache Instanz hat mindestens 30 und maximal 50 Kindprozesse. Jeder Kindprozess kann maximal 50 Threads öffnen, wobei jeder Thread 50 Clients verwaltet.

Rechnung: 30*50=1500

Man teilt soviele Threads und Kindprozesse ein wie man benötigt. Bei größeren Clients muss man dann auch das ServerLimit erhöhen. Diese gibt an wieviele Apache Server maximal gestartet werden können.

Benchmark
Ein simples Benchmark-Tool bring Apache von Hause aus mit. Unter /usr/local/apache2/bin/ ist die Applikation als AB abgelegt. Unter Windows gibt es das kleine Tool leider nicht mit im Packet. Wer ernsthaft testen möchte dem empfehle ich das Apache WebServer Stresstool von Paessler®

Dieses Tool bietet alles was man zum vernünftigen Testen benötigt. Es ist zwar sehr teuer aber für ernsthafte Projekte, die Geld einbringen sollen, eigentlich unverzichtbar. Wenn man die Möglichkeit hat ein eigenes Stresstool zu programmieren, das auf eine spezielle Applikation anpassbar ist, sollte man dies auf jeden Fall in Erwägung ziehen.