2. Disclaimer
„Bauchentscheidungen“
nicht totoptimiert
Aufwand / Nutzen
Es gibt meistens mehr als eine Lösung
lighttpd, nginx, $webserver
XCache, APC, eAccelerator
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. 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
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.
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 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)
11. varnish: Features
VCL - Configlanguage
Loadbalancing with health checking of backends
Partial ESI support
URL rewriting
Graceful handling of dead backends
13. 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);
}
14. Varnish: VCL
TTL 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“
15. 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
}
16. 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. 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. Varnish: Purge
Content explizit invalidieren
Über Telnet-Schnittstelle oder Console-Tool
Auch Wildcards
Optional: HTTP Purge Requests
Das Webscript kann selbst Updates triggern
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
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. Wiggly lines
Was bringt varnish eigentlich?
komplett aus
nur / und feeds komplett an
33. XCache: varcache
Kann auch varcache
„memcached für arme“
Weniger Features, aber dafür ein Daemon weniger
Obskure Race-Conditions bei Wordpress
-> apc
34. 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
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