TYPO3-Seiten schneller ausliefern mit Static File Cache (nc_staticfilecache)

Mit der TYPO3-Extension nc_staticfilecahe werden TYPO3-Seiten, die ohne USER_INT- oder COA_INT-Objekte auskommen, also kompett in den Cache gelegt werden können, als HTML-Dateien auf dem Server abgelegt. Über Rewrite-Regeln mit mod_rewrite werden diese HTML-Dateien direkt vom Server ausgeliefert, ohne nochmal TYPO3 aufzurufen. Das ergibt eine deutliche Performance-Steigerung und Entlastung für den Server.

Grundlagen

TYPO3 generiert die Ausgabe der Seiten einer Website dynamisch aus Datenbank-Inhalten, statischen Dateien wie z.B. HTML-Templates und ggf. GET- oder POST-Parametern vom aufrufenden Browser. Um nicht bei jedem Seitenaufruf die gleiche HTML-Ausgabe erneut rendern zu müssen, kann TYPO3 Inhalte, die nicht über Benutzereingaben verändert werden in Cache-Tabellen ablegen und so auf den bereits generierten HTML-Code zurückgreifen. Beim Aufruf einer Seite mit Inhalten aus der Cache-Tabelle wird aber weiterhin das TYPO3-Framework aufgerufen, das diese Inhalte dann weitergibt.

Die Extension nc_staticfilecache lagert nun Seiten, deren Ausgabe komplett im Cache abgelegt werden kann, in HTML-Dateien im Verzeichnis typo3_temp aus. Wenn für eine aufgerufene Seite eine passende Datei auf dem Server angelegt wurde, wird dies über eine Rewrite-Condition vom Apache-Modul mod_rewrite erkannt und die Datei wird über eine Rewrite-Rule direkt vom Webserver ausgeliefert, ohne das TYPO3-Framework aufzurufen.

Wird der Seiten-Cache in TYPO3 gelöscht, löscht nc_staticfilecache auch die zugehörigen HTML-Dateien und generiert sie beim nächsten Seitenaufruf neu. So ist die Ausgabe der Website automatisch auf dem aktuellen Stand.

Zum Einsatz von nc_staticfilecache ist das Umschreiben der URLs auf virtuelle Dateinamen oder Pfade mit Simulate Static URLs (simulatestatic) oder RealUrl (realurl) notwendig.

nc_staticfilecache - statische HTML-Dateien im Dateisystem
statische HTML-Dateien in typo3_temp

Installation und Konfiguration

Die Extension nc_staticfilecache ist einfach über den Extension-Manager zu installieren. Im Extension-Manager können auch die wenigen Konfigurations-Parameter der Extension eingestellt werden.

Passend zur unten stehenden .htaccess-Konfiguration werden die Einstellungen wie folgt gesetzt:

[clearCacheForAllDomains]: checked

[sendCacheControlHeader]: checked

[enableStaticFileCompression]: checked

[showGenerationSignature]: checked

[strftime]: cached statically on: %d-%m-%y %H:%M

[debug]: unchecked

[recreateURI]: unchecked

[markDirtyInsteadOfDeletion]: unchecked

mod_rewrite-Regeln in der .htaccess-Datei

Etwas schwieriger als die Installation und Konfiguration, kann sich das Anpassen der mod_rewrite-Einstellungen erweisen. Je nach Serverumgebung, muss eine der mitgelieferten .htaccess-Beispielkonfigurationen evtl. angepasst und dann an passender Stelle in die eigene .htaccess-Datei eingefügt werden. 

Vor allem die Variable DOCUMENT_ROOT und die Schrägstriche um die Variablen HTTP_HOST und REQUEST_URI können hier Probleme verursachen.

Bei einer TYPO3-Installation auf einem Mittwald-Server können die mod_rewrite-Regeln aus den Beispielkonfigurationen im Extension-Verzeichnis übernommen werden. 

Bei einer Installation auf den Servern von DomainFactory, beispielsweise bei jweiland.net, muss die Variable %{DOCUMENT_ROOT} durch den ausgeschriebenen Pfad zum Root-Verzeichnis der Installation ersetzt werden. Auch die Schrägstriche um die weiteren Variablen im Pfad müssen hier, wie im folgenden Beispiel angepasst werden. Die betreffenden Zeilen sind mit (1) und (2) im vorangestellten Kommentar gekennzeichnet.

Es werden die zur Konfiguration - mit RealUrl und Gzip-komprimierten Dateien - passenden Rewrite-Regeln verwendet.

.htaccess (Installation bei jweiland.net)

# ... z.B. Redirects und andere Einstellungen ...

# Rewrites
RewriteEngine On

#------------------------------------------------------------------------------
# beginning of static file cache ruleset

# Set gzip extension into an environment variable if the visitors browser can handle gzipped content.
RewriteCond %{HTTP:Accept-Encoding} gzip [NC]
RewriteRule .* - [E=TX_NCSTATICFILECACHE_GZIP:.gz]

# Don't cache HTTPS traffic. 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

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

# (1) It only makes sense to do the other checks if a static file actually exists.
RewriteCond
/www/123456_7890/rp-hosting/1234/5678/typo3cms/projektverzeichnis/typo3temp/tx_ncstaticfilecache/%{HTTP_HOST}%{REQUEST_URI}/index.html%{ENV:TX_NCSTATICFILECACHE_GZIP}
-f

# 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]

# Uncomment the following line if you use MnoGoSearch
#RewriteCond %{HTTP:X-TYPO3-mnogosearch} ^$

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

# NO backend user is logged in. Please note that the be_typo_user cookie expires at the
# end of the browser session. If you have logged out of the TYPO3
# backend and are expecting to see cached pages but don't. Please close
# this browser session first or remove the cookie manually or use another
# browser to hit your frontend.
RewriteCond %{HTTP_COOKIE} !be_typo_user [NC]

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

# (2) Rewrite the request to the static file.
RewriteRule .* /typo3temp/tx_ncstaticfilecache/%{HTTP_HOST}%{REQUEST_URI}/index.html%{ENV:TX_NCSTATICFILECACHE_GZIP} [L]

# Set proper content type and encoding for gzipped html.
<Files *.html.gz>
    ForceType text/html
    <IfModule mod_headers.c>
        Header set Content-Encoding gzip
    </IfModule>
</Files>

# end of static file cache ruleset
#------------------------------------------------------------------------------

# ... weitere Rewrite-Regeln ...

Test und Fehlersuche

Im Dateisystem

Nach Installation und Aktivierung der Extension werden die HTML-Dateien angelegt, sobald die Seiten in Frontend ohne BE-Login aufgerufen werden und von TYPO3 in die Cache-Tabellen geschrieben werden. Dann kann im Verzeichnis /typo3_temp/nc_staticfilecache/ nachgeschaut werden, ob die HTML-Dateien angelegt wurden.

Info-Modul

Im Modul WEB > Info im TYPO3-BackEnd gibt es ein Submodul, das Informationen über die angelegten HTML-Dateien zur Verfügung stellt. Hier werden auch Gründe aufgezeigt, falls das für einzelne Seiten nicht möglich ist.

Kommentar mit Zeitangabe am Dateiende

Wird bei der Konfiguration [showGenerationSignature] angehakt, so wird am Ende der generierten HTML-Datei die unter [strftime] angegebene Information als HTML-Kommentar angehängt. Beim Aufruf der Seiten in einem Browser ohne BE-Cookie kann nun in der Quelltext-Ansicht überprüft werden, ob die ausgelieferten Seiten tatsächlich aus den HTML-Dateien stammen.