Was macht dieser Varnish-Codeblock?

Was macht dieser Varnish-Codeblock?

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_responseKontext zu umgehen. return(pass)wird verwendet, vcl_recvwenn eine eingehende Anfrage den Cache umgeht.

Unter vcl_backend_responseUmgehung 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.uncacheablestellen 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-CookieHeader entfernen. Dies wird in korrekterweise vcl_backend_responsedurch durchgeführt unset beresp.http.Set-Cookie, allerdings geschieht dies bedingungslos.

Dies bedeutet, dass Set-Cookiekeine 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_responseder ausgeführt wird unset beresp.http.Cookie.

Dies würde darauf hinweisen, dass ein CookieAntwortheader 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.

verwandte Informationen