Knowledge Base


« Content Delivery Network (CDN)

CDN Cache controle en Invalidatie

Een CDN slaat uw objecten op binnen een mondiaal netwerk van caching servers. Vervolgens worden uw objecten vanuit deze caching servers geserveerd. Objecten die niet opgevraagd worden zullen na verloop van tijd van de caching servers worden verwijderd maar als objecten wel opgevraagd worden dan zouden ze in principe doorlopend in het CDN kunnen blijven bestaan.

Het probleem hierbij is dat nieuwe versies van het object niet in de CDN kunnen komen als de oude versie van het object blijft bestaan. Om deze reden raden wij het aan een maximale levensduur aan een object te geven. Dit kunt u bereiken met Cache-Control Headers.

Cache-Control HTTP Headers

Cache-Control headers zijn HTTP Headers die de cache vertellen wanneer een object moet vervallen of hoelang een object in de cache mag blijven. Deze headers worden normaal gesproken gezet door de Origin Server, bijvoorbeeld Apache in het geval van een server of in de meta-data in het geval van een objectstore.

In RFC 2616 (sectie 14.9) vindt u de beschijving van de Cache-Control HTTP header in detail. Hieronder de belangrijkste levensduur bepalende waarden:

max-age=$seconds
Dit is de belangrijkste waarde die in de header gezet kan worden om een object een bepaalde levensduur te geven. De max-age waarde overschrijft dan ook altijd aanwijzingen die in een Expires header gezet worden. (RFC 2616 sectie 14.9.3).

De waarde van de leefttijd is in seconden, dus wanneer een object maximaal 15 minuten mag bestaan dan zou de header zijn: Cache-Control: max-age=900. Wij raden voor de meeste toepassingen een maximale levensduur tussen de 1 en 60 minuten aan.

must-revalidate
Wij raden het ook aan deze waarde in de Cache-Control header op te nemen. Deze vertelt de cache dat de regels die worden meegeven in de HTTP Header strict gevolgt moeten worden. Sommige caches willen nog wel eens wat vrijheden nemen met het volgen van levensduur parameters. In ons voorbeeld wordt de cache gedwongen om na 900 seconden bij Origin Server te controleren of er een nieuwe versie van het object is.

public
Deze waarde forceert dat een object altijd gecachet wordt, ook al zou dit normaal gesproken niet gebeuren.

Conclusie

Wanneer een object 15 minuten gecachet moet worden raden wij de volgende header aan:
Cache-Control: public, max-age=900, must-revalidate

 

Actieve Invalidatie

Nu zijn er uiteraard situaties denkbaar dat het afwachten tot een object 'uit de cache valt' niet acceptabel is. Voor deze situaties is het mogelijk om een invalidatie request te sturen naar het CDN.

Een invalidatie request mag nooit de standaard manier zijn om objecten te verversen in de cache. Gebruik hiervoor de Cache-Control headers.

Invalidatie requests kunnen via onze interface of de CDN-API gegeven worden. Gebruik deze echter als laatste redmiddel, de invalidatie request zijn namelijk 'dure' requests en hebben een performance impace. Als u ze te vaak gebruikt dan zult u de fair-use regels van het CloudVPS CDN overtreden.

 

Het configureren van de Cache-Control headers.

Hieronder een paar voorbeelden waar en hoe de Cache-Control headers gezet kunnen worden. We nemen voor de webserver Apache en Nginx als voorbeelden , voor de object store laten we het instellen van de interface zien en geven een voorbeeld van een OpenStack API aanroep.

Apache2 webserver
Om de Cache-Control header te zetten is het nodig dat de module mod_headers geladen is. Samen met de FilesMatch directive kunt u voor specifieke file-extenties de Cache-Control header zetten. Onderstaand voorbeeld kan zowel in een .htaccess als in een VirtualHost blok geconfigureerd worden.

<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
  Header set Cache-Control "public, max-age=900, must-revalidate"
</FilesMatch>

Nginx webserver
Voor de Nginx webserver is het nodig dat de ngx_http_headers_module geladen is. Het voorbeeld is valide in de server configuratie.

location ~* ^.+\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$ {
  add_header Cache-Control "public, max-age=900, must-revalidate";
}

De ObjectStore (interface)
In de CloudVPS Customer interface is het mogelijk om per bestand, in de container die is aangewezen als Origin, de meta-data aan te passen. HTTP Headers vallen in de categorie 'Special Fields'.

Om bij de meta-data van een bestand te komen gaat u in de CloudVPS Interface naar de tab ObjectStore en daarna naar de sub-tab 'Manager'. Kies (indien relevant) het juiste project en daarna de juiste container. Selecteer het object wat bewerkt moet worden, de metadata wordt dan geladen.

In dat scherm ziet u het kopje 'Special Fields' in de Meta-data kolom. Klik op de plus button van de Special Fields, een dialoog opent zich. Hier kiest u Cache-Control en vul de juiste waarde in. Klik op de Save button en de Cache-Control header is toegevoegd aan het bestand.

De ObjectStore (API)
Omdat Cache-Control een HTTP Header is kan deze met een POST opgracht op een object gezet worden. Een POST op een object vervangt de huidige headers, het is daarom belangrijk om bestaande kritische headers mee te sturen. Denk hierbij aan de Content-Type Header, die onder andere in browsers bepaald van welk type (image/jpeg, video/mp4, text/plain, etc) het bestand is en hoe deze getoont wordt. In ons voorbeeld updaten we een jpeg plaatje op een linux commandline en gebruiken hiervoor cURL:

curl -X POST -H "X-Auth-Token: $keystone_token"  \
-H "Cache-Control: public, max-age=900, must-revalidate" \
-H "Content-type: image/jpeg" \
https://$container.$projectid.objectstore.eu/photo-1.jpg

API documentatie kunt u vinden op onze download pagina.

VPS Bestellen
VPS Bestellen