Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Varnish reverse proxy.

Varnish reverse proxy.

Introduction and some config examples on Varnish reverse proxy.

Avatar for Paulo M. Silva

Paulo M. Silva

January 11, 2013
Tweet

Other Decks in Technology

Transcript

  1. VCL (Varnish Configuration Language) • Baseada em sub-rotinas; • Código

    executado em momentos diferentes; Sintaxe • Similar a C (não muito); • Operadores lógicos: =, ==, ~ (match), !, &&, ||
  2. Requests, responses and objects • req Requisição vinda do usuário.

    • beresp Resposta do servidor. • obj Objeto em cache (apenas obj.ttl pode ser alterado)
  3. Actions • pass Passar para o servidor e responder sem

    "cachear". • hit_for_pass "Cachear" pass. • lookup Responder da cache mesmo que o request indicar o contrário.
  4. vcl_recv • Chamada assim que receber e parsear uma requisição.

    • Decidir passar para o servidor (ou não). • Alterar cookies (ou não). • Alterar cabeçalhos que chegarão ao servidor (ou não). • Objeto disponivel: req
  5. vcl_recv sub vcl_recv { # Pass requests that are not

    GET or HEAD if (req.request != "GET" && req.request != "HEAD") { return(pass); } }
  6. vcl_fetch • Chamada assim que receber a resposta do servidor.

    • Decide "cachear" (ou não). • Alterar cookies (ou não). • Alterar cabeçalhos que serão enviados ao cliente (ou não). • Objetos disponiveis: req e beresp (backend response)
  7. vcl_fetch sub vcl_fetch { # Do not cache the object

    if the backend does not want us to! if (bereq.http.Cache-control ~ "(no-cache|no-store|private)") { return(hit_for_pass); } # Cache and return the object return(deliver); }
  8. Configurando o servidor (backend) backend default { .host = "192.168.1.3";

    .port = "3000"; } backend admin{ .hots = "192.168.1.3"; .port = "3001" }
  9. Configurando o servidor (backend) sub vcl_recv { if (req.url ~

    "^/admin/") { set req.backend = admin; } else { set req.backend = default. } }
  10. Configurando o servidor (directors) backend server1 { .host = "192.168.1.3";

    .port = "3000"; } backend server2{ .hots = "192.168.1.4"; .port = "3000" }
  11. Configurando o servidor (Health checks) backend server1 { .host =

    "server1. example.com"; .probe = { .url = "/"; .interval = 5s; .timeout = 1 s; .window = 5; .threshold = 3; } } backend server2 { .host = "server2. example.com"; .probe = { .url = "/"; .interval = 5s; .timeout = 1 s; .window = 5; .threshold = 3; } }
  12. Configurando o servidor (Health checks) url: URL para Varnish usar

    no teste. interval: Intervalo entre janelas. timeout: Tempo máximo de espera para um request. window: Quantos requests formam uma janela de teste. threshold: Quantos requests devem ser bem sucedidos em uma janela para considerar o servidor healthy. initial: Quantas janelas de teste devem ser bem sucedidas para o Varnish iniciar (default = threshold).
  13. Configurando o servidor (Misbehaving servers) Problema: varnish "vazar" muitos request

    simultâneos para o servidor e tempo de resposta aumentar. Grace mode Permitir cachear conteúdo por um tempo maior que o TTL definido. sub vcl_fetch{ set beresp.grace = 30m; }
  14. Configurando o servidor (Misbehaving servers) Grace mode sub vcl_recv{ set

    resp.grace = 15s; } Varnish considera entregar conteúdo de sua cache com idade de até 15 segundos a mais que seu TTL.
  15. Configurando o servidor (Misbehaving servers) Grace mode sub vcl_recv{ if

    (resp.backend.healthy){ set resp.grace = 15s; }else{ set resp.grace = 30m; } }
  16. Configurando o servidor (Misbehaving servers) Saint mode sub vcl_fetch{ if

    (beresp.status == 500){ set beresp.saintmode = 10s; return(restart); } set beresp.grace = 5m; }
  17. O que mais? PURGE - 'apagar' a cache do varnish

    para uma determinada URL; Websockets - vcl_pipe; Device detection - req.http.User-Agent...;