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
foi movido para ovmod std
.[4]log "Olá mundo";
torna-se
import std; std.log "Olá mundo";
Nota.
A importação do
stdsó é 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
agora torna-se o chamadasban
, ou como dito naVCL
, 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_hitou
vcl_misspara fazer purge de itens do cache, onde você iria reduzir o
ttla 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.
beresp.cacheable está fora do Varnish 3, mas pode ser substituído por beresp.ttl> 0s
returns agora é feito com a função return()
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()
req.hash foi substituído por hash_data()
Não apendamos mais o
hashcom
+=set req.hash += req.url;
Agora torna-se
hash_data(req.url);
esi substituído por beresp.do_esi
esi substituído por beresp.do_esi
Não habilitamos ESI com
esi.
esi;
no
vcl_fetchtonar-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.
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.