Mit Apache's mod_cache auf Debian Lenny Daten zwischenspeichern - Seite 2

3 Testen

Leider hat mod_cache keinerlei Funktion, die eventuelle Fehlermeldungen u.ä. protokolliert, weshalb man nicht sehen kann ob mod_cache überhaupt funktioniert.  Daher erstelle ich eine kleine PHP Test- Datei /var/www/cachetest.php, das HTTP Headers sendet, die mod_cache befehlen die Datei für 300 Sekunden zwischenzuspeichern und dann einfach die Zeit ausgibt:

vi /var/www/cachetest.php

<?php
header("Cache-Control: must-revalidate, max-age=300"); header("Vary: Accept-Encoding"); echo time()."<br>"; ?>
Rufe nun die Datei im Brwoser auf - es sollte die aktuelle Zeit anzeigen. Dann klicke in die Adressleiste des Browsers und drücke ENTER so daß die Seite noch einmal geladen wird - drücke nicht F5 oder "Neu laden", das würde nur eine neue Kopie von dem Server ausgeben anstatt dem Zwischenspeicher! Wenn alles funktioniert, so solltest Du immer noch die alte, zwischengespeicherte Zeit sehen.Wenn Du 300 Sekunden wartest, solltest Du hingegen eine neue Ausgabe vom Server bekommen anstatt des Zwischenspeichers.

4 HTTP Header

Das sogenannte cachen bzw. Zwischenspeichern funktioniert nicht auf Anhieb. Du musst Deine Webapplikation so ändern, daß zwischenspeichern ermöglicht wird. Vielleicht unterstützt Deine Webapplikation cachen bzw. zwischenspeichern bereits - bitte schau Dir dazu die entsprechende Dokumentation der Anwendung an. mod_cache wird Webseiten nur dann zwischenspeichern wenn es im HTTP Header  der Webseiten, die von Deiner Webapllikation gesendet werden, als Anweisung drin steht.

Hier sind einige Besipiele eines Headers, das mod_cache sagt nicht zwischenzuspeichern bzw. zu cachen:
  • Expires Header mit einem Datum in der Vergangenheit "Expires: Sun, 19 Nov 1978 05:00:00 GMT"
  • Einige Cache-Control Header: "Cache-Control: no-store, no-cache, must-revalidate" oder "Cache-Control: must-revalidate, max-age=0"
  • Set-Cookie Header: Die Seite wird nicht zwischengespeichert wenn kein Cookie gesetzt wurde.
Sollest Du also mit mod_cache zwischenspeichern wollen, ändere die Applikation so ab dass sie solche Header nicht mehr sendet.

Soll mod_cache deine Seiten zwischenspeichern, kannst Du einen Expires Header mit einem Datum in der Zukunft setzen, allerdings ist die empfohlene Variante die Nutzung von max-age:

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

Das sagt mod_cache daß es die Seite für 300 Sekunden (max-age) zwischenspeichern bzw. cachen soll  - leider kennt mod_cache die Option s-maxage nicht,  (siehe http://www.mnot.net/cache_docs/#CACHE-CONTROL), weshalb wir die max-age Option nutzen müssen (Diese sagt auch Deinem Browser dass er zwischenspeichern soll - bitte daran denken falls Fehlermeldungen kommen!). Wenn mod_cache die s-maxage Option kennen würde, könnten wir "Cache-Control: must-revalidate, max-age=0, s-maxage=300" benutzen, welches mod_cache, aber nicht dem Browser, sagt, die Seite zwischenzuspeichern.

Natürlich ist dieser Header nutzlos, wenn gleichzeitig ein Header gesendet wird, der nicht zwischenspeichert!  (Expires in der Vergangenheit, Set-Cookie, etc.) !

Ein anderer unentbehrlicher Header zum cachen ist dieser:

"Vary: Accept-Encoding"

Der bewirkt daß mod_cache zwei Kopien von jeder gecachten Seite speichert, eine als .gzip komrimiert, die andere unkomprimiert, so daß die richtige Version ausgeliefert werden kann, je nach dem Programm dass es anfordert. Einige können die .gzip Version nicht verwenden, so daß es eben auch eine nicht komprimierte Version geben muss.

Und hier ist die Zusammenfassung: Benutze beide folgende Header wenn Du mit mod_cache zwischenspeichern möchtest:

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

"Vary: Accept-Encoding"

und stelle sicher daß keine Expires mit einem Datum in der Vergangenheit, Cookies oder anderes gesendet werden.

Wenn Deine Applikation in PHP geschrieben ist, kannst Du den PHP  header() function verwenden um die HTTP Header auszusenden, wie beispielsweise hier:

header("Cache-Control: must-revalidate, max-age=300");

header("Vary: Accept-Encoding");

Diese Seite ist eine Pflicht wenn Du mehr über HTTP Header und Zwischenspeicher bzw. Chache wissen möchtest: http://www.mnot.net/cache_docs/

5 Links

0 Kommentar(e)

Zum Posten von Kommentaren bitte