Webseiten beschleunigen mit mod cache

Aus Linupedia
Wechseln zu: Navigation, Suche

Der Apache lässt sich bekanntermaßen durch viele Module erweitern. Eines davon ist "mod_cache". Damit lassen sich dynamisch generiete Inhalte, wie sie z.B. Content Management Systeme generieren, zwischenspeichern. Dies sorgt für eine deutliche Verzögerung der Auslieferungszeiten. Im nachfolgenden Artikel zeigen wir Ihnen wie man dem Apache das Caching beibringt.

Seit Apacheversion 2.2.x gilt mod_cache offiziell als stabil und seine Verwendung im produktiven Umfeld wird empfohlen. Die meisten Linuxdistributionen liefern mod_cache schon seit einiger Zeit mit. Die Installation wird in diesem Artikel anhand von Ubuntu Linux 7.10 erklärt. Prinzipiell ist die Anleitung aber auch auf andere Distributionen anwendbar.

Zwar liefert Ubuntu 7.10 mod_cache zusammen mit dem Apache 2.2 bereits mit, allerdings ist es zunächst noch deaktiviert. Zur Aktivierung erstellt man einfach passende Symlinks im Verzeichnis /etc/apache2/mods-enabled/. sudo ln -s /etc/apache2/mods-available/cache.load /etc/apache2/mods-enabled sudo ln -s /etc/apache2/mods-available/disk_cache.* /etc/apache2/mods-enabled

Startet man den Apache nun mittels sudo /etc/init.d/apache2 restart, verfügt der Apache über Cachingfähigkeiten.

Jetzt muss man noch konfigurieren was der Apache cachen soll und wohin die Daten gespeichert werden soll.

Hierzu sucht man sich den passenden <Virtualhost> Abschnitt der Apacheconfiguration heraus und fügt folgends hinzu:

 CacheEnable disk /
 CacheRoot /var/cache/apache2/vhostX/

CacheRoot gibt dabei an wohin der Apache die gecachten Daten speichern soll. Diese Verzeichniss muss natürlich für den Apache beschreibbar sein. Damit der Apache die Festplatte des Servers nicht mit Daten überfrachtet sollte man dafür sorgen das der Cache regelmäßig zurückgestutzt wird. Hierfür kommt das Programm htcacheclean zum Einsatz. Diese kann man z.B. über einen Cronjob regelmäßig ausführen lassen. Es reduziert die Größe des Caches auf den angegeben Wert. Folgender Aufruf würde z.B. den Cache unter /var/cache/apache2/vhostX/ auf 100 MB geschränken.

 htcacheclean -p /var/cache/apche2/vhostX/ -l 100M

Nach einem erneuten Neuladen des Apache fängt dieser Automatisch an die Daten zu cachen. Allerdings wird er bisher nur reine HTML Seiten und Grafiken cachen. Das bringt keinen wirklichen Performancegewinn. PHP Seiten wirden bisher noch nicht gecacht, da der Apache nicht ermitteln kann wann eine entsprechende Seite zuletzt bearbeitet wurde.

Diese Information geht nämlich nach dem Durchlauf der PHP Datei durch den PHP Compiler / Interpreter verloren. Um trotzdem ein Caching zu erreichen muss man diese Information manuell ausgeben. Dies ist der Punkt an dem es knifflig wird. Zwar ist es recht einfach einen "Last Modified" Header per PHP zu senden (siehe weiter im Artikel), allerdings ist es gar nicht so einfach zu ermitteln wann eine PHP Seite sich geändert hat.

Bei einer PHP Seite die hauptsächlich statischen Content enthält und nur Teile des Layout, wie z.B. das Menü, per include nachlädt ist das noch recht einfach. Man nimmt einfach das Änderungsdatum der Datei. In PHP kann man das mit fileatime ermitteln.

Bei einer PHP Seite die Daten aus einer Datenbank lädt, wie z.B. das Script das für das Anzeigen dieses Artikels verantwortlich ist, wird das schon nicht mehr so einfach. Der Content ändert sich zwar mit jedem neuen Datensatz in der Datenbank, die eigentliche Datei aber nicht. In diesem Fall ist es angebracht z.B. das Datum des Artikels als Änderungsdatum zu nehmen.

Hat man schlussendlich herausgefunden, wie man das Änderungsdatum definiert kann man es nun dem Apache mitteilen:

 <?php
   header('Last-Modified: '.gmdate('D, d M Y H:i:s', $last_mod) . ' GMT');
 ?>

Hierbei ist $last_mod das Änderungsdatum im Unixtimestamp-Format.

Darüber hinaus ist es natürlich auch noch sinnvoll dem Apache mitzuteilen wie alt seine Kopie der Seite maximal sein darf bevor er eine aktuelle Version anfordern muss. Dies funktioniert über den Max-Age Header

 <?php header('Cache-Control: public,max-age=' . (3600 * 168)); ?>

Die Angabe (3600 * 168) bedeutet in diesem Fall eine maximales Alter von einer Woche.

Sobald dies in den PHP Dateien enthalten ist, cacht der Apache auch PHP Dateien. Je nachdem wie komplex eine PHP Datei ist, kann man mit dieser Methode die Auslieferungszeit um ca. 30% erhöhen.


Quelle