Wir fordern statisches Caching für statische Seiten!

Um TYPO3 die Performance zu geben, die es benötigt, um vielbesuchte Seiten zu erstellen, benötigt es weniger der Installation einer Extension, denn eine sinnvolle logische Ansatzweise.

Zunächst einmal bedeutet jeder Seitenzugriff auf eine bereits im DB-Cache befindlichen Seite immer noch mindestens mehrer Datenbankzugriffe, was bei vielen gleichzeitigen Zugriffen immer der Flaschenhals sein wird. Zudem besteht der Cache im besten Fall aus einem temporären Script, welches komplett mit TYPOScript und statischen HTML-Elementen u.s.w in der Datenbank abgelegt wurde.

Jetzt verändern sich die meisten Seiten nicht wirklich oft und werden daher jedes Mal und immer gleich aus der Datenbank ausgelesen. Die Extension nc_staticfilecache greift einfach das Ergebnis einer nicht-dynamischen Seite bei der Auslieferung ab und legt dieses in das Verzeichnis typo3temp/tx_ncstaticfilecache (Lese-, Schreibe-, und Löschrechte für den User des Webserver im Ordner sicherstellen). Hierbei prüft die Extension, dass die Seite kein einziges dynamisches Element beinhaltet – dann wandert diese Seite in den statischen Cache unterhalb des o.g. Verzeichnisses. Und gehen wir einfach mal davon aus, dass 75% der Seiten statischer Natur sind, dann wird die Auslieferung dieser 75% innerhalb von wenigen ms. erledigt. Ein Zugriff auf eine statische Datei beschäftigt einen Apache-Prozess im Schnitt etwa 1-10 ms., ein Zugriff in die Cache-Datenbank von TYPO3 zwischen 50-2000 ms!

Bei einem Zugriff auf eine Seite /referenzen/kunden/acme-ag.html wird ja nicht direkt eine Seite aufgerufen, sondern wird grob gesagt über Mod-Rewrite ein Zugriff auf /index.php erzeugt, weil der File-Zugriff fehlgeschlagen ist. Man könnte aber auch den Zugriff, bevor er auf TYPO3 aufschlägt, erst noch im statischen Cache-Verzeichnis nachsehen lassen, ob dort eine Datei im Verzeichnis existiert:

typo3temp/tx_ncstaticfilecache/www.marit.ag/referenzen/kunden/acme-ag.html

Ist dies der Fall, so soll diese Datei im Namen der angeforderten Datei ausgeliefert werden. Hierzu ist folgender htaccess-Code notwendig:

RewriteEngine On
ExpiresActive On

RewriteRule ^(typo3|typo3temp|typo3conf|t3lib|tslib|fileadmin|uploads|showpic\.php)/ – [L]

# beginning of static file cache ruleset
# Don’t pull *.xml, *.css etc. from the cache
RewriteCond %{REQUEST_FILENAME} !^.*\.xml$
RewriteCond %{REQUEST_FILENAME} !^.*\.css$
RewriteCond %{REQUEST_FILENAME} !^.*\.js$
RewriteCond %{REQUEST_FILENAME} !^.*\.log$
RewriteCond %{REQUEST_FILENAME} !^.*\.jpg$
RewriteCond %{REQUEST_FILENAME} !^.*\.png$
RewriteCond %{REQUEST_FILENAME} !^.*\.gif$

# Check for Ctrl Shift reload
#RewriteCond %{HTTP:Pragma} !no-cache [NC]
RewriteCond %{HTTP:Cache-Control} !no-cache [NC]

# Don’t cache HTTPS traffic by default. You may choose to comment out this
# option if your site runs fully on https. If your site runs mixed, you will
# not want https traffic to be cached in the same typo3temp folder where it can
# be requested over http.
# Enable this if you use a mixed setup.
RewriteCond %{HTTPS} off

# NO backend user is logged in. Please note that the be_typo_user expires at the
# end of the browser session. So, although you have already logged out of the
# backend, you will still have to either restart your browser or remove the
# cookie manually for this rule to work.
RewriteCond %{HTTP_COOKIE} !be_typo_user [NC]

# NO frontend user is logged in. Logged in frontend users may see different
# information than anonymous users. But the anonymous version is cached. So
# don’t show the anonymous version to logged in frontend users.
RewriteCond %{HTTP_COOKIE} !nc_staticfilecache [NC]

# We only redirect GET requests
RewriteCond %{REQUEST_METHOD} GET

# We only redirect URI’s without query strings
RewriteCond %{QUERY_STRING} ^$

# We only redirect if a cache file actually exists
RewriteCond %{REQUEST_FILENAME} !^.*\.php$
RewriteCond %{DOCUMENT_ROOT}/typo3temp/tx_ncstaticfilecache/%{HTTP_HOST}/%{REQUEST_URI}/index.html -f
RewriteRule .* typo3temp/tx_ncstaticfilecache/%{HTTP_HOST}/%{REQUEST_URI}/index.html [L]

#Is this not the case, ask at TYPO3 for a result
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule .* index.php [L]

Damit auch erkenntlich ist, wann der statische Cache wirkt, sollte man einfach einen Zeitstempel in das Template mitliefern. Dies lässt sich in den Extension-Einstellungen erledigen.

Ein stündlich laufender Crobjob sollte alle abgelaufenen Dateien löschen. Hierzu ist das PHP-CLI notwendig, hierzu muss ein Backendbenutzer mit dem Namen „_cli_ncstaticfilecache“ angelegt werden:

5 * * * * php /srv/www/typo3/cli_dispatch.phpsh nc_staticfilecache removeExpiredPages -s

Es ist noch folgendes anzumerken: Alle statischen Cache-Dateien bekommen über eine automatisch erstellte htaccess-Datei einen Zeitstempel, in welchem für das Apache-Modul mod-expire vermerkt wird, ob der Cache noch gültig ist. Normalerweise gilt eine Cache-Datei 24 Stunden, Ausnahmen werden über die Cache-Dauer in den Seiteneigenschaften eingestellt. Wenn der große Cache-Löschen Button betätigt wird, so leert TYPO3 das Verzeichnis typo3temp/tx_ncstaticfilecache/ und bei jedem Seitenaufruf wird dann ein Cache-Eintrag von neuem erzeugt. Einzig die selektive Cache-Bereinigung nach dem Bearbeiten ist nicht möglich. Aber Anfragen eines eingeloggten BE-User schlagen immer direkt bei TYPO3 auf (RewriteCond %{HTTP_COOKIE} !be_typo_user [NC]). Ebenso wird ein harter Reload durch die erste Cache-Barriere durchgereicht und schlägt auf TYPO3 auf. Dennoch ist die Entlastung enorm spürbar.

Bei der Installation sollte man mit dem mitgelieferten Info-Modul prüfen, ob und welche Seiten dynamische Inhalte haben. Hier ist eine schöne Übersicht aller Unterseiten, ob und wann diese gecached wurden, bzw. warum sie nicht gecached wurden. Denn nur Seiten ohne dynamische Inhalte können berücksichtigt werden. Manchmal sind auch schlechte Extensions Schuld, dass alle Seiten dynamisch gerendert werden müssen, was dann zu Performance-Problemen führen kann.

Die Marit AG hat diese Lösung schon bei einigen Kunden im Einsatz.

Veröffentlicht unter TYPO3 Extensions, TYPO3 Technik
Ein Kommentar auf “Wir fordern statisches Caching für statische Seiten!
  1. Michael sagt:

    Ich habe noch eine kleine Verbesserung zum Thema Statisches Caching und SSL angefordert:
    http://bugs.typo3.org/view.php?id=11426

    Das neue Feature ist hier vorab schon herunterladbar:
    http://blog.marit.ag/wp-content/uploads/T3X_nc_staticfilecache-2_3_1-z-200906261352.zip

1 Pings/Trackbacks für "Wir fordern statisches Caching für statische Seiten!"

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*