Como armazenar sites em cache usando Varnish, PHP e Cookies

2

Eu considero começar a usar o Varnish em meus sites. Acabei de experimentar o Verniz e estou pensando em como fazer o cache de páginas, mesmo que meus sites usem cookies, para o Google Analytics. Eu estou tentando removê-los, mas parece que o Varnish não está em cache. É assim que minha configuração se parece; link . Se importa, eu tenho um servidor Debian e um servidor usando o Ubuntu Server. Então, como faço para armazenar em cache o site, mesmo se eu estiver usando cookies?

Obrigado antecipadamente!

Adição: eu não recebo nenhum X-Cache: HIT / MISS também. O que estou fazendo errado?

    
por Erik 28.10.2010 / 07:12

6 respostas

2

Sou relativamente novo no cache com o Varnish, mas eis o que aprendi até agora: há vários fatores a serem considerados ao usar o Varnish para armazenar em cache em um aplicativo.

No seu caso, saiba quais cookies estão sendo definidos e com qual finalidade. Se o verniz vir um cookie com sua solicitação, você será passado para o backend, resultando em uma falha de cache.

Cookies do Google Analytics

Se você estiver usando os cookies do Google Analytics, poderá desativá-los com segurança no verniz. não se preocupe, você ainda manterá os dados nos relatórios do GA. Use algo assim em seu vcl_recv

set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(__[a-z]+|__utma_a2a)=[^;]*", "");

Você pode tentar mais algumas linhas de limpeza, também no vcl_recv

Remover ";" prefixos de cookies

set req.http.Cookie = regsub(req.http.Cookie, "^;\s*", "");

Cancelar cookies vazios

if (req.http.Cookie ~ "^\s*$") {
  unset req.http.Cookie;
}

Cookies específicos de aplicativos

Se o seu aplicativo definir um cookie quando um usuário fizer login para executar uma função, essas solicitações não serão armazenadas em cache e enviadas diretamente para o back-end. Caso contrário, você poderia armazenar em cache páginas visualizadas por usuários logados (ruins).

Use algo assim:

if (req.http.Authorization || req.http.Cookie) {
  return (pass);
}

HTH & boa sorte.

Editar

Use isso para ver o que o verniz dos cookies está passando:

varnishtop -i RxHeader -I Cookie

Se você está com saudade de algum, pegue-os aqui!

    
por 03.02.2012 / 03:14
0

Eu não sei sobre o Varnish. Mas, de acordo com minha experiência em administração de servidores, experimente essas coisas em sua LAN primeiro, e depois vá para a Internet.

    
por 28.10.2010 / 07:29
0

Isso é o que o cabeçalho Vary em http é para: variações que devem retornar o mesmo recurso. O verniz compreende um Vary: cookies .

Se você não está recebendo os cabeçalhos X-Cache, você pode não estar se conectando ao cache; tem certeza que está rodando no ip / port correto?

    
por 28.10.2010 / 08:38
0

Você pode passar algumas partes do seu site para back-end sem fazer o cache.

Exemplo mais simples para blocos vcl_recv e vcl_fetch:

sub vcl_recv {
if (req.url ~ "^/somescript.php") {                       
return (pass);                                                          
}                                                                       
else {                                                                  
unset req.http.Cookie;                                                  
}
return(lookup);
}

sub vcl_fetch {
if (req.url ~ "^/somescript.php") {                       
return (pass);                                                          
}                                                                       
else {                                                                  
unset req.http.Cookie;                                                  
}
return(deliver);
}

Leia - leia isto para entender por que o Varnish perde

    
por 28.10.2010 / 10:13
0

execute vernizlog e veja se você está realmente passando por um verniz

    
por 30.09.2011 / 00:47
0

Minha recomendação é verificar quais URLs você realmente precisa de cookies (por exemplo, painel de administração) e remover cookies de todos os outros URLs. Veja abaixo um exemplo:

sub vcl_recv {
  if (req.url ~ "^/admin/") {
    # administration panel
    set req.http.admin = 1;
  } else {
    # public web site, ignore client request for fresh content, remove cookies
    unset req.http.Cache-Control;
    unset req.http.Max-Age;
    unset req.http.Pragma;
    unset req.http.Cookie;
  }
  ...
}

sub vcl_fetch {
  if (req.http.admin == 1) {
    # administration panel
    return (hit_for_pass);
  } else {
    # public web site, not allowed to set cookies
    unset beresp.http.Set-Cookie;
    ...
  }
  ...
}
    
por 10.04.2012 / 16:45