Inhaltsverzeichnis
Apache HTTP Server CentOS 7 - mod_deflate - Komprimierte Kommunikation
Das Apache HTTPD Server-Modul mod_deflate
implementiert den „DEFLATE“ Ausgabefilter, welcher es erlaubt, die Auslieferung von Inhalten zu komprimieren, bevor diese dann zum anfordernden Client/Browser über das Netzwerk/Internet gesendet wird.
Siehe auch nachfolgenden externen Link:
Vorbereitungen
Das Apache HTTPD Server-Modul mod_deflate
ist Bestandteil der Standardinstallation eines Apache HTTPD Server unter CentOS.
HINWEIS - Beim Einsatz des
- Apache HTTPD Server-Modul
mod_deflate
sollten auch die Module
- Apache HTTPD Server-Modul
mod_headers
- Apache HTTPD Server-Modul
mod_setenvif
geladen werden, wie nachfolgend gezeigt:
Konfigurationsdatei: /etc/httpd/conf.modules.d/00-base.conf
- (nur relevanter Ausschnitt):
... LoadModule deflate_module modules/mod_deflate.so LoadModule headers_module modules/mod_headers.so LoadModule headers_module modules/mod_setenvif.so ...
Konfiguration
Nachfolgendes Beispiel, soll die Einbindung demonstrieren: (nur relevanter Ausschnitt)
... <IfModule deflate_module> # Place filter 'DEFLATE' on all outgoing content SetOutputFilter DEFLATE # Exclude uncompressible browser via part of user-agent string BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4\.0[678] no-gzip BrowserMatch \bMSIE !no-gzip !gzip-only-text/html # Exclude uncompressible content via file type <IfModule setenvif_module> SetEnvIfNoCase Request_URI \.(?:png|jpe?g|gif|tar|gz|zip)$ no-gzip </IfModule> <IfModule headers_module> # Properly handle requests coming from behind proxies Header append Vary User-Agent </IfModule> </IfModule> ...
Erklärungen:
Aktivieren des Filters - DEFLATE - im Container dem diese Anweisung enthalten ist. Hier ist das die Anweisung <Location />
, welchen den umschließenden Container darstellt.
SetOutputFilter DEFLATE
Ausschluss von bestimmten Browsern, welche Probleme mit der Komprimierung von Inhalten haben. Je nach Browser, welcher über BrowserMatch
indentifiziert wird, kann hier die Einschränkung individuell gesetzt werden.
BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4\.0[678] no-gzip BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
Schließt die in der URI angeforderten Datei-Typen von der Komprimierung aus. Dies macht bei Datei-Typen sinn, welche bereits selbst ein komprimiertes Format aufweisen.
<IfModule setenvif_module> SetEnvIfNoCase Request_URI \.(?:png|jpe?g|gif|tar|gz|zip)$ no-gzip </IfModule>
Das Apache HTTPD Server-Modul mod_deflate
sendet eine Zeichenkette
Vary: Accept-Encoding HTTP Response-Header
an z.B. zwischengeschaltete Proxy-Server.
Dies bewirkt, dass eine zwischengespeicherte Antwort nur an Clients/Browser, die die entsprechende
Accept-Encoding-Request-Header
senden, komprimiert ausgeliefert wird.
Dadurch wird verhindert, dass komprimierte Inhalte an einen Clients/Browser gesendet werden, welche mit komprimierten Inhalten nicht umgehen können.
Nachfolgendes Beispiel, bezieht sich auf die Angabe im Header
bezogen auf den USer-Agent-String
und der Angabe, welche bereits in den BrowserMatch
Definitionen gesetzt wurden.
<IfModule headers_module> # Properly handle requests coming from behind proxies Header append Vary User-Agent </IfModule>
Anpassung LOG-Auswertung
Das Apache HTTPD Server-Modul mod_deflate
besitzt die Möglichkeit die ausgelieferten Bytes und den Komprimierungsgrad der ausgelieferten Seiten zu protokollieren.
Nachfolgendes Beispiel zeigt wie die bestehende LOG-Direktive des Apache HTTPD Server erweitert werden kann.
Standard: (nur relevanter Ausschnitt)
... LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined ...
Erweitert: (nur relevanter Ausschnitt)
... DeflateFilterNote Input instream DeflateFilterNote Output outstream DeflateFilterNote Ratio ratio LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %b %{outstream}n/%{instream}n (%{ratio}n%%)" combined_deflate ...
Entsprechend muss nun auch die Angabe, wie geloggt werden soll entsprechend im Host/VHost angepasst werden.
Standard: (nur relevanter Ausschnitt)
...
CustomLog logs/access_log combined
...
Erweitert: (nur relevanter Ausschnitt)
CustomLog logs/access_log combined_deflate
Nachfolgend ein kurzer Verglich, ohne die veränderte Log-Ausgabe
88.217.171.167 - - [05/Dec/2016:13:31:47 +0100] "GET /js/base.js HTTP/1.1" 200 116 "https://www.tachtler.net/" "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0" TLSv1.2 ECDHE-RSA-AES128-SHA
und mit
88.217.171.167 - - [05/Dec/2016:13:31:47 +0100] "GET /js/base.js HTTP/1.1" 200 116 "https://www.tachtler.net/" "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0" TLSv1.2 ECDHE-RSA-AES128-SHA 116 98/120 (81%)
Siehe auch nachfolgenden externen Link:
Test
Um zu sehen, ob die Seiten auch entsprechend komprimiert, für Clients/Browser die mit Komprimierung umgehen können, ausgeliefert werden, kann nachfolgendes Programm genutzt werden:
curl
Nachfolgender Aufruf der Webseite http://www.dokuwiki.tachtler.net/doku.php OHNE Komprimierung:
# curl -v -o /dev/null http://www.dokuwiki.tachtler.net/doku.php
Ergebnis:
* About to connect() to www.dokuwiki.tachtler.net port 80 (#0) * Trying 88.217.171.167... connected * Connected to www.dokuwiki.tachtler.net (88.217.171.167) port 80 (#0) > GET /doku.php HTTP/1.1 > User-Agent: curl/7.19.7 (i386-redhat-linux-gnu) libcurl/7.19.7 NSS/3.13.6.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2 > Host: www.dokuwiki.tachtler.net > Accept: */* > % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0< HTTP/1.1 200 OK < Date: Thu, 28 Mar 2013 15:18:14 GMT < Server: Apache < X-Powered-By: PHP/5.3.3 < Set-Cookie: DokuWiki=s55csog34qnbk37tsn33b6and1; path=/; HttpOnly < Expires: Thu, 19 Nov 1981 08:52:00 GMT < Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 < Pragma: no-cache < Set-Cookie: DW68700bfd16c2027de7de74a5a8202a6f=deleted; expires=Wed, 28-Mar-2012 15:18:13 GMT; path=/; httponly < Vary: Accept-Encoding,User-Agent < Transfer-Encoding: chunked < Content-Type: text/html; charset=utf-8 < { [data not shown] 100 64546 0 64546 0 0 88722 0 --:--:-- --:--:-- --:--:-- 98243* Connection #0 to host www.dokuwiki.tachtler.net left intact * Closing connection #0
Nachfolgender Aufruf der Webseite http://www.dokuwiki.tachtler.net/doku.php MIT Komprimierung:
# curl -v -o /dev/null --compressed http://www.dokuwiki.tachtler.net/doku.php
Ergebnis:
* About to connect() to www.dokuwiki.tachtler.net port 80 (#0) * Trying 88.217.171.167... connected * Connected to www.dokuwiki.tachtler.net (88.217.171.167) port 80 (#0) > GET /doku.php HTTP/1.1 > User-Agent: curl/7.19.7 (i386-redhat-linux-gnu) libcurl/7.19.7 NSS/3.13.6.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2 > Host: www.dokuwiki.tachtler.net > Accept: */* > Accept-Encoding: deflate, gzip > % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0< HTTP/1.1 200 OK < Date: Thu, 28 Mar 2013 15:20:37 GMT < Server: Apache < X-Powered-By: PHP/5.3.3 < Set-Cookie: DokuWiki=f9degc9hajf4bub0071jeppmp5; path=/; HttpOnly < Expires: Thu, 19 Nov 1981 08:52:00 GMT < Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 < Pragma: no-cache < Set-Cookie: DW68700bfd16c2027de7de74a5a8202a6f=deleted; expires=Wed, 28-Mar-2012 15:20:36 GMT; path=/; httponly < Vary: Accept-Encoding,User-Agent < Content-Encoding: gzip < Transfer-Encoding: chunked < Content-Type: text/html; charset=utf-8 < { [data not shown] 100 9708 0 9708 0 0 33630 0 --:--:-- --:--:-- --:--:-- 44532* Connection #0 to host www.dokuwiki.tachtler.net left intact * Closing connection #0
HINWEIS - Die Komprimierung spart in oben gezeigtem Beispiel 75 % an Transfervolumen !!!