Desenvolvimento

6 abr, 2018

Varnish: mesmo hash, resultados diferentes? Verifique o header Vary!

Publicidade

Eu admito que fico mordido pelo header Vary uma vez a cada poucos meses. É algo que muitos CMSs adicionam aleatoriamente, e isso tem um impacto sério sobre como o Varnish manipula e trata solicitações.

Por exemplo, aqui está uma solicitação na qual eu estava solucionando problemas com esses dados varnishlog hashlog():

-   VCL_call       HASH
-   Hash           "/images/path/to/file.jpg%00"
-   Hash           "http%00"
-   Hash           "www.yoursite.tld%00"
-   Hash           "/images/path/to/file.jpg.jpg%00"
-   Hash           "www.yoursite.tld%00"
-   VCL_return     lookup
-   VCL_call       MISS

Uma nova solicitação fornecendo exatamente os mesmos dados de hashing, retornaria uma página diferente do cache/back-end. Então, por que uma solicitação com o mesmo hash retorna dados diferentes?

Deixe-me apresentar o header Vary.

Nesse caso, a página que eu estava solicitando adicionou o seguinte header:

Vary: Accept-Encoding,User-Agent

Isso instrui o Varnish a manter uma versão separada de cada página para cada valor de Accept-Encoding e User-Agent que ele encontrar.

O Accept-Encoding faria sentido, mas o Varnish já lida com isso internamente. Uma versão gziped/plain retornará dados diferentes, isso faz sentido. Não há nenhum ponto real em adicionar esse header para o Varnish, mas outros proxies intermediários ainda podem se beneficiar dele.

O User-Agent é um absurdo, por que você serviria uma versão diferente de uma página por navegador? Se você considera uma string típica do User-Agent para conter texto como Mozilla/5.0 (Macintosh; Intel Mac OS X, etc) AppleWebKit/537.xx (KHTML, como o Gecko) Chrome/65.xyz Safari /xxx, isso é praticamente único por visitante que você tem.

Então – hack rápido, nesse caso – eu removo o header Vary completamente.

sub vcl_backend_response {
  unset beresp.http.Vary;
  ...
}

Não há mais variações do cache com base no que um CMS aleatório faz ou diz.

***

Mattias Geniar faz parte do time de colunistas internacionais do iMasters. A tradução do artigo é feita pela Redação iMasters, com autorização do autor, e você pode acompanhar o artigo em inglês no link: https://ma.ttias.be/varnish-hash-different-results-check-vary-header/