Datenkompimierung unter Apache2 mit mod_deflate

Serverseitige Komprimierung von Daten ist eine gute Möglichkeit um die zu sendende Datenmenge zu verringern. Somit wird das Laden einer Webseite beschleunigt und Traffic gespart. Zu beachten ist dabei, dass sich die Prozessorlast des Servers durch das Komprimieren erhöht.

Bei einem Apache2-Webserver kann man für die Komprimierung das Modul mod_deflate verwenden. Im Folgenden werde ich die Konfiguration des Apache2-Webservers in Bezug auf Kompression beschreiben.

Hier wird davon ausgegangen, dass das Modul mod_deflate zusammen mit Apache2 auf dem System installiert ist.
Um es zu aktivieren tippen wir einfach a2enmod deflate ein.
Danach muss Apache2 mit /etc/init.d/apache2 restart neu gestartet werden.

Die folgenden Einträge können entweder in der globalen Konfiguration für den ganzen Server oder in der entsprechenden Konfiguration für virtuelle Hosts gemacht werden.

In der nächsten Zeile weisen wir das Modul an, welche Dateien komprimiert werden sollen. Das sind hier HTML, Text, XML, CSS und JavaScript.

AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/x-javascript

Die folgenden Einträge sollten noch hinzugefügt werden, um Kompatibilität mit älteren Browsern zu gewährleisten.

BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

Die nächsten Zeilen weisen das Modul an, Informationen über die Kompression in ein Logfile zu schreiben. Das Loggen ist nicht notwendig, ermöglicht aber das Testen der richtigen Funktionsweise der Kompression.

DeflateFilterNote Input input_info
DeflateFilterNote Output output_info
DeflateFilterNote Ratio ratio_info
LogFormat '"%r" %{output_info}n/%{input_info}n (%{ratio_info}n%%)' deflate
CustomLog /var/log/apache2/deflate_log deflate

Nach ??nderung der Konfiguration muss der Apache2 wieder neu gestartet werden: /etc/init.d/apache2 restart

Senden von Informationen über die Gültigkeitsdauer von Dateien

Man kann den Apache2-Webserver anweisen, Informationen über die Gültigkeitsdauer verschiedener Dateitypen im Header zu senden. Dies geschieht über das Apache-Modul mod_expires. Der Browser beziehungsweise Proxy-Server kann diese Dateien über die Dauer der Gültigkeit speichern und muss sie erst nach Ablauf dieser Zeit neu laden. Bei Browsen ist ein eingeschalteter Cache Voraussetztung.

Im folgenden ist eine Beispielkonfiguration für Apache2 zu sehen, bei der Grafiken eine Gültigkeit von 3 Tagen, CSS-Dateien eine Gültigkeit von 2 Tagen und alle anderen Dateien eine Gültigkeit von 24 Stunden haben.

<IfModule mod_expires.c>
# Modul aktivieren
ExpiresActive on


# übliche Grafiken sind 3 Tage gültig
ExpiresByType image/jpg "access plus 3 days"
ExpiresByType image/gif "access plus 3 days"
ExpiresByType image/jpeg "access plus 3 days"
ExpiresByType image/png "access plus 3 days"

# CSS-Dateien sind 2 Tage gültig
ExpiresByType text/css "access plus 2 days"

# alle anderen Dateien sind 24 Stunden gültig
ExpiresDefault "access plus 24 hours"
</IfModule>

Identifikation von Dateien mit ETags

Dateien könnnen serverseitig eindeutige Kennungen, sogenannte ETags, zugeordnet werden. Diese können aus I-Node, Zeit der letzten ??nderung und Größe der Datei berechnet werden.

Der ETag wird bei der ersten Anfrage eines Clients vom Server im Header gesendet. Der Client speichert die Datei und den zugehörigen ETag. Bei weiteren Anfragen sendet der Client den ETag mit. Auf dem Server wird der empfangene ETag mit dem gespeicherten ETag verglichen. Wenn die ETags gleich sind, sich also I-Node, ??nderungszeit oder Größe der Datei nicht geändert haben wird die Datei nicht erneut gesendet. Weichen die ETags voneinander ab, bedeutet das, dass sich die Datei auf dem Server geändert hat. Die Datei wird erneut gesendet.

Diese Funktion wird mit Hilfe der Apache-Direktive FileETag umgesetzt.
Mögliche Schlüsselwörter für FileETag sind:

  • INode Die I-Node-Nummer wird in die Berechnung mit einbezogen
  • MTime Datum und Uhrzeit der letzten ??nderung werden mit einbezogen
  • Size Die Anzahl der Bytes in der Datei wird mit einbezogen
  • All Alle verfügbaren Angaben werden verwendet
  • None Es wird keine ETag-Angabe in die Antwort eingefügt