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

Varnish Techademy Slides

Avatar for Joshua Thijssen Joshua Thijssen
March 22, 2013
110

Varnish Techademy Slides

Avatar for Joshua Thijssen

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; }