Caching · 5 min read · Dec 28, 2025

Caching Mit Apaches mod_cache Auf Debian Lenny

Caching Mit Apaches mod_cache Auf Debian Lenny

Version 1.0
Autor: Falko Timme
Folge mir auf Twitter

Dieser Artikel erklärt, wie Sie die Inhalte Ihrer Website mit Apaches mod_cache auf Debian Lenny cachen können. Wenn Sie eine stark frequentierte dynamische Website haben, die bei jeder Anfrage viele Datenbankabfragen generiert, können Sie die Serverlast erheblich reduzieren, indem Sie Ihre Inhalte für einige Minuten oder länger cachen (das hängt davon ab, wie oft Sie Ihre Inhalte aktualisieren).

Ich gebe keine Garantie, dass dies für Sie funktioniert!

1 Vorbemerkung

Ich gehe davon aus, dass Sie eine funktionierende Apache2-Installation (Apache 2.2.x - vor dieser Version gilt mod_cache als experimentell) aus den Debian-Repositories haben - die Apache-Version in den Debian Lenny-Repositories ist 2.2.9, also sollten Sie bereit sein.

Ich verwende hier das Dokumentenstammverzeichnis /var/www für meinen Test-vhost - Sie müssen dies anpassen, wenn Ihr Dokumentenstammverzeichnis anders ist.

2 Aktivieren von mod_cache

mod_cache hat zwei Untermodule, die den Cache-Speicher verwalten, mod_disk_cache (zum Speichern von Inhalten auf der Festplatte) und mod_mem_cache (zum Speichern von Inhalten im Speicher, was schneller ist als das Caching auf der Festplatte). Entscheiden Sie, welches Sie verwenden möchten, und fahren Sie entweder mit Kapitel 2.1 (mod_disk_cache) oder 2.2 (mod_mem_cache) fort.

2.1 mod_disk_cache

Die Konfiguration von mod_disk_cache wird in /etc/apache2/mods-available/disk_cache.conf gespeichert, also lassen Sie uns diese bearbeiten:

vi /etc/apache2/mods-available/disk_cache.conf

Stellen Sie sicher, dass Sie die Zeile CacheEnable disk / auskommentieren, sodass die minimale Konfiguration wie folgt aussieht:

| # Cache-Reinigung erfolgt durch htcacheclean, das in # /etc/default/apache2 konfiguriert werden kann # # Für weitere Informationen siehe die Kommentare in dieser Datei, # /usr/share/doc/apache2.2-common/README.Debian und die htcacheclean(8) # Man-Seite. # Dieser Pfad muss derselbe sein wie der in /etc/default/apache2 CacheRoot /var/cache/apache2/mod_disk_cache # Dies wird auch lokale Dokumente cachen. Es macht normalerweise mehr Sinn, # dies in die Konfiguration für nur einen virtuellen Host zu setzen. CacheEnable disk / CacheDirLevels 5 CacheDirLength 3 |

Sie finden Erklärungen zu diesen Konfigurationsoptionen und weiteren Konfigurationsoptionen unter http://httpd.apache.org/docs/2.2/mod/mod_disk_cache.html.

Jetzt können wir mod_cache und mod_disk_cache aktivieren:

a2enmod cache
a2enmod disk_cache

/etc/init.d/apache2 restart 

Um sicherzustellen, dass unser Cache-Verzeichnis /var/cache/apache2/mod_disk_cache im Laufe der Zeit nicht überfüllt wird, müssen wir es mit dem Befehl htcacheclean reinigen. Dieser Befehl ist Teil des Pakets apache2-utils, das wir wie folgt installieren:

aptitude install apache2-utils 

Anschließend können wir htcacheclean als Daemon wie folgt starten:

htcacheclean -d30 -n -t -p /var/cache/apache2/mod_disk_cache -l 100M -i

Dies wird unser Cache-Verzeichnis alle 30 Minuten reinigen und sicherstellen, dass es nicht größer als 100MB wird. Um mehr über htcacheclean zu erfahren, werfen Sie einen Blick auf

man htcacheclean

Natürlich möchten Sie htcacheclean nicht jedes Mal manuell starten, wenn Sie den Server neu starten - daher bearbeiten wir /etc/rc.local…

vi /etc/rc.local

… und fügen die folgende Zeile direkt vor der Zeile exit 0 hinzu:

| [...] /usr/sbin/htcacheclean -d30 -n -t -p /var/cache/apache2/mod_disk_cache -l 100M -i [...] |

Dies wird htcacheclean automatisch jedes Mal starten, wenn Sie den Server starten.

2.2 mod_mem_cache

Die Konfiguration von mod_mem_cache befindet sich in /etc/apache2/mods-available/mem_cache.conf:

vi /etc/apache2/mods-available/mem_cache.conf   

| CacheEnable mem / MCacheSize 4096 MCacheMaxObjectCount 100 MCacheMinObjectSize 1 MCacheMaxObjectSize 2048 |

Dies ist die Standardkonfiguration - wenn Sie möchten, können Sie sie ändern. Eine Liste der Konfigurationsanweisungen für mod_mem_cache finden Sie hier: http://httpd.apache.org/docs/2.2/mod/mod_mem_cache.html

Jetzt aktivieren wir mod_cache und mod_mem_cache wie folgt:

a2enmod cache
a2enmod mem_cache

/etc/init.d/apache2 restart

Das war’s schon! Mit mod_mem_cache müssen Sie keine Cache-Verzeichnisse bereinigen.

3 Testen

Leider bietet mod_cache keine Protokollierungsfunktionen, was schlecht ist, wenn Sie wissen möchten, ob das Protokollieren funktioniert. Daher erstelle ich eine kleine PHP-Testdatei, /var/www/cachetest.php, die HTTP-Header sendet, die mod_cache mitteilen, dass es die Datei für 300 Sekunden cachen soll, und die einfach den Zeitstempel ausgibt:

vi /var/www/cachetest.php

| "; ?> |

Rufen Sie nun diese Datei in einem Browser auf - sie sollte den aktuellen Zeitstempel anzeigen. Klicken Sie dann in die Adressleiste des Browsers und drücken Sie ENTER, damit die Seite erneut geladen wird (drücken Sie nicht F5 oder die Schaltfläche zum Aktualisieren - dies wird immer eine frische Kopie vom Server anfordern, anstatt aus dem Cache!) - wenn alles gut geht, sollten Sie immer noch den alten, zwischengespeicherten Zeitstempel sehen. Wenn Sie 300 Sekunden warten, sollten Sie eine frische Kopie vom Server anstelle des Caches erhalten.

4 HTTP-Header

Caching funktioniert nicht von selbst - Sie müssen Ihre Webanwendung ändern, damit das Caching funktionieren kann (es ist möglich, dass Ihre Webanwendung bereits Caching unterstützt - bitte konsultieren Sie die Dokumentation Ihrer Anwendung, um dies herauszufinden). mod_cache wird Web-Seiten nur cachen, wenn die von Ihrer Webanwendung gesendeten HTTP-Header dies angeben.

Hier sind einige Beispiele für Header, die mod_cache nicht anweisen, zu cachen:

  • Expires-Header mit einem Datum in der Vergangenheit: “Expires: Sun, 19 Nov 1978 05:00:00 GMT”
  • Bestimmte Cache-Control-Header: “Cache-Control: no-store, no-cache, must-revalidate” oder “Cache-Control: must-revalidate, max-age=0”
  • Set-Cookie-Header: Eine Seite wird nicht gecacht, wenn ein Cookie gesetzt ist.

Wenn Sie also möchten, dass mod_cache Ihre Seiten cached, ändern Sie Ihre Anwendung so, dass solche Header nicht gesendet werden.

Wenn Sie möchten, dass mod_cache Ihre Seiten cached, können Sie einen Expires-Header mit einem Datum in der Zukunft setzen, aber der empfohlene Weg ist die Verwendung von max-age:

"Cache-Control: must-revalidate, max-age=300"

Dies teilt mod_cache mit, die Seite für 300 Sekunden (max-age) zu cachen - leider kennt mod_cache die s-maxage-Option nicht (siehe http://www.mnot.net/cache_docs/#CACHE-CONTROL), weshalb wir die max-age-Option verwenden müssen (die auch Ihrem Browser mitteilt, zu cachen - bitte beachten Sie dies, wenn Sie unerwartete Ergebnisse erhalten!). Wenn mod_cache die s-maxage-Option kennen würde, könnten wir “Cache-Control: must-revalidate, max-age=0, s-maxage=300” verwenden, was mod_cache, aber nicht dem Browser, mitteilen würde, die Seite zu cachen.

Natürlich ist dieser Header nutzlos, wenn Sie gleichzeitig einen der nicht-cachebaren Header (Expires in der Vergangenheit, Set-Cookie usw.) von oben senden!

Ein weiterer sehr wichtiger Header für das Caching ist dieser:

"Vary: Accept-Encoding"

Dies sorgt dafür, dass mod_cache zwei Kopien jeder zwischengespeicherten Seite behält, eine komprimierte (gzip) und eine unkomprimierte, sodass es die richtige Version je nach den Fähigkeiten des User-Agents/Browsers liefern kann. Einige User-Agents verstehen keine gzip-Komprimierung, sodass sie die unkomprimierte Version erhalten sollten.

Hier ist also die Zusammenfassung: Verwenden Sie die folgenden beiden Header, wenn Sie möchten, dass mod_cache cached:

“Cache-Control: must-revalidate, max-age=300”
“Vary: Accept-Encoding”

und stellen Sie sicher, dass keine Expires mit einem Datum in der Vergangenheit, Cookies usw. gesendet werden.

Wenn Ihre Anwendung in PHP geschrieben ist, können Sie die header()-Funktion von PHP verwenden, um HTTP-Header zu senden, z.B. so:

header(“Cache-Control: must-revalidate, max-age=300”);
header(“Vary: Accept-Encoding”);

Diese Seite ist ein Muss, wenn Sie mehr über HTTP-Header und Caching lernen möchten: http://www.mnot.net/cache_docs/

5 Links

Share: X/Twitter LinkedIn

Erhalte neue Beiträge in deinem Posteingang.

Kein Spam. Jederzeit abmelden.