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

Varnish Techademy Slides

Joshua Thijssen
March 22, 2013
110

Varnish Techademy Slides

Joshua Thijssen

March 22, 2013
Tweet

Transcript

  1. Joshua Thijssen Freelance consultant, developer en trainer @ NoxLogic Ontwikkeling

    in PHP, Python, Perl, C, Java. Lead developer van Saffire. Blog: http://adayinthelifeof.nl Email: [email protected] Twitter: @jaytaph
  2. Hoe te verhelpen? 5 ➡ Minder bezoekers? ➡ Meer servers?

    ➡ Snellere databases? ➡ Sneller afhandeling van pageviews?
  3. 7

  4. 8 Hoe kunnen we meer (of sneller) bezoekers afhandelen op

    onze server, zonder in te boeten op de dynamiek van de site zelf?
  5. 14

  6. Wat is varnish? 16 ➡ Reverse proxy ➡ Cache ➡

    “HTTP Accelerator” ➡ Load balancing
  7. 17 ➡ Bekijkt of een request doorgezet moet worden naar

    een (bepaalde) server. ➡ Laadt paginas direct uit geheugen / disk. ➡ Kan zich ook nergens mee bemoeien (pass).
  8. DAEMON_OPTS="-a :6081 \ -T localhost:6082 \ -f /etc/varnish/default.vcl \ -S

    /etc/varnish/secret \ -s file,/var/lib/varnish/$INSTANCE/ varnish_storage.bin,1G" 19 /etc/default/varnish
  9. 27 ➡ De beste manier om de performance van Varnish

    om zeep te helpen is door cookies te gebruiken!
  10. 0+00:02:37 Hitrate ratio: 1 1 1 Hitrate avg: 0.8684 0.8684

    0.8684 2 0.00 0.01 client_conn - Client connections accepted 38 0.00 0.24 client_req - Client requests received 33 0.00 0.21 cache_hit - Cache hits 5 0.00 0.03 cache_miss - Cache misses 4 0.00 0.03 backend_conn - Backend conn. success 1 0.00 0.01 backend_reuse - Backend conn. reuses 3 0.00 0.02 backend_toolate - Backend conn. was closed 5 0.00 0.03 backend_recycle - Backend conn. recycles 5 0.00 0.03 fetch_length - Fetch with Length 5 . . n_sess_mem - N struct sess_mem 0 . . n_object - N struct object 1 . . n_objectcore - N struct objectcore 4 . . n_objecthead - N struct objecthead 2 . . n_waitinglist - N struct waitinglist 1 . . n_vbc - N struct vbc 10 . . n_wrk - N worker threads 10 0.00 0.06 n_wrk_create - N worker threads created 476724 0.00 3036.46 n_wrk_max - N worker threads limited 1 . . n_backend - N backends 5 . . n_expired - N expired objects 12 . . n_lru_moved - N LRU moved objects 38 0.00 0.24 n_objwrite - Objects sent with write 2 0.00 0.01 s_sess - Total Sessions 38 0.00 0.24 s_req - Total Requests 5 0.00 0.03 s_fetch - Total fetch 12551 0.00 79.94 s_hdrbytes - Total header bytes 6023 0.00 38.36 s_bodybytes - Total body bytes 38 0.00 0.24 sess_linger - Session Linger 38 0.00 0.24 sess_herd - Session herd 1864 0.00 11.87 shm_records - SHM records 221 0.00 1.41 shm_writes - SHM writes 5 0.00 0.03 backend_req - Backend requests made 1 0.00 0.01 n_vcl - N vcl total 1 0.00 0.01 n_vcl_avail - N vcl available 1 . . n_ban - N total active bans 1 0.00 0.01 n_ban_add - N new bans added 38 0.00 0.24 hcb_nolock - HCB Lookups without lock 3 0.00 0.02 hcb_lock - HCB Lookups with lock varnishstat 29
  11. 11 SessionOpen c 192.168.33.1 52557 :6081 11 ReqStart c 192.168.33.1

    52557 1362229287 11 RxRequest c GET 11 RxURL c /index.php 11 RxProtocol c HTTP/1.1 11 RxHeader c User-Agent: Wget/1.13 (darwin11.2.0) 11 RxHeader c Accept: */* 11 RxHeader c Host: 192.168.33.10:6081 11 RxHeader c Connection: Keep-Alive 11 VCL_call c recv lookup 11 VCL_call c hash 11 Hash c /index.php 11 Hash c 192.168.33.10:6081 11 VCL_return c hash 11 VCL_call c miss fetch 11 Backend c 13 default default varnishlog 30 client does: GET /index.php HTTP/1.1
  12. 13 BackendClose b default 13 BackendOpen b default 127.0.0.1 58862

    127.0.0.1 80 13 TxRequest b GET 13 TxURL b /index.php 13 TxProtocol b HTTP/1.1 13 TxHeader b User-Agent: Wget/1.13 (darwin11.2.0) 13 TxHeader b Accept: */* 13 TxHeader b Host: 192.168.33.10:6081 13 TxHeader b X-Forwarded-For: 192.168.33.1 13 TxHeader b X-Varnish: 1362229287 13 TxHeader b Accept-Encoding: gzip 13 RxProtocol b HTTP/1.1 13 RxStatus b 200 13 RxResponse b OK 13 RxHeader b Date: Tue, 05 Mar 2013 09:29:58 GMT 13 RxHeader b Server: Apache/2.2.22 (Ubuntu) 13 RxHeader b X-Powered-By: PHP/5.3.10-1ubuntu3.5 13 RxHeader b Cache-Control: max-age=5 13 RxHeader b Vary: Accept-Encoding 13 RxHeader b Content-Encoding: gzip 13 RxHeader b Content-Length: 76 13 RxHeader b Content-Type: text/html 13 Fetch_Body b 4(length) cls 0 mklen 1 13 Length b 76 13 BackendReuse b default varnishlog 31 varnish does a request to the backend
  13. 11 TTL c 1362229287 RFC 5 -1 -1 1362475798 0

    1362475798 0 5 11 VCL_call c fetch deliver 11 ObjProtocol c HTTP/1.1 11 ObjResponse c OK 11 ObjHeader c Date: Tue, 05 Mar 2013 09:29:58 GMT 11 ObjHeader c Server: Apache/2.2.22 (Ubuntu) 11 ObjHeader c X-Powered-By: PHP/5.3.10-1ubuntu3.5 11 ObjHeader c Cache-Control: max-age=5 11 ObjHeader c Vary: Accept-Encoding 11 ObjHeader c Content-Encoding: gzip 11 ObjHeader c Content-Type: text/html 11 Gzip c u F - 76 57 80 80 537 11 VCL_call c deliver deliver 11 TxProtocol c HTTP/1.1 11 TxStatus c 200 11 TxResponse c OK 11 TxHeader c Server: Apache/2.2.22 (Ubuntu) 11 TxHeader c X-Powered-By: PHP/5.3.10-1ubuntu3.5 11 TxHeader c Cache-Control: max-age=5 11 TxHeader c Vary: Accept-Encoding 11 TxHeader c Content-Type: text/html 11 TxHeader c Transfer-Encoding: chunked 11 TxHeader c Date: Tue, 05 Mar 2013 09:29:58 GMT 11 TxHeader c X-Varnish: 1362229287 11 TxHeader c Age: 0 11 TxHeader c Via: 1.1 varnish 11 TxHeader c Connection: keep-alive 11 Gzip c U D - 76 57 80 80 537 11 Length c 0 11 ReqEnd c 1362229287 1362475798.096096039 1362475798.097167492 0.000139713 0.000934362 0.000137091 11 SessionClose c EOF 11 StatSess c 192.168.33.1 52557 0 1 1 0 0 1 300 0 varnishlog 32 varnish delivers
  14. 1:1, n = 42 | | | | | |

    | | | | | | | | || || || || ||| ||| |||| # | |||| || ## +--------+--------+--------+--------+--------+--------+--------+--------+-------- |1e-6 |1e-5 |1e-4 |1e-3 |1e-2 |1e-1 |1e0 |1e1 |1e2 varnishhist 33 hits misses
  15. VCL ➡ Varnish heeft zijn eigen DSL. ➡ Erg makkelijk

    (maar kan uiteraard niet alles). ➡ Maar mogelijk op vmod / C code te gebruiken. 35 https://www.varnish-cache.org/docs/3.0/reference/index.html
  16. Wat staat in een VCL file? 36 ➡ Backend Declarations

    ➡ Directors (groep van backends) ➡ Backend Probes ➡ ACLs ➡ Subroutines ➡ Speciale subroutines vcl_* ➡ “Raw” C code (sweet!)
  17. VCL voorbeelden 37 sub vcl_recv { if (req.http.host ~ "(?i)example.com")

    { set req.backend = foo; } elsif (req.http.host ~ "(?i)example.org") { set req.backend = bar; } } sub vcl_deliver { if (obj.hits > 0) { set resp.http.X-Cache = "HIT"; } else { set resp.http.X-Cache = "MISS"; } }
  18. VCL ➡ Aantal standaard “objecten” ➡ req - Request van

    de client ➡ bereq - Request naar de backend ➡ beresp - Response van de backend ➡ obj - Het object dat uit de cache komt ➡ Niet elk object is overal en altijd beschikbaar! 38
  19. req ➡ req.request ➡ req.backend ➡ req.http.content-type ➡ obj.ttl ➡

    obj.hits 39 https://www.varnish-cache.org/docs/3.0/reference/ vcl.html#variables
  20. Varnish Flow ➡ Varnish maakt gebruik van een specifieke flow.

    ➡ Je kunt inhaken op deze flow en je eigen custom zaken regelen. ➡ Hoeft meestal niet zo complex te zijn. 40
  21. 41

  22. 42

  23. vcl_recv ➡ “bepaald” wat er met een request gebeurd ➡

    Doorsturen naar de cache (lookup) ➡ Cache overslaan (pass) ➡ Doorpassen van data (pipe) 43
  24. vcl_pipe ➡ data wordt uit de backend opgevraagd ➡ data

    wordt ZONDER TUSSSENKOMST doorgestuurd naar de client. ➡ Handig voor streaming etc, wanneer varnish niet nodig is. 44
  25. vcl_pass ➡ data wordt opgevraagd uit de backend, maar wordt

    niet opgeslagen in de cache. ➡ Lijkt een beetje op pipe, maar gaat wel door de hele “varnish flow” heen. 45
  26. vcl_hash ➡ Creert een hash waarmee wordt bekijken of iets

    bestaat in de cache. 46 sub vcl_hash { hash_data(req.url); if (req.http.host) { hash_data(req.http.host); } else { hash_data(server.ip); } return (hash); }
  27. vcl_hit ➡ Wanneer de hash in de cache is gevonden

    ➡ Nu heb je een “Req” en “Obj” object om mee te werken ➡ return(pass): Vraag opnieuw aan de backend ➡ return(deliver): Lever het cached object af aan de client 47
  28. vcl_miss ➡ Wanneer de hash in de cache NIET is

    gevonden ➡ Nu heb je een “Req” en “BeReq” object om mee te werken. ➡ return(pass): Vraag opnieuw aan de backend ➡ return(fetch):Vraag opnieuw aan de backend (rechtstreeks, dus niet door vcl_pass) 48
  29. vcl_fetch ➡ Heeft de HEADER uit de backend opgevraagd (dus

    nog niet de body) ➡ Nu heb je een “Req” en “BeReq” en “BeResp” object om mee te werken. ➡ return(deliver): Haalt body op van backend en stored dit in “Obj” cq Cache ➡ return(hit_for_pass): 49
  30. hit for pass ➡ Dit response is niet te cachen.

    Store in de cache onder de request hash: “obj.f.pass = true”. 50
  31. vcl_deliver ➡ “Are you sure” moment ➡ return(deliver) stuurt de

    response terug naar de client (houdt ook rekening met streaming) 51
  32. leuke “VCL” dingen ➡ Hit/Miss info ➡ Creeer “Custom” HTTP

    methodes (PURGE) ➡ Fixeer naar specifieke backends dmv HTTP headers. ➡ HotLinking 52
  33. sub vcl_deliver { if (obj.hits > 0) { set resp.http.X-Cache

    = "HIT"; set resp.http.X-Cache-Hits = obj.hits; } else { set resp.http.X-Cache = "MISS"; } } 54
  34. sub vcl_recv { if (req.http.host == "www.example.com" && req.url ~

    "^/fun/" && (req.http.referer && req.http.referer !~ "^http://www.example.com/")) { " " error 403 "No hotlinking please"; " } } 55
  35. 57 ➡ ESI is ontwikkeld door o.a. Akamai ➡ GEEN

    w3c standaard! ➡ Varnish ondersteund niet alles van de specificatie (alleen include & remove)
  36. 59 <html> <head></head> <body> <div id=”container”> <div id=”topmenu”> <esi:include src=

    “esi/topmenu.html”> </div> <div id=”main”> <div id=”lft_menu”> <esi:include src= “esi/menu.html”> <div> <esi:include src= “esi/mainheader.html”> ... Content ... <esi:include src= “esi/sidebar.html”> </div> </body> </html>
  37. 61 ➡ Per “object” bepalen van cache en cache- tijden

    (of helemaal niet cachen!) ➡ Makkelijk migreren naar nieuwe software / servers.
  38. 62 <html> <head></head> <body> <div id=”container”> <div id=”topmenu”> <esi:include src=

    “esi/topmenu.html”> </div> <div id=”main”> <div id=”lft_menu”> <esi:include src= “esi/menu.html”> <div> <esi:include src=“esi/mainheader.html”> ... Content ... <esi:include src= “http://v2.nu.nl/esi/sidebar.html”> </div> </body> </html>
  39. 66 backend default { .host = “127.0.0.1”; .port = “8080”;

    } backend superserver { .host = “10.1.2.100”; .port = “80”; .connect_timeout = 1s; .probe = { .url = “/ping.html”; .timeout = 1s; } } director d1 random { .retries = 3; { .backend = “default”; .weight = 1; } { .backend = “superserver”; .weight = 5; } }
  40. 68 ➡ Backend generatie duurt 30 seconde. ➡ 60 views

    per minuut (1 per seconde). ➡ Cache-Control: max-age=60 ➡ Wat gebeurt er na een minuut?
  41. 69 sub vcl_recv { set req.grace = 2m; } sub

    vcl_fetch { set obj.grace = 2m; }
  42. 70 sub vcl_recv { if (req.backend.healty) { set req.grace =

    2m; } else { set req.grace = 1h; } } sub vcl_fetch { set obj.grace = 1h; }