Configurando o Varnish 4 VCL para armazenar em cache somente uma página específica para usuários anônimos (com Django)

2

Estou usando o Django com o Varnish 4.

Estou tentando conseguir isso:

  • Se a solicitação não for para a home page, passe (estou tentando apenas armazenar em cache a home page no momento para testá-la, etc.)
  • Se o cookie 'sessionid' estiver presente, passe ou armazene em cache para cada sessão
  • Mais alguma coisa: passar

Aqui está a configuração de 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;

Até agora, o verniz parece sempre gerar uma nova página para cada um ao chamar a página inicial como anônima. Eu posso dizer usando os cabeçalhos de verniz enviar (a 'idade' é sempre 0 e 'X-Varnish' é sempre um número diferente).

Ou a minha configuração está faltando alguma coisa, ou é porque o Django envia um 'Vary: Cookie' na resposta? Se for o caso, como posso 'esconder' cookies do verniz nesse caso (somente para usuários anônimos)?

    
por mrmuggles 15.10.2015 / 22:25

1 resposta

2

O 'problema' foi que o Django enviou um cabeçalho 'Vary: Cookie' o tempo todo . Eu acho que é por causa do plugin 'auth', mas eu não investiguei isso, apenas deletei o cabeçalho quando a resposta voltou do servidor.

Veja o que o documento de Varnish tem a dizer sobre "vary: cookie":

Another example of bad usage is when using only Vary: Cookie to differentiate a response. Again, there could be a very large number of cookies and hence a very large number of cached objects, which are going to be retrieved most likely only by their original requesters.

Fonte: link

Aqui está a aparência da minha configuração do VCL (removi a parte superior, que é simplesmente a configuração do servidor):

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);
        }
}
    
por 16.10.2015 / 09:29

Tags