Por que estou obtendo uma média baixa de taxa de acertos em cache no verniz?

2

Alguém sabe por que estamos obtendo uma média muito baixa de taxa de acertos do cache ao usar o Wordpress (com o Varnish e o Nginx)?

Estatísticas do verniz mostram:

Hitrate ratio: 10 100 518 Hitrate avg: 0.4143 0.2690 0.1948

Alguma ideia de como corrigir isso? Meu verniz default.vcl é:

# This is a basic VCL configuration file for varnish.  See the vcl(7)
# man page for details on VCL syntax and semantics.
#
# Default backend definition.  Set this to point to your content
# server.
#
backend default {
    .host = "77.81.240.177";
    .port = "8080";
}

acl purge {
    "77.81.240.177";
}

sub vcl_recv {

    # Add a unique header containing the client address
    remove req.http.X-Forwarded-For;
    #set    req.http.X-Forwarded-For = client.ip;
    set    req.http.X-Forwarded-For = req.http.rlnclientipaddr;    

    # Let's make sure we aren't compressing already compressed formats.
    if (req.http.Accept-Encoding) {
        if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|mp3|mp4|m4v)(\?.*|)$") {
            remove req.http.Accept-Encoding;
        } elsif (req.http.Accept-Encoding ~ "gzip") {
            set req.http.Accept-Encoding = "gzip";
        } elsif (req.http.Accept-Encoding ~ "deflate") {
            set req.http.Accept-Encoding = "deflate";
        } else {
            remove req.http.Accept-Encoding;
        }
    }

    if (req.request == "PURGE") {
        if (!client.ip ~ purge) {
            error 405 "Not allowed.";
        }
        return(lookup);
    }

    if (req.url ~ "^/$") {
        unset req.http.cookie;
    }
}

sub vcl_hit {
    if (req.request == "PURGE") {
        set obj.ttl = 0s;
        error 200 "Purged.";
    }
}

sub vcl_miss {
    if (req.request == "PURGE") {
        error 404 "Not in cache.";
    }

    if (!(req.url ~ "wp-(login|admin)")) {
        unset req.http.cookie;
    }

    if (req.url ~ "^/[^?]+.(jpeg|jpg|png|gif|ico|js|css|txt|gz|zip|lzma|bz2|tgz|tbz|html|htm)(\?.|)$") {
        unset req.http.cookie;
        set req.url = regsub(req.url, "\?.$", "");
    }

    if (req.url ~ "^/$") {
        unset req.http.cookie;
    }
}

sub vcl_fetch {
    if (req.url ~ "^/$") {
        unset beresp.http.set-cookie;
    }

    if (!(req.url ~ "wp-(login|admin)")) {
        unset beresp.http.set-cookie;
    }

    if (req.url ~ "^/w00tw00t") {
        error 403 "Not permitted";
    }
}
    
por THpubs 22.03.2012 / 07:28

2 respostas

4

Uma boa abordagem é inspecionar o tráfego com o vernizlog para ver o que faz com que as regras se apliquem.

Como você não está aplicando um TTL, meu palpite é que o site wordpress fornece cabeçalhos de Cache-Control como "max-age: 0" ou "no-cache" "private" ou algo assim, e o verniz respeita esses cabeçalhos a menos que você diga especificamente que não, por exemplo:

 sub vcl_fetch {
     if (!(req.url ~ "wp-(login|admin)")) {
         unset beresp.http.set-cookie;
         set beresp.ttl = 3600s;
     }

A primeira regra em vcl_fetch não faz sentido, já que a segunda regra irá cancelar todos os set-cookies para todos os urls, exceto wp-login / wp-admin.


Adicione alguma configuração ao vcl_deliver para os cabeçalhos de saída que indicam se é um hit ou não:

sub vcl_deliver {
        if (obj.hits > 0) {
                set resp.http.X-Cache = "HIT";
        } else {
                set resp.http.X-Cache = "MISS";
        }
     return (deliver);
}

Outro feedback para a sua configuração:

Em vcl_recv, você "desconfigura req.http.cookie" se url não for wp-login ou wp-admin, o que significa que se um usuário efetuar login no / wp-login, então irá para "/", você irá desanexar seu biscoito. Você precisa apenas desmarcar cookies em vcl_recv para urls que nunca precisem de um, ie (js | css | png | jpg) etc, e em vez disso remover o set-cookie em vcl_fetch.

    
por 22.03.2012 / 08:15
2

wp-verniz

Faça check-out wp-verniz - Um plugin para o WordPress que irá limpar o conteúdo do verniz quando o conteúdo do WordPress for alterado. Ele também vem com uma amostra VCL que deve lhe dar uma melhor taxa de acerto

VCL de amostra

backend default {
  .host = "127.0.0.1";
  .port = "8080";
}

acl purge {
  "localhost";
}

sub vcl_recv {
  if (req.request == "PURGE") {
    if(!client.ip ~ purge) {
      error 405 "Not allowed.";
    }
    return(lookup);
  }

  if (req.request != "GET" &&
      req.request != "HEAD" &&
      req.request != "PUT" &&
      req.request != "POST" &&
      req.request != "TRACE" &&
      req.request != "OPTIONS" &&
      req.request != "DELETE") {
    return (pipe);
  }

  if (req.request != "GET" && req.request != "HEAD") {
    return (pass);
  }

  if (req.url ~ "wp-(login|admin)" || req.url ~ "preview=true") {
    return (pass);
  }

  remove req.http.cookie;
  return (lookup);
}

sub vcl_hit {
  if (req.request == "PURGE") {
    purge;
    error 200 "Purged.";
  }
}

sub vcl_miss {
  if (req.request == "PURGE") {
    purge;
    error 200 "Purged.";
  }
}

sub vcl_fetch {
  if (req.url ~ "wp-(login|admin)" || req.url ~ "preview=true") {
    return (hit_for_pass);
  }

  set beresp.ttl = 24h;
  return (deliver);
}
    
por 22.03.2012 / 08:58