Apache2/mod cache
Aus Ubuntu-Forum Wiki
Dieser Artikel bedarf einer Aktualisierung. |
Inhaltsverzeichnis |
1 Allgemeines
Der Apache lässt sich bekanntermaßen durch viele Module erweitern. Eines davon ist "mod_cache". Damit lassen sich dynamisch generierte 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 Linux-Distributionen 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.
2 mod_cache aktivieren
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
3 Apache konfigurieren
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 Lampp#Anlegen_virtueller_Verzeichnisse <Virtualhost> Abschnitt der Apacheconfiguration heraus und fügt folgendes hinzu:
CacheEnable disk / CacheRoot /var/cache/apache2/vhostX/
CacheRoot gibt dabei an, wohin der Apache die gecachten Daten speichern soll. Dieses 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, dass 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 werden 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.
4 Links
- LAMPP Apache-Webserver mit MySQL, Perl und PHP