varnish & coFlorian Holzhauer - @fholzhauerphp unconference hamburg 2012http://holzhauer.it
Disclaimer „Bauchentscheidungen“   nicht totoptimiert   Aufwand / Nutzen Es gibt meistens mehr als eine Lösung   lighttpd,...
ÜberblickProblem: LAMP-Maschine unter Lastvarnish  Standard-Administration  fancy featuresOptimierung für Faule: xCache, t...
Beispiel: lawblog.de Kein „echtes“ Kundenprojekt, trotzdem viel Last   Guter Kontakt, alle Adminfreiheiten   Testbed für n...
lawblog.de: 2005„Wahnsinn, 3.000 Besucher an einem Tag!“..und dann kam Spiegel Online  Load > 70, lokale Konsole totApache...
Schnapsidee: Blacklist Viele Bots, Crawler, komische Scripte wget -m http://www.lawblog.de/   „Offline lesen“ (...) Idee: A...
Super Plan. b3091322.crawl.yahoo.net ist übrigens inzwischen seit Monaten Traffic-Platz 1..
lawblog.de: 2012 busybox httpd/1.35 varnish 3 + lighttpd 1.4 Eigener Server bei vollmar.net
Aktuelles Setup pound varnish   lighttpd   php-fpm                       mysql
varnish    Reverse Proxy    „Squid is 1975 architecture, varnish 2006“      http://varnish-cache.org/wiki/ArchitectNotes„O...
varnish: Features VCL - Configlanguage Loadbalancing with health checking of backends Partial ESI support URL rewriting Gra...
Varnish: Konzept
Varnish: VCLsub vcl_fetch {    if (req.url ~ "^/index.php/archives/200") {        set beresp.http.Cache-Control = "max-age...
Varnish: VCLTTL für die jeweilige Seite anpassenAlter Content darf länger in den CacheGrafiken: welche ändern sich oft, wel...
Varnish: VCL    In VCL programs, C program code can be put    anywhere, simply by enclosing it in C{ ... }Csub vcl_fetch {...
Varnish: ESI     Seitenteile getrennt cachen        z.B. „Widgets“        nicht alle ESI Featuresindex.html:<HTML><BODY>Th...
Varnish: Load balancingHealth Polling  Kaputtes Backend = „auslassen“Backendwahl: Random, Round-Robin  ..oder via VCL
Varnish: Backend tricks Neuen Content abholen während alter noch ausgeliefert wird Defektes Backend: Interne TTL hochdrehe...
Varnish: PurgeContent explizit invalidierenÜber Telnet-Schnittstelle oder Console-Tool  Auch WildcardsOptional: HTTP Purge...
Varnish: Tut nicht HTTPS Cookies „eigene“ Content-Modifikationen Logfiles
Varnish: HTTPSvarnish spricht nur plain http„Fix“: Pound oder Stunnel davorProblem: $_SERVER[„HTTPS“];Problem: $_SERVER[„R...
Variablen-Workaroundauto_prepend_file = /var/www/prepend.php<?phpif(array_key_exists(HTTP_X_FORWARDED_PROTO,$_SERVER)){  if...
Varnish: CookiesPhilosophie: „nur nicht personalisierte Seiten cachen“Workaround: unset beresp.http.set-cookie;
Varnish: ContentModifikationenVarnish „interessiert“ Seiten-Content nie  ausser ESINur Header-Modifikationen  in beide Richt...
Varnish: logfiles Varnish hat sehr gute Debuggingtools   aber: Log nur in shared memory, wird nicht   geschrieben „Fix“: va...
Varnish: Tools varnishhist   Geschwindigkeits-Histogramm varnishstat   „top“ für varnish varnishlog   zeigt/filtert shared ...
varnish: Quick‘n dirty Webserver von Port 80 wegziehen vi /etc/default/varnish   varnish auf Port 80 vi /etc/varnish/defau...
Wiggly lines Was bringt varnish eigentlich?                   komplett aus nur / und feeds                  komplett an
Wiggly lines II
Genug varnish. pound varnish   lighttpd   php-fpm                       mysql
poundKann Loadbalancing mit Session Handling Kann bis auf caching viel was varnish auch kann HTTP SanitizingBei mir: Reine...
XCache: Opcode PHP Opcode Caching Unbedingt Default-Config „aufbohren“ Web-Interface hilft
XCache: varcacheKann auch varcache„memcached für arme“  Weniger Features, aber dafür ein Daemon wenigerObskure Race-Condit...
MySQL „Tuning“Halbe „Wissenschaft“Gute LiteraturAber: Oft reicht auch die faule Variante  ..und ich bin gern faul :-)http:...
tuning_primer.sh Braucht „bc“ MySQLd sollte mindestens 24 Stunden laufen sh ./tuning_primer.sh   „Übersetzt“ MySQL-Status-...
tuning_primer.sh
Caching„Your mileage may vary“  Caching massiv AnwendungsspezifischBlind überall cachen bringt Ärger  Race Conditions  Redu...
CachingBesser: Bottlenecks finden  PHP Profiling  BenchmarksIdeal: Applikation braucht gar keinen Cache
Danke :-) Fragen? http://www.varnish-cache.org http://www.apsis.ch/pound/ https://gist.github.com/3378020
Varnish PHP Unconference Hamburg 2012
Upcoming SlideShare
Loading in …5
×

Varnish PHP Unconference Hamburg 2012

1,216 views
1,158 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,216
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Varnish PHP Unconference Hamburg 2012

    1. 1. varnish & coFlorian Holzhauer - @fholzhauerphp unconference hamburg 2012http://holzhauer.it
    2. 2. Disclaimer „Bauchentscheidungen“ nicht totoptimiert Aufwand / Nutzen Es gibt meistens mehr als eine Lösung lighttpd, nginx, $webserver XCache, APC, eAccelerator
    3. 3. ÜberblickProblem: LAMP-Maschine unter Lastvarnish Standard-Administration fancy featuresOptimierung für Faule: xCache, tuning-primer.sh
    4. 4. Beispiel: lawblog.de Kein „echtes“ Kundenprojekt, trotzdem viel Last Guter Kontakt, alle Adminfreiheiten Testbed für neue Tools Sehr gutes Besucher-Feedback Klassische L(A)MP-Anwendung: Wordpress, Lighttpd, MySQL, PHP.
    5. 5. lawblog.de: 2005„Wahnsinn, 3.000 Besucher an einem Tag!“..und dann kam Spiegel Online Load > 70, lokale Konsole totApache 1.3, Wordpress 1.5, nichts optimiert
    6. 6. Schnapsidee: Blacklist Viele Bots, Crawler, komische Scripte wget -m http://www.lawblog.de/ „Offline lesen“ (...) Idee: Automatisiert die Top-5-Traffic-erzeuger jeden Monat in die Blacklist.
    7. 7. Super Plan. b3091322.crawl.yahoo.net ist übrigens inzwischen seit Monaten Traffic-Platz 1..
    8. 8. lawblog.de: 2012 busybox httpd/1.35 varnish 3 + lighttpd 1.4 Eigener Server bei vollmar.net
    9. 9. Aktuelles Setup pound varnish lighttpd php-fpm mysql
    10. 10. varnish Reverse Proxy „Squid is 1975 architecture, varnish 2006“ http://varnish-cache.org/wiki/ArchitectNotes„One varnish doing about 4320 million req/day, peaks at 8K reqs/s.This particular varnishbox is a HP Proliant BL460c G12XDualcore 2.66 Ghz with 6 GB of RAM.Running Centos5.3. Only tuning is /var/lib/varnish on tmpfs“(Aus: varnish-misc Mailingliste)
    11. 11. varnish: Features VCL - Configlanguage Loadbalancing with health checking of backends Partial ESI support URL rewriting Graceful handling of dead backends
    12. 12. Varnish: Konzept
    13. 13. Varnish: VCLsub vcl_fetch { if (req.url ~ "^/index.php/archives/200") { set beresp.http.Cache-Control = "max-age=1000"; set beresp.ttl = 600s; unset beresp.http.set-cookie; return (deliver); } if (req.url ~ "^/$") { set beresp.http.Cache-Control = "max-age=30"; set beresp.ttl = 15s; unset beresp.http.set-cookie; return (deliver); } if (req.url ~ ".(png|gif|jpg|swf|css|js)$") { set beresp.http.Cache-Control = "max-age=14400"; set beresp.ttl = 1w; unset beresp.http.set-cookie; return (deliver); }
    14. 14. Varnish: VCLTTL für die jeweilige Seite anpassenAlter Content darf länger in den CacheGrafiken: welche ändern sich oft, welche nie?vcl_hash: „Was ist der selbe Request“
    15. 15. Varnish: VCL In VCL programs, C program code can be put anywhere, simply by enclosing it in C{ ... }Csub vcl_fetch { if (req.url ~ "^/something-special") { C{! ! syslog(LOG_ERR, "Spurious response from backend: xid %s request %s %s"%s" %d "%s" "%s"", VRT_r_req_xid(sp), VRT_r_req_request(sp),VRT_GetHdr(sp, HDR_REQ, "005host:"), VRT_r_req_url(sp),VRT_r_obj_status(sp), VRT_r_obj_response(sp), VRT_GetHdr(sp, HDR_OBJ,"011Location:"));! }C }
    16. 16. Varnish: ESI Seitenteile getrennt cachen z.B. „Widgets“ nicht alle ESI Featuresindex.html:<HTML><BODY>The time is: <esi:include src="/cgi-bin/date.cgi"/> at this very moment.</BODY></HTML>config:sub vcl_fetch { if (req.url == "/index.html") { esi; /* Do ESI processing */ set obj.ttl = 24 h; } elseif (req.url == "/cgi-bin/date.cgi") { set obj.ttl = 1m; }}
    17. 17. Varnish: Load balancingHealth Polling Kaputtes Backend = „auslassen“Backendwahl: Random, Round-Robin ..oder via VCL
    18. 18. Varnish: Backend tricks Neuen Content abholen während alter noch ausgeliefert wird Defektes Backend: Interne TTL hochdrehen („grace“) Gestaltbare Fehlermeldung „Der Webserver wird einer Wartung unterzogen. Etwas Geduld.“
    19. 19. Varnish: PurgeContent explizit invalidierenÜber Telnet-Schnittstelle oder Console-Tool Auch WildcardsOptional: HTTP Purge Requests Das Webscript kann selbst Updates triggern
    20. 20. Varnish: Tut nicht HTTPS Cookies „eigene“ Content-Modifikationen Logfiles
    21. 21. Varnish: HTTPSvarnish spricht nur plain http„Fix“: Pound oder Stunnel davorProblem: $_SERVER[„HTTPS“];Problem: $_SERVER[„REMOTE_ADDR“];
    22. 22. Variablen-Workaroundauto_prepend_file = /var/www/prepend.php<?phpif(array_key_exists(HTTP_X_FORWARDED_PROTO,$_SERVER)){ if ($_SERVER[HTTP_X_FORWARDED_PROTO] == https) { $_SERVER[HTTPS]=on; }else{ $_SERVER[HTTPS]=; }}if (array_key_exists(HTTP_X_FORWARDED_FOR,$_SERVER)) { $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];} else if (array_key_exists("HTTP_CLIENT_IP",$_SERVER)) { $ip = $_SERVER["HTTP_CLIENT_IP"];} else { $ip = $_SERVER["REMOTE_ADDR"];}$_SERVER[REMOTE_ADDR] = $ip;
    23. 23. Varnish: CookiesPhilosophie: „nur nicht personalisierte Seiten cachen“Workaround: unset beresp.http.set-cookie;
    24. 24. Varnish: ContentModifikationenVarnish „interessiert“ Seiten-Content nie ausser ESINur Header-Modifikationen in beide Richtungen
    25. 25. Varnish: logfiles Varnish hat sehr gute Debuggingtools aber: Log nur in shared memory, wird nicht geschrieben „Fix“: varnishncsa Liest shared memory, schreibt nach Apache-format- Log
    26. 26. Varnish: Tools varnishhist Geschwindigkeits-Histogramm varnishstat „top“ für varnish varnishlog zeigt/filtert shared memory log
    27. 27. varnish: Quick‘n dirty Webserver von Port 80 wegziehen vi /etc/default/varnish varnish auf Port 80 vi /etc/varnish/default.vcl backend anpassen: Webserver-IP und -Port Starten, fertig.
    28. 28. Wiggly lines Was bringt varnish eigentlich? komplett aus nur / und feeds komplett an
    29. 29. Wiggly lines II
    30. 30. Genug varnish. pound varnish lighttpd php-fpm mysql
    31. 31. poundKann Loadbalancing mit Session Handling Kann bis auf caching viel was varnish auch kann HTTP SanitizingBei mir: Reiner HTTPS->HTTP Wrapper
    32. 32. XCache: Opcode PHP Opcode Caching Unbedingt Default-Config „aufbohren“ Web-Interface hilft
    33. 33. XCache: varcacheKann auch varcache„memcached für arme“ Weniger Features, aber dafür ein Daemon wenigerObskure Race-Conditions bei Wordpress-> apc
    34. 34. MySQL „Tuning“Halbe „Wissenschaft“Gute LiteraturAber: Oft reicht auch die faule Variante ..und ich bin gern faul :-)http://www.day32.com/MySQL/ tuning_primer.sh
    35. 35. tuning_primer.sh Braucht „bc“ MySQLd sollte mindestens 24 Stunden laufen sh ./tuning_primer.sh „Übersetzt“ MySQL-Status-Variablen Read-Only Nicht einfach blind übernehmen
    36. 36. tuning_primer.sh
    37. 37. Caching„Your mileage may vary“ Caching massiv AnwendungsspezifischBlind überall cachen bringt Ärger Race Conditions Redundante Datenhaltung Cache purging?
    38. 38. CachingBesser: Bottlenecks finden PHP Profiling BenchmarksIdeal: Applikation braucht gar keinen Cache
    39. 39. Danke :-) Fragen? http://www.varnish-cache.org http://www.apsis.ch/pound/ https://gist.github.com/3378020

    ×