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)