Caching

From WaveCDN Wiki
Revision as of 18:57, 15 November 2013 by Nfr (talk | contribs)
Jump to navigation Jump to search

Einleitung

Das folgende Dokument soll eine grundlegende Einführung in das Thema Caching bieten.

WaveCDN fungiert als Schnittstellen zwischen den Webusern und dem Origin. Anfragen der Webuser werden also an WaveCDN gerichtet. WaveCDN prüft, ob die angefragte Ressource bereits im weltweiten Cache vorhanden ist. Wenn das der Fall ist, kann die Anfrage enorm schnell aus dem Cache beantwortet werden. Andernfalls muss die Ressource zunächst Origin angefragt werden und kann erst dann ausgeliefert werden. Caching bedeutet also, dass Ressourcen im weltweiten Cache von WaveCDN zwischengespeichert werden und dadurch stark beschleunigte Auslieferungszeiten ermöglicht werden. Ziel beim Caching soll es sein, durch geschicktes Wählen einer Strategie und eines Partitionierungsmechanismus möglichst viele Inhalte zu cachen.

Im weiteren Verlauf wird davon ausgegangen, dass bereits ein CDN-Setup im Webpanel von WaveCDN erstellt wurde.

Voraussetzungen für Caching

Ob eine Ressource in den Cache von WaveCDN aufgenommen werden kann, hängt von folgenden Voraussetzungen ab:

  • Cookie-Header Die Anfrage vom Webuser enthält keinen Cookie-Header oder die Regel "Remove Cookie" bzw. alternativ "Cache with Cookie" wird eingesetzt
  • Set-Cookie-Header Die Antwort vom Origin enthält keinen Set-Cookie-Header oder die Regel "Remove Set-Cookie" wird eingesetzt
  • Caching-Anweisung Es muss eine Caching-Anweisung vorliegen, entweder durch einen Header in der Antwort vom Origin ("Expires" oder "Cache-Control: max-age=") oder durch eine Regel "Set Max-Age" im Webpanel

Der Vollständigkeit halber sollen noch zwei weitere Voraussetzungen angesprochen werden, die in der Regel jedoch erfüllt sind: Die Anfrage des Webusers muss die Methode GET oder HEAD haben und es darf kein Authorization-Header vorhanden sein.

Nur wenn alle Voraussetzungen erfüllt sind, kann eine Ressource in den Cache aufgenommen werden.

Um herauszufinden ob eine bestimmte Seite gecached wird, kann man die <Debug Header> nutzen. Sie geben ggf. auch Gründe an, warum eine Seite nicht cachbar ist.


Caching-Strategien

Die Caching-Strategie dient dazu Inhalten einer Website als statisch oder dynamisch zu klassifizieren. Nur statische Inhalte können in den Cache aufgenommen werden. Die Caching-Strategie ist anhand der Struktur der gegebenen Website auszurichten.

Vollständige Domain

Die wohl simpelste Caching-Strategie ist das Cachen einer vollständigen Domain. Dabei wird vorausgesezt, dass sämtliche Inhalte der Domain statischer Natur sind. Ein Beispiel für ein CDN-Setup mit ausschließlich statischen Inhalten ist das Beschleunigen eines Media-Servers.

Folgende Regeln werden empfohlen:

   Always -> Remove Cookie
   Always -> Remove Set-Cookie
   Always -> Max-Age (Sofern der Origin keine Gültigkeitsdauer übermittelt)

Da es sich um eine Domain mit ausschließlich statischen Inhalten handelt, haben Cookies keine Bedeutung. Die ersten beiden Regeln sorgen also dafür, dass etwaig vorhadene Cookies ignoriert werden und die Voraussetzungen für das Caching erfüllt sind.

Bestimmte Verzeichnisse

Wenn die statischen und dynamischen Inhalte in verschiedenen Verzeichnissen liegen, macht es Sinn, anhand der Verzeichnisse zu cachen. Typischerweise handelt es sich um Verzeichnisse wie /images/ oder /static/. Bei den folgenden beispielhaften Regeln wird davon ausgegangen, dass das Verzeichnis /static/ gecached werden soll.

   If URL begins with "/static/ -> Remove Cookie
   If URL begins with "/static/" -> Remove Set-Cookie
   Always -> Max-Age (Sofern der Origin keine Gültigkeitsdauer übermittelt)

Durch die Regeln ist gewährleistet, das etwaig vorhandene Cookies der Domain sich nicht auf das statische Verzeichnis auswirken. Durch Entfernen der Cookies sollen die Voraussetzungen für das Caching sichergestellt werden.

Bestimmte Dateitypen

Angenommen auf einer Website liegen sowohl statische als auch dynamische Inhalte und es ist keine Trennung durch verschiedene Verzeichnisse gegeben. Dann ist es trotzdem noch möglich anhand der Dateitypen festzustellen, ob eine Seite statischer oder dynamischer Natur ist. Beispielhaft wurden Regeln für die Dateitypen jpg, gif und png realisiert:

   If URL (without Query-String) ends with ".jpg" -> Remove Cookie
   If URL (without Query-String) ends with ".jpg" -> Remove Set-Cookie
   If URL (without Query-String) ends with ".jpg" -> Max-Age (Sofern der Origin keine Gültigkeitsdauer übermittelt)
   If URL (without Query-String) ends with ".gif" -> Remove Cookie
   If URL (without Query-String) ends with ".gif" -> Remove Set-Cookie
   If URL (without Query-String) ends with ".gif" -> Max-Age (Sofern der Origin keine Gültigkeitsdauer übermittelt)
   If URL (without Query-String) ends with ".png" -> Remove Cookie
   If URL (without Query-String) ends with ".png" -> Remove Set-Cookie
   If URL (without Query-String) ends with ".png" -> Max-Age (Sofern der Origin keine Gültigkeitsdauer übermittelt)

Bestimmte Seiten

   If URL is equal to "/static-content.html" -> Remove Cookie
   If URL is equal to "/static-content.html" -> Remove Set-Cookie
   If URL is equal to "/static-content.html" -> Max-Age (Sofern der Origin keine Gültigkeitsdauer übermittelt)

Bestimmte Seitenelemente

ESI mit Screenshot.


Partitionierung des Caches

WaveCDN erlaubt es den Cache in mehrere sogenannte Partitionen aufzuteilen.

Standardmäßig zieht WaveCDN folgenges für die Partitionierung heran:

   Die URL inkl. Query-String (aus der Anfrage des Webusers)
   Die Attribute des Vary-Headers (aus der Antwort des Origins)
   Den Cookie-Header, sofern die Regel "Cache with Cookie" eingesetzt wird (aus der Anfrage des Webusers)

Dokumentation wichtiger Regeln

Die wichtigsten Regeln sollen kurz erläutert werden. Insbesondere auf die Relevanz in Hinblick auf das Caching soll besprochen werden. Regel Kontext Erläuterung Remove Cookie Anfrage vom Webuser an WaveCDN Wenn der Webuser eine Anfrage an WaveCDN schickt, dann kann in der Anfrage ein Cookie-Header enthalten sein. Diese Regeln entfernt den Cookie-Header. Remove Set-Cookie Antwort vom Origin an WaveCDN Wenn WaveCDN eine bestimmte Ressource nicht im Cache hat, wird der Origin befragt. Der Origin antwortet mit der Ressource. In der Antwort wird durch diese Regel der Set-Cookie-Header entfernt. Max-Age Cachen einer Ressource WaveCDN erhält in bestimmten Situationen Ressourcen des Origins. Wenn bei der Ressource die Voraussetzungen für das Caching erfüllt sind, muss entschieden werden, wie lange die Ressource im Cache gültig ist. Durch die Max-Age-Regel wird genau diese Gültigkeit definiert. Sofern Informationen vom Origin über die Gültigkeitsdauer der Ressource vorliegen (Expires oder Cache-Control-Max-Age-Header), hat die Regel im Webpanel Vorrang. Cache with Cookies Cachen einer Ressource

Angenommen der Webuser schickt eine Anfrage mit Cookies an WaveCDN. Dann muss WaveCDN diese Anfrage in bestimmten Situationen an den Origin weiterleiten, zum Beispiel wenn die angefragte Ressource nicht im Cache ist. Wenn WaveCDN die Ressource dann vom Origin erhält, dann würde sie normalerweise nicht gecached werden, weil sie Cookies enthält (siehe Voraussetzungen für das Caching). Die Regel "Cache with Cookies" gibt die Anweisung die Ressource trotzdem in den Cache aufzunehmen. Zugleich wird für die Partitionierung des Caches der Cookie-Header mit einbezogen.

Sonstiges

   IMPORTANT Bei Vorliegen der Caching-Voraussetzungen mit Ausnahme der Cache-Instruktion werden Ressourcen 120 Sekunden lang gecached. Das sollte raus.
   IMPORTANT Regel "Cache with Cookie"
   So viele Beispiele wie möglich mit anführen. Language-beispiel!
   STANDARDMÄSSIG CACHED VARNISH keine Ressourcen mit Cookie Header! https://www.varnish-cache.org/trac/wiki/VCLExampleCacheCookies
   Default-VCL von Varnish: https://www.varnish-cache.org/docs/3.0/reference/vcl.html
   Bei Akamai kann man anscheinend zu cachende URLs/Directories definieren. Bei diesen URLs wird dann der Cookie- und Set-Cookie-Header entfernt. Siehe letzten Beitrag auf: http://stackoverflow.com/questions/11540341/bypass-specific-url-from-akamai-if-certain-cookie-exist