Webserver Optimierung mit Mod_deflate
Ein Test der Homepage hat vor kurzem Ergeben, dass sie nur 65 von 100 Punkten bei Google PageSpeed Insights erreicht hat. Ein Faktor, welcher angemerkt wurde war die Serverseite Kompression. Dieser Punkt soll mit dieser Anleitung abgehandelt werden. Für die Optimierung aktivieren wir Mod_deflate auf unserem Apache Webserver, um die Komprimierung von Daten zu aktivieren.
Einführung
Mod_deflate ist ein Apache-Modul, mit dem die Ausgabe Deines Webservers komprimiert werden kann, bevor sie an den Client gesendet wird. Sobald der Inhalt Deiner Website komprimiert ist, ist er kleiner und kann von den Clients schneller heruntergeladen werden. Dies ist nicht nur für Kunden mit geringerer Bandbreite wertvoll, z.B. weil sie über ein mobiles Endgerät auf die Seite zugreifen, sondern wird auch von Suchmaschinen berücksichtigt, wenn sie die Leistung Ihrer Website und deren Page Rank bewerten. Für Google ist die Leistung der Webseite auf mobilen Geräte mittlerweile einer der wichtigste Faktor für das Ranking.
Neben dem Komprimieren von Inhalten kann mod_deflate auch zum Dekomprimieren verwendet werden. Diese Technik kommt zum Einsatz, wenn Du den Apache Webserver als Reverse-Proxy verwendest und die Inhalte, die den Proxy passieren, weiterverarbeiten willst. Im Rahmen dieses Artikels werden uns auf die Verwendung von mod_deflate zur Komprimierung konzentrieren.
Voraussetzungen
Diese Anleitung basiert auf der Installation unter CentOS 7. Die Modulinstallation und -konfiguration ist nicht vom Betriebssystem oder der Betriebssystemversion abhängig, jedoch kann der Speicherort der Konfigurationsdateien je nach Betriebssystem und Version variieren.
Außerdem nehme ich an, dass du Apache 2.4.0 oder höher verwendest.
Alle Befehle in dieser Anleitung sollten als Nicht-Root-Benutzer ausgeführt werden. Wenn für den Befehl Root-Berechtigungen erforderlich sind, wird ihm ein sudo vorangestellt.
Installation Mod_deflate
Mod_deflate ist in der Standard-Apache-Installation auf CentOS 7 enthalten und aktiviert. Um dies zu bestätigen, führe apachectl aus, das Apache Server Control Interface, aus und filtern die Ausgabe mit grep nach dem Schlüsselwort deflate wie folgt:
apachectl -t -D DUMP_MODULES |grep deflate
Du solltest deflate_module (shared) sehen, wenn mod_deflate installiert und aktiviert ist. Wenn Du dies nicht siehst, führe die folgenden Schritte zur Fehlerbehebung durch:
- Stelle sicher, dass die Moduldatei installiert ist. Diese Datei ist Teil des Kernpakets httpd, das Du gemäß den zuvor genannten Voraussetzungen bereits installiert haben solltest. Standardmäßig befindet sich die Datei in /etc/httpd/modules/mod_deflate.so. Außerdem sollte der Webserver in der Lage sein, diese Datei zu öffnen. Zu diesem Zweck sollte mod_deflate.so weltlesbare Rechte wie 755 haben.
- Prüfe, ob das Modul geladen wurde. Öffne dazu die Konfigurationsdatei der Apache-Basismodule /etc/httpd/conf.modules.d/00-base.conf und stelle sicher, dass diese Zeile vorhanden und nicht auskommentiert ist:
LoadModule deflate_module modules/mod_deflate.so
Hinweis: Vergiss nicht, den Apache neu zu starten, wenn Du eine Änderung an der Apache-Konfiguration vornehmen musstest. Der Neustartbefehl lautet
sudo apachectl restart.
Konfiguration
Um mod_deflate einsetzen zu können, musst Du festlegen, welche Dateitypen komprimiert werden sollen. Einerseits können reine Textformate durch Komprimierung stark verkleinert werden, weshalb es sinnvoll ist, sie auf HTML-, CSS- oder JavaScript-Dateien anzuwenden. Andererseits sind viele Multimedia-Formate und Bilder bereits komprimiert, so dass eine zusätzliche Komprimierung sinnlos ist.
Um mod_deflate zu konfigurieren, erstellen Sie eine neue Konfigurationsdatei /etc/httpd/conf.d/mod_deflate.conf mit dem Beispielcode:
/etc/httpd/conf.d/mod_deflate.conf
<filesMatch "\.(js|html|css)$">
SetOutputFilter DEFLATE
</filesMatch>
Der obige Code bedeutet, dass eine Datei, die mit den Erweiterungen .js, .html oder .css übereinstimmt, durch die Standard-Apache-Direktive SetOutputFilter komprimiert (deflatiert) wird. Sie können auch andere ähnliche Textdateierweiterungen hinzufügen, die Sie auf Ihrer Website finden, wie z. B. .txt.
Für WordPress habe ich die Konfiguration wie folgt erweitert:
<filesMatch "\.(js|html|css)$">
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript
</filesMatch>
<IfModule mod_headers.c>
# Serve gzip compressed CSS files if they exist
# and the client accepts gzip.
RewriteCond "%{HTTP:Accept-encoding}" "gzip"
RewriteCond "%{REQUEST_FILENAME}\.gz" -s
RewriteRule "^(.*)\.css" "$1\.css\.gz" [QSA]
# Serve gzip compressed JS files if they exist
# and the client accepts gzip.
RewriteCond "%{HTTP:Accept-encoding}" "gzip"
RewriteCond "%{REQUEST_FILENAME}\.gz" -s
RewriteRule "^(.*)\.js" "$1\.js\.gz" [QSA]
# Serve correct content types, and prevent mod_deflate double gzip.
RewriteRule "\.css\.gz$" "-" [T=text/css,E=no-gzip:1]
RewriteRule "\.js\.gz$" "-" [T=text/javascript,E=no-gzip:1]
<FilesMatch "(\.js\.gz|\.css\.gz)$">
# Serve correct encoding type.
Header append Content-Encoding gzip
# Force proxies to cache gzipped &
# non-gzipped css/js files separately.
Header append Vary Accept-Encoding
</FilesMatch>
</IfModule>
Der Vollständigkeit halber noch einige eigene wichtige Konfigurationsoptionen von mod_deflate:
- DeflateCompressionLevel – die anzuwendende Kompressionsstufe. Standardmäßig ist diese Stufe 9, die höchste Komprimierungsstufe. 1 ist die geringste Komprimierungsstufe. Eine höhere Komprimierung würde die kleinste Ausgabe um den Preis einer höheren Server-CPU-Auslastung erzeugen.
- DeflateMemLevel – die Menge des Speichers, die zlib, die komprimierende Bibliothek, verwenden kann. Der Standardwert ist 9, was auch der höchste Wert ist. Um den erlaubten Speicher genau zu berechnen, sollten Sie den DeflateMemLevel-Wert mit 16K multiplizieren.
- DeflateWindowSize – die Größe des Kompressionsfensters. Standardmäßig ist es der höchstmögliche Wert von 15. Eine höhere Zahl bedeutet eine höhere Komprimierungsstufe, wiederum um den Preis von mehr Serverressourcen.
In den meisten Fällen kannst Du die obigen Parameter auf ihren Standardwerten belassen. Wenn Du jedoch den Verdacht hast, dass sich die Leistung Deines Servers nach der Verwendung von mod_deflate deutlich verschlechtert hat, konfiguriere niedrigere Werte in Deine Konfigurationsdatei /etc/httpd/conf.d/mod_deflate.conf wie folgt:
DeflateCompressionLevel 1
Dadurch wird der Komprimierungsgrad verringert, was dazu führt, dass die Dateien größer werden. Allerdings wird mod_deflate auf diese Weise weniger CPU verbrauchen. Wie oben bereits erwähnt, solltest du sicherstellen, dass Du den Apache neu startest, um die Änderungen zu aktivieren.
Testen
Es gibt verschiedene Möglichkeiten, mod_deflate zu testen, aber die einfachste ist die Nutzung von wget, dem nicht-interaktiven Netzwerk-Downloader. Wenn Du ihn nicht bereits auf Deinem CentOS 7 System hast, kannst Du ihn mit dem Befehl sudo yum install -y wget installieren.
Für den Test benötigen Sie eine Textdatei die durch Komprimierung kleiner werden sollte. In meinem Fall wird eine WordPress Installation zum Test herangezogen. Ich schaue im Quellmonitor (Source) in den Entwicklertools von Chrome nach, welche Dateien geladen werden.
Wenn Du eine solche Datei nicht zur Hand hast, kannst Du JQuery, eine beliebte JavaScript-Bibliothek, herunterladen und auf Deiner Website hochladen. Wenn Du nicht sicher bist, wo Du die Datei ablegen sollst, kannst Du sie einfach in das Apache-Standard Stammverzeichnis (document root) hochladen, welches bei CentOS 7 /var/www/html/ ist. So ist die Datei im Stammverzeichnis Ihrer Standardsite verfügbar.
Hinweis: Damit mod_deflate die Ausgabe komprimieren kann, muss der Client (normalerweise der Browser) die Komprimierung unterstützen. Wenn der Client die Komprimierung nicht unterstützt, wird die Datei so gesendet, wie sie ist.
Sobald die Beispiel-Testdatei auf Deine Website hochgeladen wurde, lade sie Dir mit wget herunter. Du kannst diesen Test entweder von Deinem lokalen Rechner oder vom Server selbst aus durchführen. etwa so:
wget --header="Accept-Encoding: gzip" https://www.DEIN-SERVER.de/wp-includes/js/wp-embed.min.js
Im obigen Beispiel lädst Du die Datei jquery-1.11.3.js von Deinem Apache-Server herunter. Um die Komprimierung zu nutzen, übergeben wir das zusätzliche wget-Header-Argument Accept-Encoding: gzip.
Wenn die Datei wp-embed.min.js auf die oben beschriebene Weise heruntergeladen wurde, sollte sie 769 Byte groß sein. Tatsächlich handelt es sich dabei nicht um dieselbe Original-JavaScript-Datei, und sie sollte vom Client zusätzlich extrahiert werden, was ebenfalls einen gewissen Overhead auf der Client-Seite verursacht. Die über das Netzwerk übertragene Größe wird jedoch nur 769B betragen, was in etwa um die Hälfte kleiner ist als die Originaldatei (1,5KB). Bei größeren Dateien ist das Einsparpotential durch die Optimierung mit Mod_deflate noch größer, das Größenverhältnis der komprimierten Datei zur Originaldatei kann dabei ein X-faches betragen.
Du kannst die obige Berechnung verifizieren, indem Du die Größe der heruntergeladenen Datei mit dem Linux-Befehl zum Auflisten des Verzeichnisinhalts ls wie folgt überprüfen:
ls -ahl wp-embed.min.js
-rw-r--r-- 1 apache apache 769 1. Apr 2020 wp-embed.min.js
Anschließend kannst Du das Ergebnis wieder mit dem ls-Befehl mit der Originaldatei auf Deinem Server vergleichen:
ls -ahl /var/www/DEIN-VERZEICHNIS/wp-includes/js/wp-embed.min.js
-rw-r--r-- 1 apache apache 1,5K 1. Apr 2020 /var/www/hsww/wp-includes/js/wp-embed.min.js
Hier zum Vergleich der Screenshot von meinem System mit allen oben aufgeführten Befehlen:
Fazit
Wie Du in diesem Artikel und dem Praxisbeispiel mit der wp-embed.min.js gesehen hast, kann Mod_deflate Dir dabei helfen, den Bandbreitenbedarf für Ihre Website deutlich zu senken. Um mit der Optimierung Deiner Website fortzufahren, bietet sich das Apache Content Caching an. Dies ist der nächste logische Schritt nach der Aktivierung von mod_deflate.