Es gibt gute Artikel zu einer anspruchsvollen Einbindung von Varnish in einen Magento-Shop mit AJAX oder mit ESI. Für einen mittelgroßen Shop lohnt sich die dafür notwendige Anpassung jedoch nicht. Dieser Artikel zeigt eine Minimalkonfiguration, die sich mit 2 Personentagen Abstimmungs-, Installations- und Anpassungsaufwand umsetzen lässt. Hinzu kommen noch ca. 30€ zusätzliche Hosting-Kosten im Monat für Varnish selbst und für zusätzlichen Hauptspeicher. So können wir im Vergleich zu den oben genannten anspruchsvollen Lösungen 80% der Zugriffe mit 20% des Aufwands beschleunigen.
Varnish installieren
Die Installation an sich ist in wenigen Schritten getan. Für Ubuntu gibt es z.B. hier auf der offiziellen Seite eine Kurzanleitung: varnish-cache. Anschließend muss Apache umkonfiguriert werden, um auf Port 8080 statt auf dem Standard-Port 80 zu antworten. Auf Port 80 soll stattdessen Varnish antworten. Wo die Ports konfiguriert werden, ist ebenfalls auf der Varnish-Seite beschrieben: varnish-software. Varnish wird mit einer eigenen Sprache konfiguriert, der Varnish Configuration Language (VCL). Für den Anfang erstellen wir eine „dumme“ VCL-Datei, die alle Anfragen direkt an Apache durchreicht. Dazu bekommt die Datei /etc/varnish/default.vcl folgenden Inhalt:
backend default { .host = "localhost"; .port = "8080"; }
Und muss neu geladen werden mit:
service varnish reload
Auf die Installation gehen wir an dieser Stelle nicht weiter ein, das ist bereits ausreichend dokumentiert und sollte bei einem Managed Server der Hoster übernehmen. Die vollständige offizielle Dokumentation findet sich hier: varnish-cache.
Varnish-Modul in Magento installieren
Das Modul unserer Wahl ist Phoenix_PageCache in der freien Community Version. Es gibt auch eine Enterprise Version für 1000 € mit anspruchsvollen Features, die für die hier beschriebene Anwendung irrelevant sind. Dies ist übrigens unabhängig davon, ob man Magento CE oder Magento EE einsetzt, zumindest funktioniert die Community Version des Moduls genauso in einem Enterprise Shop. Nach der Installation des Moduls sind folgende Schritte notwendig:
- Anpassung der Magento-Konfiguration. Folgende Konfigurationen müssen auf „Nein“ stehen:
a) System->Configuration->(General)Web->Session validation settings->Use SID on frontend
b) System->Configuration->(General)Web->Browser Capabilities detection->Redirect to CMS-page if Cookies are Disabled - Einrichtung der Modul-Konfiguration. Folgendes sollte auf “Ja” stehen, damit bei Änderungen der Cache geleert wird:
a) System->Configuration->(Phoenix Media)PageCache powered by Varnish->Purge Category
b) System->Configuration->(Phoenix Media)PageCache powered by Varnish->Purge Product
c) System->Configuration->(Phoenix Media)PageCache powered by Varnish->Purge CMS Page - Ersetzen der VCL-Datei: Das Modul bringt seine eigene VCL-Datei mit, die im Normalfall direkt übernommen werden kann. Überschreibe die vorhin erstellte VCL mit dieser:
app/etc/default_3.0.vcl - Setzen von cache-control Headers für statische Inhalte. Die VCL richtet sich für die Lebensdauer von gecacheten Inhalten nach den von Magento gesendeten HTTP-Headern. Für Bild-, CSS- und JavaScript-Dateien können wir sie mit .htaccess-Dateien in /skin, /js und /media setzen. Diese sollten folgendes enthalten:
<FilesMatch "\.(js|css|jpg|gif|jpeg|png)$"> Header set Cache-Control "max-age=2592000, public" Header unset Last-Modified
Diese TTL von 2592000 Sekunden entspricht 30 Tagen, ein empfohlener Mindestwert.
Einfacher Varnish-Cache schon fertig
Mit diesen einfachen Schritten ist es schon getan. Das Prinzip ist einfach: Solange der Nutzer nichts anspruchsvolles tut, wird er aus dem Cache bedient. Wie bei jedem Varnish-Cache führt dies zu deutlich niedrigerer Latenz und einem bombastischen Lastverhalten. Anspruchsvoll ist alles, was das Aussehen des Shops verändert, also etwas in den Warenkorb legen, Merkzettel befüllen oder sich anmelden. Sind weniger Benutzer im Shop, lohnt oft ein Cache Warmup.