
Ich habe diesen Code in der Varnish-Konfiguration und bin mir nicht sicher, was er tut! Wird diese Konfiguration meine Client-Anfragen zwischenspeichern oder nicht? Was ist daran falsch?
sub vcl_backend_response {
if (beresp.status != 200) {
return (pass);
}
set beresp.http.X-Backend = beresp.backend.name;
unset beresp.http.cookie;
unset beresp.http.Set-Cookie;
if (bereq.http.x-render-type == "test" && beresp.http.Content-Type ~ "text/html") {
set beresp.http.Cache-Control = "no-store";
}
set beresp.http.Cache-Control = "no-store";
if (bereq.http.x-render-type == "test" && beresp.http.Content-Type ~ "text/html") {
return (pass);
}
return (deliver);
}
Antwort1
Dieser VCL-Codeblock scheint einige Regeln festzulegen, wann der Cache umgangen werden soll. Allerdings ergibt die Art und Weise, wie er geschrieben ist, nicht viel Sinn.
Umgehen des Caches
return(pass)
ist nicht die richtige Art, das Caching im vcl_backend_response
Kontext zu umgehen. return(pass)
wird verwendet, vcl_recv
wenn eine eingehende Anfrage den Cache umgeht.
Unter vcl_backend_response
Umgehung des Caches versteht man das Verhindern der Speicherung des eingehenden Objekts im Cache. Die Best Practices schreiben vor, dass Sie Folgendes tun set beresp.uncacheable = true
, eine TTL zuweisen und dann return(deliver)
. Dadurch wird sichergestellt, dass dieses Objekt den Cache für eine bestimmte Zeit umgeht, bis die nächste Backend-Antwort die erforderlichen Kriterien erfüllt.
Durch die Aktivierung beresp.uncacheable
stellen Sie sicher, dass das Objekt auf der Warteliste landet und ein Kandidat für die Anforderungszusammenführung wird.
Cookies löschen
Um Ihre Trefferquote zu verbessern, ist es oft sinnvoll, Cookies zu entfernen. Im Backend-Kontext werden Sie den Set-Cookie
Header entfernen. Dies wird in korrekterweise vcl_backend_response
durch durchgeführt unset beresp.http.Set-Cookie
, allerdings geschieht dies bedingungslos.
Dies bedeutet, dass Set-Cookie
keine Aktion ausgeführt wird, was zu inkonsistentem Verhalten führen kann. Ich bin nicht sicher, ob für das Entfernen dieser Cookies Vorbedingungen erforderlich sind.
Sie können eingehende Cookies auch über entfernen unset req.http.Cookie
. Aber es scheint einen ähnlichen Aufruf in zu geben, vcl_backend_response
der ausgeführt wird unset beresp.http.Cookie
.
Dies würde darauf hinweisen, dass ein Cookie
Antwortheader empfangen würde. Das erscheint unwahrscheinlich.
Neuschreiben der VCL
So würde ich diesen VCL-Code ohne weiteren Kontext umschreiben:
vcl 4.1;
backend default {
.host = "127.0.0.1";
.port = "80";
}
sub vcl_recv {
unset req.http.Cookie;
}
sub vcl_backend_response {
if(beresp.status != 200) {
set beresp.ttl = 120s;
set beresp.uncacheable = true;
return(deliver);
}
set beresp.http.X-Backend = beresp.backend.name;
unset beresp.http.Set-Cookie;
set beresp.http.Cache-Control = "no-store";
if (bereq.http.x-render-type == "test" && beresp.http.Content-Type ~ "text/html") {
set beresp.ttl = 120s;
set beresp.uncacheable = true;
return(deliver);
}
return (deliver);
}
Warnung: Ich würde nicht empfehlen, dies in Ihre Produktionsumgebung zu kopieren/einzufügen. Ich habe das Gefühl, dass beim Schreiben dieser VCL an einigen Stellen gespart wurde. Da ich keinen zusätzlichen Kontext habe, möchte ich nicht empfehlen, dies zu verwenden.