配置 Varnish 4 VCL 為匿名使用者僅快取特定頁面(使用 Django)

配置 Varnish 4 VCL 為匿名使用者僅快取特定頁面(使用 Django)

我正在使用 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);
        }
}

相關內容