Website-Optimierung per Caching
Kommentare

Das Vergleichen über ein ETag funktioniert ähnlich. Der Webserver erstellt einen Hash-Wert aus den Dateiinformationen eines Inhalts und sendet ihn an den Browser. Dieser Wert wird dann wieder bei Folgeanfragen

Das Vergleichen über ein ETag funktioniert ähnlich. Der Webserver erstellt einen Hash-Wert aus den Dateiinformationen eines Inhalts und sendet ihn an den Browser. Dieser Wert wird dann wieder bei Folgeanfragen an den Server gesendet, der nach einer Überprüfung die gleichen HTTP-Statuscodes ausliefert wie bei der If-Modified-Since-Methode – Header: 200 oder 304. Per Standardeinstellung des Apache-Webservers wird der Hash-Wert aus I-Node-Nummer (Inode), Datum und Uhrzeit der letzen Änderung (Mtime) und der Größe der Datei in Bytes (Size) erstellt. Ein Problem entsteht bei der Verwendung von ETag, falls die Serverinfrastruktur aus mehr als einem Server besteht, da ein Hash-Wert aus den beschriebenen drei Parametern, Inode, Mtime und Size, erstellt auf mehreren Servern, unterschiedlich sein kann und damit das Caching ausgehebelt wird. Man könnte den Hash-Wert nur aus der Größe berechnen, allerdings läuft man somit Gefahr, bei Änderungen, die die Größe nicht verändern, den Browser-Cache nicht zu invalidieren. Die Lösung dieses Problems wird in einem späteren Abschnitt über die Verwendung von Expire vorgestellt.

Das größte Problem ist jedoch, dass immer ein HTTP-Request gesendet wird und der Server Berechnungen vornehmen muss. Das wollen und können wir mit der zweiten Methode verhindern: Die Inhalte werden zuerst in statische und dynamische Inhalte aufgeteilt. Als statische Inhalte gelten zum Beispiel JS-, CSS-, und Bild-Dateien. Es bietet sich eine saubere Trennung der Applikation von ihren statischen Inhalten an. Wenn die Applikation von der Domain www.example.com ausgeliefert wird, können alle statischen Inhalte zum Beispiel von stat.example.com ausgeliefert werden. All diese statischen Inhalte sollten ein Jahr (maximale, im RFC definierte Zeit) lang gecacht werden. Die Frage, die jetzt geklärt werden muss, ist: Wie kann man dann statische Inhalte erneuern? Dafür kann man zum Beispiel das mod_rewrite-Modul des Apache Webservers und die Versionierung von SVN nutzen. Es bietet sich an, ein Skript zu schreiben, das in angegebenen Verzeichnissen nach definierten Inhalten wie Bild-, JS- und CSS-Dateien scannt. Von den gefunden Dateien wird dann die aktuelle Revision aus dem SVN abgefragt und in einer Konstante abgespeichert. Daraus ergibt sich eine Datei, die Konstanten mit den Versionsnamen der definierten Objekte enthält. Diese wiederum kann in die Anwendung eingebunden werden. Damit stehen die Konstanten zum Beispiel in einem Template oder einer View zur Verfügung. Ein Beispiel, wie es in einer View aussehen könnte:

//Konstante:



//View:

<link href="http://stat.example.com/css/" rel="stylesheet" type="text/css" />

Mit dieser Konfiguration wird der angefragte Inhalt für lange Zeit gecacht. Sollte sich der Inhalt ändern, wird einfach eine neue Version ausgeliefert, die über die Rewrite Rule auf die richtige Datei geleitet wird. Das heißt, die Invalidierung wird aktiv über die Umbenennung des Inhaltsnamens (Versionsnummer) von der Applikation aus gesteuert. Die restlichen Anfragen sind somit Anfragen nach dynamischen Inhalten. Eine weitere Gruppierung dieser Inhalte nach ihrem Gültigkeitszeitraum ist sinnvoll, da ein Browser im Normalfall Inhalte so lange nicht vom Webserver abfragt, wie sie gültig sind. Das Setzen dieses Zeitraums geschieht über den Expire-Date-Header. Eine Applikation besteht aus dynamischen Inhalten, die sich oft, öfter, selten oder sehr selten verändern. Hiernach gilt es zu gruppieren. Das bedeutet für die Gruppierung der Inhalte, dass eine sinnvolle Zeit für den Expire-Date-Header für jede Gruppe definiert wird. Zusätzlich wird mit dem Last-Modified-Header eine zweite Schicht eingebaut, die zwar Anfragen stellt, aber kaum Serverlast verursachen sollte.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -