Sicherheitswarnung: Bitte keine Version älter als 1.11 verwenden!

Installation und Anpassung von gzip_cnc

Konfiguration

Das Verhalten von gzip_cnc wird durch eine Anzahl von Parametern festgelegt. Mit etwas Glück reichen die voreingestellten Standardwerte bereits aus, um das Programm zu verwenden; wahrscheinlich jedoch müssen diese Werte den Gegebenheiten Deines Webspace angepaßt werden.

Für diese Anpassung stehen zwei Methoden zur Verfügung:

Die zweite Methode hat den Vorteil, daß beim Wechsel zu einer künftigen Programmversion die vorherigen Anpassungen nicht erneut vorgenommen werden müssen; gleichzeitig mag es für einige Anwender angenehmer sein, keine Änderungen in einem fremden Programm-Quelltext vornehmen zu müssen (was ja die Gefahr in sich bergen kann, versehentlich Fehler dort einzubauen). Die Konfiguration über Environment-Variablen setzt allerdings zusätzliche Berechtigungen voraus, die nicht bei jeder Webserver-Konfiguration als selbstverständlich betrachtet werden dürfen; es ist also durchaus denkbar, daß diese Möglichkeit manchen Anwendern verwehrt sein wird.

In den nachfolgenden Abschnitten dieses Dokuments werden

beschrieben. Am Ende des Kapitels folgt eine Beschreibung, wie eine Konfiguration unter Verwendung von Environment-Variablen aussehen sollte und welche Voraussetzungen dafür erfüllt sein müssen.

Festlegung der Komprimierungsstufe

my $gzip_quality         = 9;

Dieser Parameter beschreibt die zu verwendende Komprimierungsstufe, welche die Qualität der Komprimierung festlegt.

Das gzip-Verfahren (egal, durch welches Werkzeug es umgesetzt wird) erlaubt die Angabe eines Wertes zwischen 0 und 9, wobei

bewirkt.

Da jeder Dateiinhalt von gzip_cnc nur ein einziges Mal komprimiert und anschließend nur noch aus dessen Cache-Baum geholt wird, sollten wir uns hier die bestmögliche Komprimierungsstufe leisten können.
(Zum Vergleich: mod_gzip gibt sich mit Stufe 6 zufrieden, um die entstehende CPU-Last für den Server in Grenzen zu halten.)

Environment-Variable: GZIP_CNC_QUALITY.

Festlegung des Pfades für das Komprimierungsprogramm gzip

Falls auf dem Server das Modul Compress::Zlib installiert ist, hat dieser Teil der Konfiguration keine Wirkung - gzip_cnc versucht vorrangig, dieses Perl-Modul zu verwenden, und greift nur ersatzweise auf die Verwendung eines externen Programms zurück.
(gzip_cnc informiert den Anwender im Rahmen seiner Selbsttest-Funktion darüber, welches Werkzeug zur Komprimierung es auf diesem Server ausgewählt hat.)

Falls jedoch tatsächlich ein Systemkommando (für UNIX) bzw. separates Programm (für Windows) zur Komprimierung erforderlich ist, verläßt sich gzip_cnc nicht darauf, daß der Apache-Webserver konfiguriert ist, ihm eine ausreichende Liste von Programmverzeichnissen in der Environment-Variable PATH zu übergeben, sondern es besteht darauf, dieses Komprimierungsprogramm über deren vollständigen Pfadnamen direkt anzusprechen.

my $gzip_path            = '/usr/bin/gzip';

Da diese Pfadnamen in UNIX-Systemen relativ gut standardisiert sind, besteht die berechtigte Hoffnung, daß der voreingestellte Wert ohne Änderung funktionieren könnte. Sollte gzip_cnc sich weigern, irgend etwas zu komprimieren, und statt dessen entsprechende Meldungen in seine Protokolldatei schreiben, dann ist möglicherweise das erforderliche Programm nicht (unter dem angegebenen Pfadnamen) vorhanden.

gzip_cnc hat einen ihm wahrscheinlich erscheinenden Pfad zu einem gzip-Kommando auf UNIX-Servern voreingestellt, kann aber keine Garantie dafür geben, daß Dein Server dazu passend installiert wurde. Falls Du einen Dialog-Zugang (telnet, ssh) zum Server mit Deinem Webspace besitzt, kannst Du dort eine (beliebige) shell öffnen und mit dem Kommando which gzip prüfen lassen, unter welchem Pfadnamen diese shell das Kommando gzip finden würde.

Unter Windows wird der Einsatz des verbreiteten Perl-Interpreters ActivePerl empfohlen, welcher das Modul Compress::Zlib mitliefert. Es ist jedoch auch unter Windows möglich, ein separates Programm (gzip.exe) für die Komprimierung zu verwenden. (Tatsächlich wurde gzip_cnc sogar mit dieser Methode auf einer Windows-Plattform entwickelt und getestet.)

Environment-Variable: GZIP_CNC_PROGRAM.

Festlegung des Wurzelverzeichnisses für den Cache-Baum

my $cache_directory      = '';

Dieser Parameter beschreibt den vollständigen Pfadnamen des Verzeichnisses, innerhalb dessen gzip_cnc seinen Verzeichnisbaum für den Cache der komprimierten Versionen aller angeforderten Dateien aufbaut.

Wurde an dieser Stelle eine leere Zeichenkette angegeben, dann verwendet gzip_cnc automatisch das Verzeichnis .gzip_cnc_cache im DOCUMENT_ROOT der entsprechenden Domain. In diesem Falle liegen auch die Cache-Dateien innerhalb des URL-Baums und wären daher direkt via URL ansprechbar, können jedoch nur bei entsprechender Konfiguration des Webservers und zudem nur durch hinreichend fähige Browser korrekt verarbeitet werden. Deshalb wird empfohlen, das Cache-Verzeichnis außerhalb des URL-Raums anzulegen.

gzip_cnc legt bei Bedarf alle erforderlichen Verzeichnisse für den Cache selbst an. Sollte dies nicht funktionieren (z. B. wegen fehlender Schreibberechtigung), dann liefert gzip_cnc die angeforderten Daten in unkomprimierter Form aus und vermerkt dies in seiner Protokolldatei mit einem entsprechenden Statuscode.

Environment-Variable: GZIP_CNC_CACHE.

Festlegung der gzip_cnc-eigenen Protokolldatei

my $logfile_path         = '';

Dieser Parameter beschreibt den vollständigen Pfadnamen der von gzip_cnc zu erzeugenden Protokolldatei.

Wurde an dieser Stelle eine leere Zeichenkette angegeben, dann erzeugt gzip_cnc keine Protokolldatei.

Wird ein Pfadname angegeben, dann versucht gzip_cnc dort, eine Protokolldatei anzulegen (und ggf. auch alle dafür erforderlichen Verzeichnisse innerhalb des Pfadnamens) bzw. eine bereits vorhandene Datei am Ende zu erweitern; falls dies scheitert (z. B. wegen fehlender Schreibberechtigung), dann werden keine Protokollmeldungen erzeugt (ohne explizite Warnung an den Benutzer).

Environment-Variable: GZIP_CNC_LOGFILE.

Festlegung des zu verwendenden Fehlerdokuments

my $error404_handler     = '';

Dieser Parameter beschreibt den absoluten URL (inklusive Domain-Anteil) der von gzip_cnc zu verwendenden Fehlerbehandlungsseite im Falle eines Zugriffs auf eine nicht vorhandene Datei.

Ein Apache-Handler wird aktiviert, nachdem ein großer Teils der Auswertung eines URL-Zugriffs abgeschlossen ist (zu diesem Zeitpunkt sind beispielsweise URL-Übersetzungen aller Art bereits durchgeführt worden: URL-Rewriting, Directory Defaults, Content Negotiation, ...). Der Apache-Server hat jedoch keineswegs überprüft, ob die tatsächlich angeforderte Datei überhaupt existiert. Diese Prüfung muß also von gzip_cnc selbst erledigt werden.

Falls die gewünschte Datei tatsächlich nicht existiert, dann würde der Apache-Server normalerweise eine Definition einer Fehlerbehandlungsseite durch den Administrator auswerten und deren Inhalt an den Client ausliefern. Beachte allerdings, daß gzip_cnc kein Apache-Modul ist und keinen internen Subrequests starten kann für den Fall, daß Dein Fehlerdokument ein CGI-Program oder ein SSI-Dokument ist oder ggf. auch via Content Negotiation dynamisch ausgewählt wird - und es kann auch nicht die Information darüber, welche Seite ursprünglich angefordert wurde, in derselben Weise anbieten (als Environment-Variable), wie Apache selbst das getan hätte. "Houston, wir haben ein Problem."

gzip_cnc kann Dir nicht alles geben, was Du vielleicht haben möchtest - es läßt Dir jedoch die Wahl, was Dir am Wichtigsten erscheint:

Environment-Variable: GZIP_CNC_404_HANDLER.

Festlegung des auszuliefernden MIME-Typs

my $mime_type            = 'text/html';

Dieser Parameter beschreibt den von gzip_cnc als HTTP-Header der ausgelieferten Antworten zu sendenden MIME-Typ.

In seiner Funktion als Apache-Handler hat gzip_cnc keinen Zugriff auf die Apache-Konfiguration, welche eine Abbildung des Namens der angeforderten Datei auf einen MIME-Typ enthält. Deshalb muß im Programm selbst ein entsprechender Wert definiert werden.

Für künftige Programmversionen wäre es denkbar, eine Tabelle zur Abbildung von z. B. Dateinamensmuster auf MIME-Typen anzubieten. Der entsprechende Aufwand erscheint aber derzeit nicht vertretbar:

Environment-Variable: GZIP_CNC_MIMETYPE.

Senden gzip_cnc-eigener HTTP-Header

my $send_own_headers      = 1;

Dieser Parameter entscheidet darüber, ob gzip_cnc zusätzlich zu den sonstigen Informationen eigene HTTP-Header mitsenden darf. Diese HTTP-Header sind:

Falls an dieser Stelle der Wert 0 eingetragen wird, dann werden diese beiden HTTP-Header nicht gesendet. Und weil beide Path-Header zwar zum Verständnis des Zugriffsverfahrens hilfreich sein können, aber verräterische Informationen über Deine Server-Konfiguration bekannt geben würden, werden sie nur dann erzeugt, wenn gzip_cnc zusätzlich mit aktiviertem Selbsttest-Modus verwendet wird.

Environment-Variable: GZIP_CNC_OWNHEADERS.

Aktivierung des Selbsttest-Modus

my $enable_self_test_mode = 1;

Dieser Parameter entscheidet darüber, ob der Selbsttest-Modus von gzip_cnc verfügbar ist.

Während der Installations- und Testphase ist es sinnvoll, dieses Feature zu verwenden, um Anhaltspunkte für korrekte Werte der einstellbaren Parameter zu erhalten. Allerdings enthüllt die Ausgabe im Selbsttest-Modus reale absolute Pfadnamen des Servers und kann deshalb deaktiviert werden, falls dies aus Sicherheitsgründen ratsam erscheint.

Environment-Variable: GZIP_CNC_SELFTEST.

Senden einer Browser-Cache-Aufbewahrungsdauer

my $cache_expire_seconds  = 86400;

Dieser Parameter beschreibt, wie viele Sekunden lang ein Browser den Inhalt der ausgelieferten Seite in seinem Cache halten darf, ohne die Gültigkeit des Inhalts durch Rückfrage beim HTTP-Server zu überprüfen.

Eigentlich gehört Browser-Caching nicht zum Aufgabengebiet von gzip_cnc. Andererseits: Keine Datenübertragung via HTTP kann wirkungsvoller komprimiert werden als eine, die vom Browser gar nicht erst angefordert wurde. Und besonders bei kleinen, oft verwendeten Seiten (etwa Navigationselemente bei Verwendung von Framesets) kann es durchaus etwas nützen, wenn der Browser so eingestellt ist, daß er dem Gültigkeitsintervall glaubt, das ihm durch die HTTP-Header

übermittelt wurde, statt dieselbe Seite immer wieder vom Server anzufordern.

Andererseits: Ist an dieser Stelle ein sehr hoher Wert eingetragen und haben sich URLs geändert, dann müssen nun nicht mehr verwendete Dateien mindestens für den definierten Gültigkeitszeitraum vorrätig gehalten werden, da in den Browser-Caches noch entsprechende Verweise auf diese Dateien vorhanden sein können.
Sollten allerdings nachträgliche Änderungen am Inhalt existierender Dokumente ausgeschlossen werden können, dann kann für diesen Parameter ein sehr hoher Wert sinnvoll sein.

Falls an dieser Stelle der Wert 0 eingetragen wird, dann werden diese beiden HTTP-Header nicht gesendet.

Environment-Variable: GZIP_CNC_EXPIRES.

Konfiguration über Environment-Variablen

Statt durch eine Änderung des Programm-Quelltextes können die Werte der Parameter auch mit Hilfe von Environment-Variablen in der Webserver-Konfiguration gesetzt werden.

Dafür müssen folgende Voraussetzungen gegeben sein:

Für das Setzen einer Environment-Variable ist die Apache-Direktive SetEnv verfügbar.

Es ist zulässig, diese Environment-Variablen in derselben .htaccess-Datei zu setzen, welche auch die Aktivierung von gzip_cnc bewirkt. Alternativ reicht es aber aus, diese Environment-Variablen nur genau für den URL des Programms gzip_cnc zu definieren; dies würde das Risiko reduzieren, das Verhalten anderer CGI-Anwendungen in unerwünschter Weise zu beeinflussen.

Die Standardwerte aller Parameter entsprechen der folgenden Apache-Konfiguration:

<Files gzip_cnc.pl>
 SetEnv GZIP_CNC_QUALITY      9
 SetEnv GZIP_CNC_PROGRAM      /usr/bin/gzip
 SetEnv GZIP_CNC_CACHE        ""
 SetEnv GZIP_CNC_LOGFILE      ""
 SetEnv GZIP_CNC_404_HANDLER  ""
 SetEnv GZIP_CNC_MIMETYPE     text/html
 SetEnv GZIP_CNC_OWNHEADERS   1
 SetEnv GZIP_CNC_SELFTEST     1
 SetEnv GZIP_CNC_EXPIRES      86400
</Files>

Diese Anweisungen sind ggf. den Anforderungen des eigenen Installation anzupassen.

Installation des Programms als CGI-Skript

gzip_cnc muß in Deinem Webspace als CGI-Skript installiert werden.

Wie das genau funktioniert, hängt in so vielfältiger Weise von den Eigenheiten Deines Webspace ab, daß eine detaillierte Beschreibung an dieser Stelle nicht möglich ist.

Deshalb seien lediglich ein paar Anhaltspunkte genannt:

Als allgemeinen Hintergrund zu diesem Thema kann ich zudem noch diese Seite empfehlen.

Selbsttest des CGI-Skripts

Nachdem das CGI-Skript erfolgreich installiert ist, kann es über den entsprechenden URL im Browser angesprochen werden.

Das Skript erkennt automatisch, daß es nicht als Apache-Handler aktiviert wurde und demzufolge nichts zu komprimieren hat. Statt dessen führt das Skript in diesem Falle einen Selbsttest durch - es

und zeigt die Ergebnisse dieser Tests dem Aufrufer in Form einer Webseite zurück.

Falls irgend etwas falsch konfiguriert wurde, ist die Chance sehr hoch, daß die Selbsttest-Funktion dies bemerkt - zu einem Zeitpunkt, zu dem der normale Betrieb des Webspace noch nicht beeinträchtigt wurde.

Die Selbsttest-Funktion bewirkt die Ausgabe einer Meldung in die Protokolldatei (und damit möglicherweise die implizite Erzeugung dieser Datei während der ersten Anforderung).

Aktivierung von gzip_cnc

Einbinden des Handlers

Abschließend muß das CGI-Skript als Handler in die Apache-Konfiguration eingebunden und mit den zu verarbeitenden Dateien verknüpft werden.

Dies geschieht üblicherweise durch eine .htaccess-Datei. Die Direktive

  Action text/html /cgi-bin/gzip_cnc.pl

verknüpft das CGI-Skript /cgi-bin/gzip_cnc.pl mit allen Dateien des MIME-Typs text/html (gemäß der restlichen Apache-Konfiguration - welche Dateien das auch immer sein mögen).

Soll diese Verknüpfung nur für Dateien mit einem bestimmten Namensmuster, beispielsweise *.html, eingerichtet werden, dann kann diese Einbindung des Handlers in der Syntax

<Files *.html>
  Action text/html /cgi-bin/gzip_cnc.pl
</Files>

bedingt formuliert werden.

Für mehrere Namensmuster, beispielsweise *.htm und *.html, wäre eine Einbindung der Art

<Files ~ \.html?$>
  Action text/html /cgi-bin/gzip_cnc.pl
</Files>

verwendbar - ebenso wie viele andere mögliche Formen der Einbindung, die in der Apache-Dokumentation ausführlich beschrieben werden.

Koexistenz von gzip_cnc und Server Side Includes

Es sei ausdrücklich darauf hingewiesen, daß Dateien, deren Inhalt selbst via SSI in andere Dokumente eingefügt werden soll, nicht in komprimierter Form ausgeliefert werden dürfen. Der SSI-Handler würde den komprimierten Inhalt in eine ansonsten unkomprimierte Seite einfügen und das Ergebnis an den Browser ausliefern, der das Ergebnis nicht verstehen würde.

Es ist also zu empfehlen, für solche Dateien (die ohnehin nur Teile von HTML-Dokumenten enthalten) eine andere Namensendung zu verwenden. gzip_cnc kann nicht erkennen, ob eine normale Anforderung oder ein Apache-interner Subrequest verarbeitet werden soll.
(mod_gzip als Apache-Modul kann solche Zugriffsarten voneinander unterscheiden und komprimiert nur Antworten auf 'normale' Anforderungen.)

Testen der Installation

Falls irgend etwas während der Installation nicht funktioniert hat, aber das CGI-Skript durch die Bindung aller Dokumente an diesen Handler für den gesamten Web-Auftritt aktiviert wurde, könnte im schlimmsten Falle solange keine einzige statische HTML-Seite mehr ausgeliefert werden, bis der Fehler behoben oder diese Bindung wieder aufgehoben wurde (durch Entfernen des entsprechenden Eintrags in der .htaccess-Datei - Änderungen in solchen Dateien treten sofort in Kraft, dazu ist kein Neustart des Webservers erforderlich).

Daher empfiehlt es sich, erst mal ein Test-Verzeichnis mit einer Handvoll Dokumente zu erzeugen, die .htaccess-Datei dort wie beschrieben anzulegen und auszuprobieren, was passiert:

  1. Werden die Seiten weiterhin korrekt im Browser angezeigt?
  2. Wird das CGI-Skript vom Apache-Webserver tatsächlich als Handler verwendet, d. h.:
    1. Wurden Dateien im Cache-Verzeichnis angelegt?
    2. Wurden Meldungen in die Protokolldatei von gzip_cnc geschrieben?
    3. Ist die Größe der ausgelieferten Dokumente wie erwartet deutlich kleiner geworden?
      (Einige Browser zeigen diese Größe während der Übertragung an; auch ein Blick in die Apache-Protokolldatei access_log kann darüber Aufschluß bringen.)
    4. Werden nun tatsächlich gzip-komprimierte Daten an den Browser geliefert?
      (Dies kann durch einen Blick auf HTTP-Header und Daten der Antwort des Webservers mit Hilfe eines geeigneten Programms überprüft werden - ebenso wie die Auslieferung der zusätzlichen HTTP-Header von gzip_cnc.)

Erst nachdem alles wie erwartet funktioniert hat, sollte der Inhalt dieser .htaccess-Datei in das Wurzelverzeichnis des zu verarbeitenden Dateibaums übertragen werden. Ab diesem Moment wird der Handler für den gesamten Verzeichnisbaum in Aktion treten (und das Cache-Verzeichnis nach und nach mit Unterverzeichnissen und Dateien bevölkern).

Aufgrund der Erfahrungen mit der Version 1.10 empfehle ich ausdrücklich, die Erkennung illegaler Zugriffe zu testen.

(Michael Schröpl, 2004-01-11)