1. bephpug
http://www.bephpug.de
1
Freitag, 13. Mai 2011
2. varnish & co
Florian Holzhauer - @fholzhauer
Vortrag bephpug Juni 2010
http://holzhauer.it
2
Freitag, 13. Mai 2011
3. Disclaimer
„Bauchentscheidungen“
nicht totoptimiert
Aufwand / Nutzen
Es gibt meistens mehr als eine Lösung
lighttpd, nginx, $webserver
XCache, APC, eAccelerator
3
Freitag, 13. Mai 2011
4. Überblick
Problem: LAMP-Maschine unter Last
varnish
Standard-Administration
fancy features
Optimierung für Faule: xCache, tuning-primer.sh
4
Freitag, 13. Mai 2011
5. 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
Freitag, 13. Mai 2011
6. Performanceschwein
Wordpress
stadt-bremerhaven.de
6
Freitag, 13. Mai 2011
7. 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
7
Freitag, 13. Mai 2011
8. 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.
8
Freitag, 13. Mai 2011
9. Super Plan.
b3091322.crawl.yahoo.net ist übrigens inzwischen seit Monaten Traffic-Platz 1..
9
Freitag, 13. Mai 2011
10. lawblog.de: 2010
300.000 Hits pro Tag
busybox httpd/1.35 varnish 2.1 + lighttpd
Eigener Server bei vollmar.net
10
Freitag, 13. Mai 2011
11. Aktuelles Setup
pound
wp_cache
varnish lighttpd php-fcgi
XCache
greensql*
monit
mysql
munin
11
Freitag, 13. Mai 2011
12. 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)
12
Freitag, 13. Mai 2011
13. varnish: Features
VCL - Configlanguage
Loadbalancing with health checking of backends
Partial ESI support
URL rewriting
Graceful handling of dead backends
13
Freitag, 13. Mai 2011
15. 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);
}
15
Freitag, 13. Mai 2011
16. 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“
16
Freitag, 13. Mai 2011
17. 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
}
17
Freitag, 13. Mai 2011
18. Varnish: ESI
Seitenteile getrennt cachen
z.B. „Widgets“
nicht alle ESI Features
index.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;
}
}
18
Freitag, 13. Mai 2011
19. Varnish: Load balancing
Health Polling
Kaputtes Backend = „auslassen“
Backendwahl: Random, Round-Robin
..oder via VCL
19
Freitag, 13. Mai 2011
20. 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.“
20
Freitag, 13. Mai 2011
21. Varnish: Purge
Content explizit invalidieren
Über Telnet-Schnittstelle oder Console-Tool
Auch Wildcards
Optional: HTTP Purge Requests
Das Webscript kann selbst Updates triggern
21
Freitag, 13. Mai 2011
22. Advanced Features
varnish-misc Mailingliste
Unterschiedliche Behandlung von Mobilclients
sticky load balancing
Mehrere Varnish-Instanzen
22
Freitag, 13. Mai 2011
23. Varnish: Tut nicht
HTTPS
Cookies
„eigene“ Content-Modifikationen
Logfiles
23
Freitag, 13. Mai 2011
24. Varnish: HTTPS
varnish spricht nur plain http
„Fix“: Pound oder Stunnel davor
Problem: $_SERVER[„HTTPS“];
Problem: $_SERVER[„REMOTE_ADDR“];
24
Freitag, 13. Mai 2011
25. Varnish: Cookies
Philosophie: „nur nicht personalisierte Seiten
cachen“
Workaround: unset beresp.http.set-cookie;
25
Freitag, 13. Mai 2011
26. Varnish: Content
Modifikationen
Varnish „interessiert“ Seiten-Content nie
ausser ESI
Nur Header-Modifikationen
in beide Richtungen
26
Freitag, 13. Mai 2011
27. 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
27
Freitag, 13. Mai 2011
28. 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
28
Freitag, 13. Mai 2011
29. Varnish: Tools
varnishhist
Geschwindigkeits-Histogramm
varnishstat
„top“ für varnish
varnishlog
zeigt/filtert shared memory log
29
Freitag, 13. Mai 2011
30. 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.
30
Freitag, 13. Mai 2011
31. Bonustrack: Monit
varnish war früher wacklig
Bei Wartungsdowntime nicht vergessen :-)
Monit checkt alle n Minuten die Prozesse
/etc/monit/conf.d/varnish
check process varnish with pidfile /var/run/varnishd.pid
start program = "/etc/init.d/varnish start"
stop program = "/etc/init.d/varnish stop"
if totalmem > 1024.0 MB for 5 cycles then restart
if loadavg(5min) greater than 10 for 8 cycles then stop
if 3 restarts within 5 cycles then timeout
31
Freitag, 13. Mai 2011
35. Genug varnish.
pound
wp_cache
varnish lighttpd php-fcgi
XCache
greensql*
monit
mysql
munin
35
Freitag, 13. Mai 2011
36. pound
Kann Loadbalancing
mit Session Handling
Kann bis auf caching viel was varnish auch kann
HTTP Sanitizing
Bei mir: Reiner HTTPS->HTTP Wrapper
36
Freitag, 13. Mai 2011
37. wp_cache
Wordpressplugin
Schreibt gerenderte Seite nach HTML
Neugeneration via wp-event-handler
„Müsste man mal:“
wp_cache triggert Purge-Request bei varnish
37
Freitag, 13. Mai 2011
38. 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
38
Freitag, 13. Mai 2011
40. XCache: varcache
Kann auch varcache
„memcached für arme“
Weniger Features, aber dafür ein Daemon
weniger
Obskure Race-Conditions bei Wordpress
40
Freitag, 13. Mai 2011
41. 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
41
Freitag, 13. Mai 2011
42. 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
42
Freitag, 13. Mai 2011
44. 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
44
Freitag, 13. Mai 2011
45. 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
45
Freitag, 13. Mai 2011