Reverse Proxy

Reverse Proxy – Server Setup

Die meisten Web-Applikationen arbeiten unter großer Last oft nicht performant. Auch TYPO3 ist kein ressourcenschonendes Content Management System, da es eine Menge an Funktionalitäten und eine große Flexibilität und Erweiterbarkeit zur Verfügung stellt.

Performance-Probleme lassen sich jedoch mittels verschiedener Caching-Mechanismen lösen. Das Caching Framework von TYPO3 bietet von Haus aus die Möglichkeit, generierte Seiten zwischenzuspeichern. Durch die Unterstützung eines Reverse Proxy, wie z.B. Varnish, kann die Performance bedeutend verbessert werden.

Varnish bietet darüber hinaus zusätzliche Features wie Load Balancing, Health Checks und die Auslieferung von Inhalten aus dem Cache, selbst wenn das Backend (Apache Webserver) nicht erreichbar ist.

Jedoch unterstützt Varnish selbst keine SSL Verbindungen. Deshalb wird ein weiterer Server als HTTPS-to-HTTP Wrapper benötigt. Hierfür können Tools wie Stunnel, Pound oder Nginx verwendet werden.  Nginx bietet dabei von Haus aus mehr Features als z.B. Stunnel, welche gegebenenfalls nützlich werden können.

Nginx, Varnish und Apache können prinzipiell gemeinsam auf einem physischen Server installiert werden. In einer realen Produktivumgebung empfiehlt sich jedoch die Installation auf unterschiedlichen Servern, um die Ausfallsicherheit zu erhöhen. Darüber hinaus können mit solch einem Setup mehrere Apache Server horizontal skaliert werden. Sämtlicher Internet-Traffic läuft vorher über eine Firewall, welche nur mit dem Nginx Server kommuniziert. Alle anderen Server sind nicht direkt von außen erreichbar.

Nginx Konfiguration

Nginx akzeptiert alle eingehenden HTTP und HTTPS Verbindungen (Port 80, 443). Er verarbeitet SSL Anfragen und transferiert die entschlüsselten Anfragen zum konfigurierten Backend – in diesem Fall Varnish. Als Fallback kann Nginx so konfiguriert werden, dass er direkt mit dem Apache Server kommuniziert, falls Varnish nicht zur Verfügung steht.

Bei SSL Verbindungen setzt Nginx ein zusätzlichen Header HTTPS „on“, welches der Apache Server interpretiert und so der Applikation mitteilen kann, dass diese via HTTPS kontaktiert wurde.

Apache Konfiguration

Wenn der Request Header „HTTPS“ auf „on“ steht, wird eine Umgebungsvariable „HTTPS“ auf „on“ gesetzt. Apache oder andere Webserver würden dies genauso vollziehen, wenn sie die SSL Verbindung direkt verarbeiten würden. TYPO3 erwartet diese Umgebungsvariable, um eine Anfrage als eine SSL Anfrage zu verifizieren. Dies ist z.B. für eine korrekte Link-Generierung im HTTPS Modus erforderlich.

Cache Management

Varnish

Ein zentrales Element der Infrastruktur ist der Open-Source Reverse Proxy „Varnish“. Eine Analyse hat ergeben, dass bis zu 95 Prozent aller angeforderten Seiten weitestgehend in einem Cache zwischengespeichert werden können. Benutzerinformationen, bzw. dynamische Inhalte, können dabei lokal im Browser zwischengespeichert oder per AJAX in einer separaten Anfrage nachgeladen und nach dem Seitenaufbau eingebettet werden. Auf diese Art und Weise können sowohl alle Produkt- und Kategorieseiten, als auch CMS-Seiten und die Startseite komplett von Varnish aus bedient werden. Alle dynamischen Requests (z. B. Braas Tools oder Bestellformulare) werden weiterhin zu den verantwortlichen Frontend-Servern Frontend-Servern durchgereicht.

Das freie TYPO3-Modul „Varnish Connector“ kümmert sich hierbei um die Kommunikation zwischen TYPO3 und Varnish und sendet die richtigen Anweisungen, um gezielt Inhalte zu cachen oder auch automatisch aus dem Cache zu entfernen (Cache-Control). Letzteres ist zum Beispiel notwendig, wenn sich Daten der Produkte des Katalogs aktualisiert haben.

TYPO3-Caching

Seitens TYPO3 sind einige Optimierungen und Erweiterungen notwendig. Zunächst muss ein geeignetes Cache-Konzept gefunden werden. Während jede Serverinstanz einen eigenen lokalen Cache verwenden könnte, ist es einerseits sehr viel effizienter und andererseits für einige Features auch notwendig, dass alle beteiligen Knoten auf den gleichen Cache-Inhalt lesend und schreibend zugreifen können. Damit ist man in der Auswahl der Cache-Backends eingeschränkt.

Das Caching-Framework von TYPO3 unterstützt derzeit folgende Cache-Backends: Database, Memcached, Redis (experimentell), APC und File.

Da die Komplexität des Server-Arrays zu Beginn möglichst überschaubar bleiben soll, setzen wir zunächst auf das Datenbank-Cache-Backend. Das Datenbank-Cache-Backend unterstützt Cache Tags, ist persistent und cluster-friendly. Eine interessante Alternative ist das Redis-Cache-Backend, welches sehr schnell und elegant ist. Derzeit befindet es sich für TYPO3 aber noch im experimentellen Status und würde zudem die Server-Array Komplexität erhöhen. Nichtsdestotrotz könnten mit Redis zukünftig die Datenbank-Anfragen reduziert und somit einem Flaschenhals bezüglich Performance durch überflüssige Datenbankzugriffe entgegengewirkt werden.