O verniz não funciona com a última modificação

1

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)

primeiro pedido

segundo pedido

unadivadantan
fonte
Alguma discussão que você pode encontrar útil nesta resposta
Colt
Obrigado pela sua resposta @Colt, mas esta outra discussão é mais sobre os diferentes servidores que podemos usar em um aplicativo com Varnish. Estou procurando informações mais detalhadas sobre como definir meus cabeçalhos http para trabalhar com o Varnish. De qualquer forma, obrigado;)
unadivadantan

Respostas:

0

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.ttlno 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:

sub vcl_backend_response {
    # A TTL of 24h
    # set beresp.ttl = 24h;
}

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).

A razão para isso é que o usuário deseja ver a alteração imediatamente quando a página é modificada no backoffice.

E ainda assim você quer que eles tenham 10 minutos de cache do navegador :)

Danila Vershinin
fonte