6. Cache
HAProxy bietet einen Cache für kleine Objekte wie Favicons oder CSS-Dateien. Dieser einfache, wartungsarme Cache arbeitet im RAM.
Der Cache verwendet einen von allen Threads gemeinsam genutzten Speicherbereich, der in Blöcke von 1kB aufgeteilt ist.
Wird ein Objekt nicht mehr verwendet, kann es unabhängig von seinem Ablaufdatum gelöscht werden, um ein neues Objekt zu speichern. Beim Reservieren eines neuen Objekts werden die ältesten Objekte zuerst gelöscht.
Als Schlüssel verwendet der Cache einen Hash aus Host-Header und URI.
Der Cache-Status lässt sich mit dem UNIX-Socket-Befehl “show cache” anzeigen. Einzelheiten stehen in Abschnitt 9.3 „UNIX-Socket-Befehle“ des Verwaltungshandbuchs.
Wird ein Objekt aus dem Cache ausgeliefert, steht im Protokoll statt des Servernamens “<CACHE>”.
6.1. Einschränkungen
In folgenden Fällen speichert der Cache keine Objekte und liefert auch keine aus:
-
Wenn die Antwort keinen Status 200 hat.
-
Wenn die Antwort einen Vary-Header enthält und entweder process-vary deaktiviert ist oder der Vary-Wert einen derzeit nicht unterstützten Header nennt. Unterstützt werden derzeit nur accept-encoding, referer und origin.
-
Wenn Content-Length plus Header-Größe größer als “max-object-size” ist.
-
Wenn die Antwort nicht zwischengespeichert werden darf.
-
Wenn die Antwort weder einen ausdrücklichen Ablaufzeitpunkt (Cache-Control-Direktiven s-maxage oder max-age beziehungsweise Expires-Header) noch einen Validator (ETag- oder Last-Modified-Header) enthält.
-
Wenn process-vary aktiviert ist und bereits max-secondary-entries Einträge mit demselben Primärschlüssel wie die aktuelle Antwort vorhanden sind.
-
Wenn process-vary aktiviert ist, die Antwort vom Client-Header accept-encoding abhängt und eine unbekannte Kodierung verwendet, die nicht unter https://www.iana.org/assignments/http-parameters/http-parameters.xhtml aufgeführt ist.
-
Wenn die Anfrage keine GET-Anfrage ist.
-
Wenn die HTTP-Version der Anfrage kleiner als 1.1 ist.
-
Wenn die Anfrage einen Authorization-Header enthält.
6.2. Einrichtung
Zur Einrichtung muss ein cache-Abschnitt definiert und mit den entsprechenden http-request- und http-response-Aktionen in einem Proxy verwendet werden.
6.2.1. Cache-Abschnitt
cache <name>
Deklariert einen Cache-Abschnitt und reserviert gemeinsam genutzten Cache-Speicher namens <name>. Die Cache-Größe muss angegeben werden; siehe unten “total-max-size”.
max-age <seconds>
Legt die maximale Gültigkeitsdauer fest. Als Ablaufzeit gilt der kleinere Wert aus dieser Einstellung und der Direktive s-maxage beziehungsweise max-age (in dieser Reihenfolge) im Antwort-Header Cache-Control. Der Standardwert beträgt 60 Sekunden; standardmäßig kann ein Objekt daher höchstens 60 Sekunden zwischengespeichert werden.
max-object-size <bytes>
Legt die maximale Größe zwischengespeicherter Objekte fest. Sie darf die Hälfte von “total-max-size” nicht überschreiten. Ohne Angabe entspricht sie dem 256. Teil der Cache-Größe. Objekte, die größer als “max-object-size” sind, werden nicht zwischengespeichert.
max-secondary-entries <number>
Legt die maximale Anzahl gleichzeitig vorhandener Sekundäreinträge mit demselben Primärschlüssel im Cache fest. Dafür muss die Vary-Unterstützung aktiviert sein. Der Standardwert ist 10; angegeben werden sollte eine strikt positive Ganzzahl.
process-vary <on/off>
Aktiviert oder deaktiviert die Verarbeitung des Vary-Headers. Bei deaktivierter Verarbeitung werden Antworten mit diesem Header niemals zwischengespeichert. Bei aktivierter Verarbeitung muss für alle eingehenden Anfragen zunächst ein Hash über einen Teil der Anfrage-Header berechnet werden, was CPU-Zeit kosten kann. Daraus entsteht der Sekundärschlüssel der jeweiligen Anfrage (siehe RFC 7234#4.1). Derzeit werden dazu die Inhalte von ‘accept-encoding’, ‘referer’ und ‘origin’ verwendet. Nach RFC haben ‘origin’ und ‘referer’ jeweils nur einen Wert. Eine Anfrage mit mehreren Vorkommen eines dieser Header sollte daher als fehlerhaft gelten. Für solche Anfragen wird kein Sekundärschlüssel erzeugt und die Antwort niemals aus dem Cache ausgeliefert, damit der Server über die Behandlung entscheiden kann. Standardmäßig gilt off, also deaktiviert.
total-max-size <megabytes>
Legt die RAM-Größe des Caches in Megabyte fest. Sie wird in Blöcke von 1kB für Cache-Einträge aufgeteilt. Der Höchstwert beträgt 4095.
6.2.2. Proxy-Abschnitt
Der Proxy-Abschnitt muss im Regelsatz “http-request” die Aktion “cache-use” verwenden, um das angeforderte Objekt im Cache zu suchen. Zum Speichern oder Aktualisieren des abgerufenen Objekts dient “cache-store” im Regelsatz “http-response”. Beide Aktionen können optional an Bedingungen geknüpft werden. Beispielsweise lässt sich “cache-use” für ein bekanntermaßen nicht cachefähiges Unterverzeichnis oder “cache-store” für ungeeignete Inhaltstypen überspringen. Der Indexschlüssel des Caches wird jedoch während “cache-use” berechnet. Wird diese Aktion übersprungen, wird auch bei der Antwort keine Aktualisierung des Caches versucht.
Beispiel: