.png)
Ich verwende Django mit Varnish 4.
Ich versuche Folgendes zu erreichen:
- Wenn sich die Anforderung nicht auf die Startseite bezieht, weitergeben (ich versuche im Moment nur, die Startseite zu testen usw., zwischenzuspeichern).
- Wenn das Cookie „sessionid“ vorhanden ist, für jede Sitzung weitergeben oder zwischenspeichern
- Alles andere: Pass
Hier ist die Konfiguration von Sub vcl_recv:
# cache only home page
if (! req.url == "/") {
return(pass);
}
# not caching if cookie sessionid is present
if (req.http.Cookie ~ "sessionid") {
return(pass);
}
unset req.http.cookie;
Bisher scheint Varnish beim anonymen Aufruf der Homepage immer eine neue Seite zu generieren. Ich kann das anhand der Header erkennen, die Varnish sendet (das „Alter“ ist immer 0 und „X-Varnish“ ist immer eine andere Zahl).
Entweder fehlt in meiner Konfiguration etwas oder es liegt daran, dass Django in der Antwort ein „Vary: Cookie“ sendet? Wenn das der Fall ist, wie kann ich in diesem Fall Cookies vor Varnish „verstecken“ (nur für anonyme Benutzer)?
Antwort1
Das „Problem“ war, dass Django einen „Vary: Cookie“-Header schicktedie ganze Zeit. Ich denke, es liegt am ‚Auth‘-Plugin, aber das habe ich nicht untersucht, sondern nur den Header gelöscht, als die Antwort vom Server zurückkam.
Folgendes sagt die Varnish-Dokumentation zu ‚vary: cookie‘:
Ein weiteres Beispiel für eine falsche Verwendung ist die Verwendung von nur Vary: Cookie zur Differenzierung einer Antwort. Auch hier könnte es eine sehr große Anzahl von Cookies und damit eine sehr große Anzahl zwischengespeicherter Objekte geben, die höchstwahrscheinlich nur von ihren ursprünglichen Anforderern abgerufen werden.
Quelle:https://www.varnish-software.com/book/4.0/chapters/HTTP.html#vary
So sieht meine VCL-Konfiguration aus (ich habe den oberen Teil entfernt, der lediglich die Serverkonfiguration darstellt):
sub vcl_recv
{
# caching only home page
if (! req.url == "/") {
return(pass);
}
# not caching if cookie sessionid present
if (req.http.Cookie ~ "sessionid") {
return(pass);
}
unset req.http.cookie;
}
sub vcl_backend_response
{
if (bereq.url == "/") {
unset beresp.http.Vary;
return(deliver);
}
}