Skip to content

Varnish: Fehlerbehandlung bei Backendfehlern

Gestern hatte mein Server ein Problem mit seinem Dateisystem. Es ist plötzlich Read-Only geworden und dadurch konnte das PHP beim Rendern der Seiten keine Cachedateien mehr erzeugen. Lediglich eine Fehlermeldung war beim Aufruf dieses Blogs zu sehen. Sowas in der Mittagspause zu entdecken, ist schon bitter.

Webanwendung mit Problemen

Ohne schreibend auf das Dateisystem zugreifen zu können, quittierte das Blogsystem Serendipity sofort den Dienst. Es wurden nur noch Fehlermeldungen mit dem HTTP-Fehlercode 500 ausgegeben. Dank des stets heißen Varnish-Cache hat man das als Benutzer beim Klicken durch die Seiten ohne Kommentare zu schreiben nicht gemerkt. Erst als das Alter der Cacheeinträge eine Stunde überschritten hatte, verwarf Varnish diese und die Fehler waren auf allen Seiten in voller Pracht zu sehen.

Sonderbehandlung für Backendfehler

Varnish beantwortet alle HTTP-Anfragen einer Site. Alles, was nicht in dessen Cache ist, wird beim Webserver Nginx angefragt. Jener fragt wiederum PHP und so weiter. Nginx ist also das Backend von Varnish, welches in meinem Fall nicht mehr korrekt arbeitete. Glücklicherweise ist in der Anleitung von Varnish ein Kapitel, welches erklärt, wie man mit einer fehlerwerfenden Webanwendung umgehen kann.

Grace-Mode

Meine Konfiguration umfasst nun, dass etwas einst korrekt gecachtes von Varnish nur dann verworfen wird, wenn der jeweilige Cacheeintrag:

  1. mindestens eine Stunde alt ist und das Backend eine fehlerfreie Antwort liefert.
  2. älter als fünf Tage ist.

Saint-Mode

Weiter lasse ich Varnish beim Auffrischen eines abgelaufenen Cacheeintrags erst nach einer Minute einen neuen Auffrischungsversuch unternehmen, wenn währenddessen ein Backendfehler aufgetreten ist. Damit versuche ich zu verhindern, dass bei vielen Fehlern das Backend durch Überlastung den Geist aufgibt.

Fazit

Dieses Vorgehen hat zur Folge, dass Backendfehler nicht so schnell für den Sitebesucher sichtbar werden. Es erfordert aber gleichzeitig ein Monitoring, welches nicht nur schaut, ob beim HTTP-Request von außen etwas kommt. Vielmehr muss der Gesundheitszustand des Backends selbst überwacht werden. Ich löse das so, indem ich alle paar Tage ins Munin schaue und prüfe, ob der Webserver nginx etwas ins Errorlog geschrieben hat. Besser wäre es allerdings den Server an ein externes Monitoring anzuschließen. Ein System kann sich schließlich nur bis zu einem gewissen Grad selbst überwachen.

Ich hoffe, ich konnte Euch insofern helfen, dass Ihr nicht die gleichen Fehler wie ich macht. :-)

Nachtrag

Fehler müssen nicht zwangsläufig den Code 500 haben. Ich betrachte alles >= 500 als Fehler und aktiviere hierfür dann den Saint-Mode. Wenn z.B. das PHP-Backend down ist, meldet nginx einen 502 an Varnish und der sollte damit umgehen können. Schaut in meine Varnishkonfiguration. :-)

Kommentare

Noch keine Kommentare

Kommentar schreiben