
我正在使用 Django 和 Varnish 4。
我正在努力實現這一目標:
- 如果請求不是針對主頁的,則通過(我目前嘗試僅緩存主頁來測試它等)
- 如果 cookie 'sessionid' 存在,則為每個會話傳遞或快取
- 其他:透過
這是子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;
到目前為止,當以匿名方式呼叫主頁時,Varnish 似乎總是為每個它產生一個新頁面。我可以使用 Varnish 發送的標頭來判斷(“age”始終為 0,“X-Varnish”始終為不同的數字)。
要么是我的配置缺少某些內容,要么是因為 Django 在回應中發送了“Vary: Cookie”?如果是這樣的話,在這種情況下我怎麼能從 Varnish 中「隱藏」cookie(僅適用於匿名用戶)?
答案1
「問題」是 Django 發送了一個「Vary: Cookie」標頭每時每刻。我認為這是因為“auth”插件,但我沒有調查這一點,我只是在回應從伺服器返回時刪除了標頭。
以下是 Varnish 的文檔對於「vary: cookie」的說法:
另一個錯誤使用的例子是僅使用 Vary: Cookie 來區分回應。同樣,可能存在大量的 cookie,因此存在大量的快取對象,這些對像很可能只能由其原始請求者檢索。
來源:https://www.varnish-software.com/book/4.0/chapters/HTTP.html#vary
這是我的 VCL 配置的樣子(我刪除了上面的部分,它只是伺服器配置):
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);
}
}