varnish & coFlorian Holzhauer - @fholzhauerVortrag bephpug Juni 2010http://holzhauer.it
2Freitag, 13. Mai 2011
Disclaimer
„Bauchentscheidungen“
nicht totoptimiert
Aufwand / Nutzen
Es gibt meistens mehr als eine Lösung
lighttpd, nginx, $webserver
XCache, APC, eAccelerator
3Freitag, 13. Mai 2011
Überblick
Problem: LAMP-Maschine unter Last
varnish
Standard-Administration
fancy features
Optimierung für Faule: xCache, tuning-primer.sh
4Freitag, 13. Mai 2011
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.
5Freitag, 13. Mai 2011
PerformanceschweinWordpress
stadt-bremerhaven.de
6Freitag, 13. Mai 2011
lawblog.de: 2005
„Wahnsinn, 3.000 Besucher an einem Tag!“
..und dann kam Spiegel Online
Load > 70, lokale Konsole tot
Apache 1.3, Wordpress 1.5, nichts optimiert
7Freitag, 13. Mai 2011
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.
8Freitag, 13. Mai 2011
Super Plan.
b3091322.crawl.yahoo.net ist übrigens inzwischen seit Monaten Traffic-Platz 1..
9Freitag, 13. Mai 2011
lawblog.de: 2010300.000 Hits pro Tag
busybox httpd/1.35 varnish 2.1 + lighttpd
Eigener Server bei vollmar.net
10Freitag, 13. Mai 2011
Aktuelles Setup
pound
varnish lighttpd php-fcgi
greensql*
mysql
wp_cache
XCache
monit
munin
11Freitag, 13. Mai 2011
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 G1 2XDualcore 2.66 Ghz with 6 GB of RAM.Running Centos5.3. Only tuning is /var/lib/varnish on tmpfs“
(Aus: varnish-misc Mailingliste)
12Freitag, 13. Mai 2011
varnish: Features
VCL - Configlanguage
Loadbalancing with health checking of backends
Partial ESI support
URL rewriting
Graceful handling of dead backends
13Freitag, 13. Mai 2011
Varnish: Konzept
14Freitag, 13. Mai 2011
Varnish: VCL
sub 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); }
15Freitag, 13. Mai 2011
Varnish: VCL
TTL und Co für die jeweilige Seite anpassen
Alter Content darf länger in den Cache
Grafiken: welche ändern sich oft, welche nie?
vcl_hash: „Was ist der selbe Request“
16Freitag, 13. Mai 2011
Varnish: VCL
In VCL programs, C program code can be put anywhere, simply by enclosing it in C{ ... }C
sub 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 }
17Freitag, 13. Mai 2011
Varnish: ESISeitenteile 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; }}
18Freitag, 13. Mai 2011
Varnish: Load balancing
Health Polling
Kaputtes Backend = „auslassen“
Backendwahl: Random, Round-Robin
..oder via VCL
19Freitag, 13. Mai 2011
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.“
20Freitag, 13. Mai 2011
Varnish: Purge
Content explizit invalidieren
Über Telnet-Schnittstelle oder Console-Tool
Auch Wildcards
Optional: HTTP Purge Requests
Das Webscript kann selbst Updates triggern
21Freitag, 13. Mai 2011
Advanced Features
varnish-misc Mailingliste
Unterschiedliche Behandlung von Mobilclients
sticky load balancing
Mehrere Varnish-Instanzen
22Freitag, 13. Mai 2011
Varnish: Tut nicht
HTTPS
Cookies
„eigene“ Content-Modifikationen
Logfiles
23Freitag, 13. Mai 2011
Varnish: HTTPS
varnish spricht nur plain http
„Fix“: Pound oder Stunnel davor
Problem: $_SERVER[„HTTPS“];
Problem: $_SERVER[„REMOTE_ADDR“];
24Freitag, 13. Mai 2011
Varnish: Cookies
Philosophie: „nur nicht personalisierte Seiten cachen“
Workaround: unset beresp.http.set-cookie;
25Freitag, 13. Mai 2011
Varnish: Content Modifikationen
Varnish „interessiert“ Seiten-Content nie
ausser ESI
Nur Header-Modifikationen
in beide Richtungen
26Freitag, 13. Mai 2011
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
27Freitag, 13. Mai 2011
varnish: 2.1
Bei Howtos aufpassen:
varnish 2.1 ist an verschiedenen Stellen mit anderer Syntax
pre-2.1-Config lassen sich nicht immer starten
machen seltsame Dinge
Änderung: req heisst nun beresp
28Freitag, 13. Mai 2011
Varnish: Tools
varnishhist
Geschwindigkeits-Histogramm
varnishstat
„top“ für varnish
varnishlog
zeigt/filtert shared memory log
29Freitag, 13. Mai 2011
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.
30Freitag, 13. Mai 2011
Bonustrack: Monit
varnish war früher wacklig
Bei Wartungsdowntime nicht vergessen :-)
Monit checkt alle n Minuten die Prozesse
/etc/monit/conf.d/varnishcheck process varnish with pidfile /var/run/varnishd.pidstart program = "/etc/init.d/varnish start"stop program = "/etc/init.d/varnish stop"if totalmem > 1024.0 MB for 5 cycles then restartif loadavg(5min) greater than 10 for 8 cycles then stopif 3 restarts within 5 cycles then timeout
31Freitag, 13. Mai 2011
Bonustrack: MuninWiggly lines!
Rudimentäres Tresholdmonitoring, nagios-Anbindung
32Freitag, 13. Mai 2011
Wiggly linesWas bringt varnish eigentlich?
komplett aus
komplett annur / und feeds
33Freitag, 13. Mai 2011
Wiggly lines II
34Freitag, 13. Mai 2011
Genug varnish.
35
pound
varnish lighttpd php-fcgi
greensql*
mysql
wp_cache
XCache
monit
munin
Freitag, 13. Mai 2011
pound
Kann Loadbalancing
mit Session Handling
Kann bis auf caching viel was varnish auch kann
HTTP Sanitizing
Bei mir: Reiner HTTPS->HTTP Wrapper
36Freitag, 13. Mai 2011
wp_cache
Wordpressplugin
Schreibt gerenderte Seite nach HTML
Neugeneration via wp-event-handler
„Müsste man mal:“
wp_cache triggert Purge-Request bei varnish
37Freitag, 13. Mai 2011
wp_cache
Kann auch via .htaccess bzw lighty-lua direkt auf HTML, kein PHP-Interpreter mehr im Spiel
Nur noch historisch anwesender „Fallback“, bringt wegen varnish nur wenig Geschwindigkeit
38Freitag, 13. Mai 2011
XCache: Opcode
PHP Opcode Caching
Unbedingt Default-Config „aufbohren“
Web-Interface hilft
39Freitag, 13. Mai 2011
XCache: varcache
Kann auch varcache
„memcached für arme“
Weniger Features, aber dafür ein Daemon weniger
Obskure Race-Conditions bei Wordpress
40Freitag, 13. Mai 2011
MySQL „Tuning“
Halbe „Wissenschaft“
Gute Literatur
Aber: Oft reicht auch die faule Variante
..und ich bin gern faul :-)
http://www.day32.com/MySQL/
tuning_primer.sh
41Freitag, 13. Mai 2011
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
42Freitag, 13. Mai 2011
tuning_primer.sh
43Freitag, 13. Mai 2011
GreenSQL
„MySQL-Firewall“
Hängt vor dem MySQLd
Versucht Injections zu erkennen
learning mode
„Risk score“
SELECT ... WHERE user=x AND password=y OR 1
44Freitag, 13. Mai 2011
GreenSQL
Snake Oil?
„dann brauchen wir ja im Code nicht mehr validieren“
Eher: Letzte Rettung bei Wordpress 0-days
Wenn der Proof of Concept Exploit nicht tut, geht das Scriptkidde vielleicht einfach weg
45Freitag, 13. Mai 2011
Caching
„Your mileage may vary“
Caching massiv Anwendungsspezifisch
Blind überall cachen bringt Ärger
Race Conditions
Redundante Datenhaltung
Cache purging?
46Freitag, 13. Mai 2011
Caching
Besser: Bottlenecks finden
PHP Profiling
Benchmarks
Ideal: Applikation braucht gar keinen Cache
47Freitag, 13. Mai 2011
Danke :-)
Fragen?
http://www.varnish-cache.org
http://www.apsis.ch/pound/
http://www.greensql.net
http://xcache.lighttpd.net/
48Freitag, 13. Mai 2011
Aktuelles Setup
pound
varnish lighttpd php-fcgi
greensql*
mysql
wp_cache
XCache
monit
munin
49Freitag, 13. Mai 2011
50Freitag, 13. Mai 2011
Top Related