Zum Inhalt springen

Varnish als HTTP-Cache im Container

Zuletzt geprüft Docker

Varnish legt einen Full-Page-Cache vor deine Website: Wiederkehrende Seiten kommen aus dem RAM, ohne dass PHP oder die Datenbank angefasst werden. Auf Plesk fügt sich das elegant in die bestehende Kette ein — nginx → Varnish → Apache —, weil nginx ohnehin als Reverse Proxy vorgeschaltet ist. Besonders Magento ist dafür gebaut: Es liefert seine Varnish-Konfiguration gleich mit.

  • Rootless Docker — siehe Grundlagen — und das Verständnis der Reverse-Proxy-Anbindung, denn Varnish ist genau so ein Proxy-Ziel.
  • Eine Anwendung, die Cache-fähig ist. Faustregel: anonyme Besucher ja, personalisierte Bereiche (Warenkorb, Login) müssen am Cache vorbei — das regelt die VCL.
  1. nginx (Port 443, TLS) nimmt die Anfrage an und reicht sie statt an Apache an Varnish weiter (127.0.0.1:6081).
  2. Varnish antwortet aus dem Cache — oder holt die Seite bei Apache (Plesk-intern Port 7080) und merkt sie sich.
  3. Die Anwendung steuert per VCL und Headern, was wie lange gecacht wird.
  1. Leg das Projekt an und erstelle eine minimale default.vcl in ~/docker/varnish/:
    vcl 4.1;
    backend default {
    .host = "127.0.0.1";
    .port = "7080";
    }
    Für Magento: stattdessen die vom Shop generierte VCL nutzen — bin/magento varnish:vcl:generate (Backend-Host/-Port wie oben eintragen).
  2. Starte Varnish im Host-Netzwerk, damit er Apache lokal erreicht:
    Terminal-Fenster
    docker run -d --name varnish --restart unless-stopped \
    --network host \
    -e VARNISH_HTTP_PORT=6081 -e VARNISH_SIZE=256M \
    -v ~/docker/varnish/default.vcl:/etc/varnish/default.vcl:ro \
    varnish:7
  3. Teste Varnish direkt: curl -I http://127.0.0.1:6081 -H "Host: deinedomain.de" — die Antwort muss von deiner Seite kommen.
  4. Lass die Domain umverkabeln: Ticket mit „nginx bitte auf 127.0.0.1:6081 statt Apache zeigen” — wir hinterlegen das Proxy-Snippet aus dem Reverse-Proxy-Artikel mit diesem Ziel.
  5. Prüfe den Cache-Effekt: Zweimal dieselbe Seite abrufen — im Antwort-Header zeigt Age: größer 0, dass die zweite Antwort aus dem Cache kam.

Die Anwendung sendet Cookies oder Cache-Control: no-cache auf jeder Seite; die Standard-VCL geht dann auf Nummer sicher und cached nicht.

Lösung: Bei Magento die generierte VCL verwenden (sie kennt die Shop-Cookies). Bei anderen Anwendungen prüfen, ob Session-Cookies wirklich auf jeder Seite nötig sind.

Der Ernstfall des Full-Page-Caches: Es wurde etwas gecacht, das personalisiert war — oder Purges kommen nicht an.

Lösung: Sofort die Domain zurück auf Apache verkabeln lassen (Ticket), dann die VCL prüfen: personalisierte Routen müssen pass sein, und die Anwendung muss Purges an 127.0.0.1:6081 senden dürfen.

Port 6081 ist belegt — etwa durch einen zweiten Varnish-Versuch.

Lösung: docker ps -a prüfen und Altlasten entfernen, oder einen anderen Port in VARNISH_HTTP_PORT setzen (und im Ticket angeben).

Varnish ist das anspruchsvollste Beispiel der Serie — bei Zweifeln lieber vorher fragen als hinterher Cache-Chaos aufräumen. Ticket im Kundencenter öffnen — wir planen die Kette gemeinsam.