Caching: Difference between revisions

From WaveCDN Wiki
Jump to navigation Jump to search
 
(48 intermediate revisions by the same user not shown)
Line 3: Line 3:
Das folgende Dokument soll eine grundlegende Einführung in das Thema Caching bieten.
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.
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 beim 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 Cache Keys möglichst viele Inhalte zu cachen.


Im weiteren Verlauf wird davon ausgegangen, dass bereits ein CDN-Setup im Webpanel von WaveCDN erstellt wurde.
Im weiteren Verlauf wird davon ausgegangen, dass bereits ein CDN-Setup im Webpanel von WaveCDN erstellt wurde.
Das Caching kann durch das Regelsystem im Webpanel beeinflusst werden.


=Voraussetzungen für Caching=
=Voraussetzungen für Caching=


Ob eine Ressource in den Cache von WaveCDN aufgenommen werden kann, hängt von folgenden Voraussetzungen ab:
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.
* Cookie-Header: Die Anfrage vom Webuser enthält keinen Cookie-Header oder die Regel "Remove Cookie" bzw. alternativ "Cache with Cookies" wird angewendet.
* Set-Cookie-Header: Die Antwort vom Origin enthält keinen Set-Cookie-Header oder die Regel "Remove Set-Cookie" wird angewedet.
* 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".


Nur wenn alle Voraussetzungen erfüllt sind, kann eine Ressource in den Cache aufgenommen werden.
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.


Um herauszufinden, ob eine bestimmte Seite gecached wird, kann die Antwort von WaveCDN auf einen Age-Header größer als Null überprüfen. Ebenfalls interessant sind die <Debug Header>. Falls eine Page nicht in den Cache aufgenommen werden kann, geben sie die entsprechenden Gründe an.


=Caching-Strategien=
=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.
Die Caching-Strategie dient dazu, Inhalte 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==
==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.
Die einfachste Caching-Strategie ist das Cachen einer vollständigen Domain. Dabei wird vorausgesetzt, 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:
Folgende Regeln werden empfohlen:


    Always -> Remove Cookie
Always -> Remove all cookies
    Always -> Remove Set-Cookie
Always -> Remove Set-Cookie
    Always -> Max-Age (Sofern der Origin keine Gültigkeitsdauer übermittelt)
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.
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 vorhandene Cookies ignoriert werden. Die letzte Regel gibt ggf. eine Anweisung zum Cachen. Durch die Regeln wird erreicht, dass die Voraussetzungen für das Caching erfüllt sind.


==Bestimmte Verzeichnisse==
==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.
Wenn die statischen und dynamischen Inhalte in verschiedenen Verzeichnissen liegen, macht es Sinn, anhand der Verzeichnisstruktur 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 all cookies
    If URL begins with "/static/" -> Remove Set-Cookie
If URL begins with "/static/" -> Remove Set-Cookie
    Always -> Max-Age (Sofern der Origin keine Gültigkeitsdauer übermittelt)
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.
Durch die Regeln ist gewährleistet, das etwaig vorhandene Cookies der Domain sich nicht auf das statische Verzeichnis /static/ auswirken. Durch Entfernen der Cookies sollen die Voraussetzungen für das Caching erfüllt werden.


==Bestimmte Dateitypen==
==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:
Angenommen auf einer Website liegen sowohl statische als auch dynamische Inhalte und es ist keine Trennung durch verschiedene Verzeichnisse gegeben. Dennoch ist es oft möglich anhand der Dateitypen festzustellen, ob eine bestimmte Ressource statischer oder dynamischer Natur ist. Regeln für die statischen Dateitypen jpg, gif und png sähen wie folgt aus:
 
If URL (without Query-String) ends with ".jpg" -> Remove all cookies
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 all cookies
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 all cookies
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==
 
Sollen bestimmte Seiten als statisch bzw. cachbar markiert werden, so sind lediglich deren URLs als Bedingung zu definieren:
 
If URL is equal to "/static-content.html" -> Remove all cookies
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==
 
Wir unterstützen die Nutzung von ESI, um bestimmte Seitenelemente dynamisch laden zu lassen und den Rest zu cachen. Bei genaueren Informationen bitten wir um eine Kontaktaufnahme mit dem Support.
 
=Cache Key=


    If URL (without Query-String) ends with ".jpg" -> Remove Cookie
Wenn WaveCDN eine Anfrage vom Webuser erhält, so wird aus der Anfrage ein sogenannter Cache Key berechnet. Anhand des Cache Keys wird dann geprüft, ob die angefragte Ressource bereits im Cache liegt. Der Cache Key setzt sich aus verschiedenen Attributen zusammen. Standardmäßig sind das bei WaveCDN folgende Attribute:
    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
* URL inkl. Query-String (aus der Anfrage des Webusers)
    If URL (without Query-String) ends with ".gif" -> Remove Set-Cookie
* Attribute des Vary-Headers (der Vary-Header stammt aus der Antwort des Origins, aber gibt Anfrage-Header an)
    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
Zusätzlich bei Anwendung der Regel "Cache with Cookies":
    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
* Cookie-Header (aus der Anfrage des Webusers)


    If URL is equal to "/static-content.html" -> Remove Cookie
=Beispiel=
    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==
==Verschiedene Sprachen durch Sprach-Cookie==
 
Angenommen wir haben eine Website mit einigen Pages. Wenn vom Webuser eine Page angefordert wird, unterscheidet die Webapplikation anhand des lang-Cookies, in welcher Sprache die Page ausgeliefert werden soll. Alle anderen Cookies sind nur im Browser relevant, z.B. für Google Analytics, und werden von der Webapplikation nicht benötigt.


ESI mit Screenshot.
Eine Konfiguration könnte wie folgt aussehen:


Always -> Remove all cookies
Always -> Keep cookie "lang"
Always -> Cache with cookies
Always -> Max-Age = 3600s (Sofern der Origin keine Gültigkeitsdauer übermittelt)


Die ersten beiden Regeln erreichen, dass alle Cookies bis auf den lang-Cookie entfernt werden.  Die dritte Regel sorgt dafür, dass WaveCDN trotz des ggf. vorhandenen Cookie-Headers den Cache verwendet. Die letzte Regel gibt lediglich eine Anweisung zum Cachen. Wenn der Origin bereits ein Gültigkeitsdauer übermittelt, kann darauf verzichtet werden.


=Partitionierung des Caches=
Explizit wird auf die Regel "Remove Set-cookie" verzichtet, da die Webapplikation in diesem Beispiel den lang-Cookie setzt und deswegen der Set-Cookie-Header durchkommen muss. Zwar ist das Vorhandensein des Set-Cookie-Header ein Verstoß gegen die Voraussetzungen für das Caching, aber der Header wird nur bei ganz bestimmten Anworten mitgeschickt. Alles andere wird gecached.


WaveCDN erlaubt es den Cache in mehrere sogenannte Partitionen aufzuteilen. Standardmäßig zieht WaveCDN folgenges für die Partitionierung heran:
Ferner enthält die Website zahlreiche Bilder unter dem Pfad /images/. Damit beim Caching der Bilder nicht zwischen den verschiedenen Sprachen des lang-Cookies unterschieden wird, sollte man noch folgendes hinzufügen:


* Die URL inkl. Query-String (aus der Anfrage des Webusers)
If URL begins with "/images/" -> Do not cache with cookies
* 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)

Latest revision as of 16:33, 26 November 2013

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 beim 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 Cache Keys möglichst viele Inhalte zu cachen.

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

Das Caching kann durch das Regelsystem im Webpanel beeinflusst werden.

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 Cookies" wird angewendet.
  • Set-Cookie-Header: Die Antwort vom Origin enthält keinen Set-Cookie-Header oder die Regel "Remove Set-Cookie" wird angewedet.
  • 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".

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 die Antwort von WaveCDN auf einen Age-Header größer als Null überprüfen. Ebenfalls interessant sind die <Debug Header>. Falls eine Page nicht in den Cache aufgenommen werden kann, geben sie die entsprechenden Gründe an.

Caching-Strategien

Die Caching-Strategie dient dazu, Inhalte 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 einfachste Caching-Strategie ist das Cachen einer vollständigen Domain. Dabei wird vorausgesetzt, 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 all cookies
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 vorhandene Cookies ignoriert werden. Die letzte Regel gibt ggf. eine Anweisung zum Cachen. Durch die Regeln wird erreicht, dass 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 Verzeichnisstruktur 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 all cookies
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 /static/ auswirken. Durch Entfernen der Cookies sollen die Voraussetzungen für das Caching erfüllt werden.

Bestimmte Dateitypen

Angenommen auf einer Website liegen sowohl statische als auch dynamische Inhalte und es ist keine Trennung durch verschiedene Verzeichnisse gegeben. Dennoch ist es oft möglich anhand der Dateitypen festzustellen, ob eine bestimmte Ressource statischer oder dynamischer Natur ist. Regeln für die statischen Dateitypen jpg, gif und png sähen wie folgt aus:

If URL (without Query-String) ends with ".jpg" -> Remove all cookies
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 all cookies
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 all cookies
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

Sollen bestimmte Seiten als statisch bzw. cachbar markiert werden, so sind lediglich deren URLs als Bedingung zu definieren:

If URL is equal to "/static-content.html" -> Remove all cookies
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

Wir unterstützen die Nutzung von ESI, um bestimmte Seitenelemente dynamisch laden zu lassen und den Rest zu cachen. Bei genaueren Informationen bitten wir um eine Kontaktaufnahme mit dem Support.

Cache Key

Wenn WaveCDN eine Anfrage vom Webuser erhält, so wird aus der Anfrage ein sogenannter Cache Key berechnet. Anhand des Cache Keys wird dann geprüft, ob die angefragte Ressource bereits im Cache liegt. Der Cache Key setzt sich aus verschiedenen Attributen zusammen. Standardmäßig sind das bei WaveCDN folgende Attribute:

  • URL inkl. Query-String (aus der Anfrage des Webusers)
  • Attribute des Vary-Headers (der Vary-Header stammt aus der Antwort des Origins, aber gibt Anfrage-Header an)

Zusätzlich bei Anwendung der Regel "Cache with Cookies":

  • Cookie-Header (aus der Anfrage des Webusers)

Beispiel

Verschiedene Sprachen durch Sprach-Cookie

Angenommen wir haben eine Website mit einigen Pages. Wenn vom Webuser eine Page angefordert wird, unterscheidet die Webapplikation anhand des lang-Cookies, in welcher Sprache die Page ausgeliefert werden soll. Alle anderen Cookies sind nur im Browser relevant, z.B. für Google Analytics, und werden von der Webapplikation nicht benötigt.

Eine Konfiguration könnte wie folgt aussehen:

Always -> Remove all cookies
Always -> Keep cookie "lang"
Always -> Cache with cookies
Always -> Max-Age = 3600s (Sofern der Origin keine Gültigkeitsdauer übermittelt)

Die ersten beiden Regeln erreichen, dass alle Cookies bis auf den lang-Cookie entfernt werden. Die dritte Regel sorgt dafür, dass WaveCDN trotz des ggf. vorhandenen Cookie-Headers den Cache verwendet. Die letzte Regel gibt lediglich eine Anweisung zum Cachen. Wenn der Origin bereits ein Gültigkeitsdauer übermittelt, kann darauf verzichtet werden.

Explizit wird auf die Regel "Remove Set-cookie" verzichtet, da die Webapplikation in diesem Beispiel den lang-Cookie setzt und deswegen der Set-Cookie-Header durchkommen muss. Zwar ist das Vorhandensein des Set-Cookie-Header ein Verstoß gegen die Voraussetzungen für das Caching, aber der Header wird nur bei ganz bestimmten Anworten mitgeschickt. Alles andere wird gecached.

Ferner enthält die Website zahlreiche Bilder unter dem Pfad /images/. Damit beim Caching der Bilder nicht zwischen den verschiedenen Sprachen des lang-Cookies unterschieden wird, sollte man noch folgendes hinzufügen:

If URL begins with "/images/" -> Do not cache with cookies