Migrando Varnish 2.1 para Varnish 3.0

Nas últimas semanas tenho tido a oportunidade de ficar mais próximo do Varnish, e nas últimas três semanas comecei a migrar do varnish 2.1 para Varnish 3, posso dizer desde já que teve um grande salto de melhorias e também de implementações. Mas neste post irei tratar apenas de como preparar sua configuração de vcl para não ser pego de supresa quando fazer um upgrade da versão.

O exemplo de vcl a seguir foi retirado do svn do Varnish: https://www.varnish-cache.org/trac/browser/etc/zope-plone.vcl e será com base neste vcl que iremos efetuar a migração.

Breve resumo das mudanças de 2.1.5 para 3.0.0

  • Suporte ao módulo VMODs [3].
  • Suporte a Compressão e descompressão, incluindo compressão de fragmentos ESI.
  • Suporte a carregamento preliminar de streaming, tanto em cache ou não.
  • Melhor documentação.
  • Melhor valores padrão para parâmetros.
  • varnishncsa agora com suporte de log com formatos personalizado.
  • varnishlog, varnishncsa  e varnishhist agora com suporte a filtros de registros que correspondem múltiplas expressões.

Para uma lista mais detalhada de alterações leia o

documento de alterações

.

Alterações na VCL.

  • log

    foi movido para o

    vmod std

    .[4]

log "Olá mundo";

torna-se

import std; std.log "Olá mundo";

Nota.

A importação do

std

só é preciso ser feito uma única vez e usada por toda a VCL.

  • purge

    agora torna-se o chamadas 

    ban

    , ou como dito na

    VCL

    , são funções ban.

purge()

e

purge_url()

são agora, respectivamente

ban()

e

ban_url()

, sendo assim deve-se substituir todas as ocorrências: 

purge(“req.url = ” req.url);

para

ban(“req.url = ” + req.url);


purge

 continua existindo porém não leva nenhum argumento mais, e ainda pode ser usado em

vcl_hit

ou

vcl_miss

para fazer purge de itens do cache, onde você iria reduzir o

ttl

a 0 no Varnish 2.1.

 sub vcl_hit {    if (req.request == “PURGE”) {       set obj.ttl = 0s; error 200 “Purged.”;    } }

torna-se

sub vcl_hit {    if (req.request == “PURGE”) {       purge; error 200 “Purged.”;    } }

  • beresp.cacheable está fora.

beresp.cacheable está fora do Varnish 3, mas pode ser substituído por beresp.ttl> 0s

  • returns agora é feito com a função return()

pass, pipe, lookup, deliver, fetch, hash, pipe e restart não são mais palavras-chave, mas argumentos para a função return(), então:

sub vcl_pass { pass; }

torna-se

sub vcl_pass { return(pass); }

  • req.hash foi substituído por hash_data()

Não apendamos mais o

hash

 com

+=

set req.hash += req.url;

Agora torna-se

hash_data(req.url);

  • esi substituído por beresp.do_esi

Não habilitamos ESI com

esi.

esi;

no

vcl_fetch

tonar-se

set beresp.do_esi = true;

pass em vcl_fetch foi renomeado para hit_for_pass

A diferença no comportamento do pass em vcl_recv e vcl_fetch confundem as pessoas, apenas para torna mais claro as coisas, eles são diferentes :) e agora devemos usar return(hit_for_pass) onde usava-se pass no vcl_fetch.

  • NOTA.

O Varnish 3 também teve uma mudança de comportamento, isso significa que ele irá retornar um erro quando cabeçalhos forem muito grandes ao em vez de apenas ignorá-los. E se os limites são muito baixos, retornará HTTP 413, então deve-se  alterar limits por http_req_hdr_len e http_req_size. Essas alterações devem ser feitas em tempo de execução, o que significa adicionar como parâmetro do executável varnishd,   exemplo (-p http_req_hdr_len=4096 -p http_req_size=1024).

Para maiores informações sobre parâmetros em tempo de execução acesse a documentação[5].

Migrando.

Eis aqui nosso exemplo retirado do svn do Varnish, porém convertido para a versão 3.0, retirei quais quer comentários da VCL e efetuei a migração, acredito que depois da explicação dos parâmetros acima você seja capaz de migrar a sua configuração.

backend default {

.host = "127.0.0.1";

.port = "9673"; } acl purge {

"localhost";

"192.0.2.0"/24; } sub vcl_recv {         if (req.http.host ~ "(www.)?example.com") {                 set req.http.host = "example.com";

set req.url = regsub(req.url, "^", "/VirtualHostBase/http/example.com:80/example.com/VirtualHostRoot");         } elsif (req.http.host ~ "(www.)?example.org") {                 set req.http.host = "example.org";

set req.url = regsub(req.url, "^", "/VirtualHostBase/http/example.org:80/example.org/VirtualHostRoot");         } else {                 error 404 "Unknown virtual host.";         }         if (req.request != "GET" && req.request != "HEAD") {                 if (req.request == "POST") {                         return(pass);                 }                                  if (req.request == "PURGE") {                         if (!client.ip ~ purge) {                                 error 405 "Not allowed.";                         }                         return(lookup);                 }         }         if (req.http.Cookie && req.http.Cookie ~ "__ac(|_(name|password|persistent))=") {

if (req.url ~ "\.(js|css)") {                         remove req.http.cookie;                         return(lookup);                 }                 return(pass);         } } sub vcl_hit {         if (req.request == "PURGE") {                 purge;                 error 200 "Purged";         } } sub vcl_miss {         if (req.request == "PURGE") {                 error 404 "Not in cache";         } } sub vcl_fetch {         if (beresp.ttl < 3600s) {                 set beresp.ttl = 3600s;         } } 

Indicação de leitura.

  1. Varnish Reference (Inglês)
  2. Using Varnish (Inglês)

  3. VMOD - Varnish Modules (Inglês)

  4. vmod-std (Inglês)

  5. Run-Time Parameters (Inglês)