2017-07-30 3 views
0

J'essaie de mettre en cache une partie de mon application Web.Varnish Cache et en-têtes

J'ai un point d'extrémité à http://website.dev/pictures/:id qui renvoie des images générées PHP. Parfois, le point de terminaison peut avoir une largeur et une hauteur dans la chaîne de requête pour définir la dimension de l'image: http://website.dev/pictures/:id?w=100&h=100. Donc, je voudrais mettre ces requêtes en cache pendant très longtemps.

J'ai essayé VCL très simple que je suis nouveau et je ne veux pas faire des choses compliquées:

vcl 4.0; 


backend default { 
    .host = "127.0.0.1"; 
    .port = "80"; 
} 

sub vcl_recv { 
    if (req.url ~ "^/api/pictures" && req.method ~ "GET") { 
     # I heard that it was better to unset the cookies here to allow cache 
     unset req.http.cookie; 
     return (hash); 
    } 

    return (pass); 
} 

sub vcl_deliver { 
    if (obj.hits > 0) { 
     set resp.http.X-Cache = "HIT"; 
    } else { 
     set resp.http.X-Cache = "MISS"; 
    } 
} 

Mais maintenant, je reçois tous MISS mes demandes. J'ai essayé de modifier les réponses à venir de mon back-end afin d'avoir un contrôle approprié cache et arrive à échéance en-têtes:

Response Headers: 
Accept-Ranges:bytes 
Age:0 
Cache-Control:max-age=10000, private 
Connection:keep-alive 
Content-Length:96552 
Content-Type:image/jpeg 
Date:Sun, 30 Jul 2017 16:41:58 GMT 
Expires:Fri, 01 Jan 2100 00:00:00 GMT 
Server:nginx/1.10.3 (Ubuntu) 
Via:1.1 varnish (Varnish/5.1) 
X-Cache:MISS 
X-RateLimit-Limit:60 
X-RateLimit-Remaining:57 
X-Varnish:32772 

Request Headers 
view source 
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 
Accept-Encoding:gzip, deflate 
Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4,es;q=0.2 
Cache-Control:max-age=0 
Connection:keep-alive 
Cookie:_ga=xxxxxxxxxxxxx 
Host:website.dev:6081 
Upgrade-Insecure-Requests:1 
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36 

Où suis-je pas ici? Comment est-ce que je pourrais m'assurer que les demandes sur ces extrémités et seulement sont cachées par Varnish pendant une très longue période?

Répondre

2

La raison pour laquelle il ne cache pas comme prévu est parce que votre application web envoie:

Cache-Control: max-age = 10000, privé

Le intégré dans la logique VCL prevents caching in presence of Cache-Control: private.

Le meilleur plan d'action ici serait de fixer votre application: soit coller à l'utilisation de Cache-Control avec publique de type ou l'enlever et ne garder que la tête Expires.

Si vous ne souhaitez pas corriger l'application ou si vous ne souhaitez pas la modifier, vous devez ajouter un peu de VCL. Ce qui suit fera en sorte que la « logique intégrée VCL » mentionné ci-dessus n'empêchera pas la mise en cache en présence de Cache-Control: private:

sub vcl_backend_response { 
    if (beresp.ttl <= 0s || 
     beresp.http.Set-Cookie || 
     beresp.http.Surrogate-control ~ "no-store" || 
     (!beresp.http.Surrogate-Control && 
     beresp.http.Cache-Control ~ "no-cache|no-store") || 
     beresp.http.Vary == "*") { 
     /* 
     * Mark as "Hit-For-Pass" for the next 2 minutes 
     */ 
     set beresp.ttl = 120s; 
     set beresp.uncacheable = true; 
    } 
    return (deliver); 
} 

Enfin, pendant que votre application envoie en-tête appropriée Expires pour la mise en cache, il est ignoré par Varnish puisque l'en-tête Cache-Control est prioritaire. (selon les spécifications HTTP). Notez-le car sa valeur sera utilisée comme durée pour que Varnish cache l'objet. (Et non valeur de Expires)