Eu sou novo no Varnish e inverter proxies em geral. Estou testando o Varnish em um aplicativo que funciona como um blog em que tenho uma página com um "updated_at" que muda quando a página é atualizada. Como conseqüência, decidi que minha estratégia de cache deveria se basear no cabeçalho da última modificação. A razão para isso é que o usuário deseja ver a alteração imediatamente quando a página é modificada no backoffice.
Além disso, entendi que era possível adicionar um s-maxage com must-revalidate ao controle de cache, para que, se o último modificado não mudasse, o Varnish nem tentasse fazer uma nova solicitação.
Também adicionei um vencimento para o navegador, para que haja um cache do cliente. Como resultado, o navegador nem solicitará ao verniz que faça uma solicitação ao Apache novamente.
No entanto, notei que o controle de cache s-maxage tem prioridade sobre os modificados pela última vez, mesmo com a necessidade de revalidar. Além disso, mesmo se eu não adicionar um controle de cache, 'last-modified' não funcionará. O verniz usa seu ttl padrão e nada acontece. O que estou fazendo errado?
Estou usando o Symfony e estes são os cabeçalhos:
$response = new Response();
$response->setPublic();
// expiration model for the browser cache (EXPIRE)
// the browser will only make a new request to Varnish again after ten minutes (600 seconds)
$date = new \DateTime();
$date->modify('+600 seconds');
$response->setExpires($date);
// expiration model for Varnish (CACHE-CONTROL)
// Varnish will only make a new request to Apache again after one hour (3600 seconds)
// The must-revalidate tells Varnish to do this request before serving the files after one hour (it's already de default behaviour)
// cache-control has priority over expire
//$response->setSharedMaxAge(3600);
$response->headers->addCacheControlDirective('must-revalidate', true);
// validation model for varnish (LAST-MODIFIED)
// Varnish will only make a new request to Apache again if the updated_at of the page changed even if the expiration time is ended
$response->setLastModified($page->getUpdatedAt());
// if the response didn't change, stop here
if ($response->isNotModified($request)) {
return $response;
}
Aqui estão meus cabeçalhos na primeira vez em que tenho uma MISS e na segunda vez em que tenho um HIT. Então, não importa se a última modificação modifica os cabeçalhos sempre os mesmos que este segundo. (Meu navegador está desativado, por isso tenho 200 em vez de 304)
fonte
Respostas:
Não existe algo como "Última modificação não funciona". Esse cabeçalho simplesmente indica a data em que o recurso foi modificado pela última vez. Os clientes podem emitir pedidos "se não forem modificados desde" posteriormente, mas isso não é importante para sua situação.
É natural que solicitações subsequentes retornem exatamente os mesmos cabeçalhos. Objetos em verniz são armazenados em cache, incluindo as informações dos cabeçalhos. Portanto, quando o Varnish extrai uma entrada em cache, ele retornará uma cópia exata dela.
Compreendendo
Você está lidando com dois caches ao mesmo tempo: verniz e cache do navegador. Você tem apenas um conjunto de cabeçalhos HTTP por solicitação. Você não pode especificar um HTTP expira para o navegador e outro apenas para o Varnish.
Portanto, se você deseja armazenar em cache as coisas de maneira diferente (e deseja), uma solução é ajustar
beresp.ttl
no Varnish a quantidade de tempo durante a qual você deseja relaxar o back-end do PHP, ou seja: 24 horas.Em algum lugar da VCL:
Então, considerando que você mantém seu código PHP existente, o Varnish armazena em cache a primeira solicitação em uma página por 24 horas e a torna armazenável em cache pelos navegadores por 10 minutos.
Depois que o artigo for atualizado, você precisará limpar o cache do Varnish, também conhecido como Invalidação de Cache. Veja algumas dicas nesta página (role para baixo).
E ainda assim você quer que eles tenham 10 minutos de cache do navegador :)
fonte