[ Seminar Linux und Apache ] ... [ Inhaltsübersicht ] ... [ Literatur ]
Üblicherweise werden die Module dem Server während des Kompilierens
des gesamten Projektes hinzugefügt.
Sind die Module jedoch als Dynamic Shared Objekts (DSO) kompiliert, können
sie ohne neue Kompilierung des Servers eingebunden werden.
Module für Skriptsprachen:
Es gibt einige Module für die Verwendung von Skriptsprachen.(zb mod_php,
mod_perl, mod_tcl)
Gegenüber der Verwendung von Skripten als CGI-Skripte über externe
Interpreter führt die Verwendung von den Modulen zu einer Erhöhung
der Verarbeitungsgeschwindigkeit. Das liegt daran, dass der Interpreter beim
Start des Servers mit gestartet wird und immer verfügbar ist. Der Initialisierungsprozess
muss also nicht bei jedem Aufruf eines Skriptes ablaufen.
mod_perl
Über das Perl-Modul ist der Zugriff auf gesammte Apache 2-API möglich.
Es können Apache-Module in Perl geschrieben werden.
mod_tcl
Das TCL-Modul ist noch nicht im Apache-Paket mit dabei und noch kaum dokumentiert.
Es soll auch mit TCL möglich sein Apache-Module zu schreiben.
Module und Filter können bestimmten Dateien oder Verzeichnissen zugewiesen
werden.
Mit AddHandler
kann man Module bestimmten Dateiendungen zuweisen.
Bsp: Werden "*.cgi"-Dateien angefragt, sollen diese nicht direkt ausgeliefert
werden, sondern an das CGI-Modul weitergegeben werden.
AddHandler cgi-script .cgi
SetHandler
kann innerhalb von Location
oder Directory
-Kontainern
oder in .htaccess-Dateien benutzt werden. So können z.B. alle Dateien eines
bestimmten Verzeichnisses an das CGI-Modul weitergegeben werden.
Das folgende Beispiel sorgt dafür, dass bei URLs die mit "/status"
beginnen eine HTML-Seite mit einem Statusbericht des Apache-Servers generiert
wird.
<Location /status>
SetHandler server-status
</Location>
Entsprechend können Ausgabe
-Filter mit
der Direktive SetOutputFilter
den Dateien eines Verzeichnisses
zugewiesen werden.
<Directory /www/data/>
SetOutputFilter INCLUDES
</Directory>
Es ist jetzt möglich, dass ein Modul die Ausgabe eines anderen Moduls
modifiziert.
Es können mehrere Filter auf den Datenstrom angesetzt werden. Die Reihenfolge
kann explizit angegeben werden.
<Location /zu_filtern>
SetOutputFilter FILTER_1,FILTER_2
</Location>
Bei Apache 2 ist momentan nur der Filter mod_include für SSI (Server Side
Includes) dabei.
Praktisch: Jetzt kann auch die Ausgabe von CGI-Skripten SSI-Tags enthalten,
da die Ausgabe durch den Filter geschickt werden kann.
Es gibt zwei Gruppen von Filtern. Zum einen Input-Filter, die die Daten, die vom Client zum Server geschickt werden bearbeiten können und zum anderen Output-Filter durch die Daten vom Server zum Client geschickt werden können.
In diesem Punkt ist die API an die "buffered file I/O API" von POSIX
(Portable Operating System Interface for UNIX) angelehnt.
Die Daten, die der Filter verarbeiten soll werden ihm nicht immer alle auf einmal
übergeben.
Der Datenstrom wird in Einheiten namens Buckets (Eimer) unterteilt. Mehrere
Buckets werden zu einer Bucket-Brigade (mil. größere Truppenabteilung)
zusammengefasst.
Diese werden maximal 8k groß. Sind die 8k erreicht wird die Brigade an
den Filter geschickt.
Ein Filter bearbeitet also nur eine Brigade auf einmal und schickt diese dann
an den nächsten Filter weiter.
Es gibt 5 Methoden mit denen ein Filter Daten an den nächsten Filter in
der Liste weitergeben kann.
So können
1. eine bestimmte Anzahl von Zeichen eines Strings,
2. ein String,
3. ein Zeichen,
4. mehrere Strings,
5. ein formatierter String
an den nächsten Filter
geschrieben werden.
Diese Methoden buffern die Daten solange bis genug zum Senden vorliegt. Also
8k.
Mit der Methode ap_fflush
. kann jedoch ein sofortiges Senden erzwungen
werden.
Apache Filter werden so oft aufgerufen, wie es nötig ist, um alle Daten
zu verarbeiten.
Falls der Filter für seine Arbeiten mehr Daten benötigt, als ihm übermittelt
wurde, kann der Filter seinen Zustand speichern und seine Arbeit beim nächsten
Aufruf mit der neuen Datenportion fortsetzen.
Mit Hilfe des Moduls mod_ext_filter können externe Programme als Filter
benutzt werden.
Geeignet ist dafür jedes Programm, das von der Standardeingabe liest und
in die Standardausgabe schreibt.
Beispiel:
Die angeforderte Textdatei soll von dem Programm sort
sortiert
werden. Die Ausgabe des Programmes wird an den Browser weitergeleitet:
ExtFilterDefine sorter intype=text/plain \
mode=output cmd=/usr/bin/sort outtype=text/plain
# Unterhalb der URI /sorted soll der oben definierte Filter angewandt
#werden.
<Location /sorted>
SetOutputFilter sorter
</Location>
Erklärung:
"sorter" ist der Name des Filters. Er verarbeitet Dateien vom vom
MIME-Typ "text/plain".
zeigt, dass es sich um einen Output-Filter handelt,
und als Kommando cmd wird der sort-Befehl verwendet.
"mode=output"
Die Ausgabe des Filters ist wieder vom MIME-Typ text/plain.
Die neue Infrastrukur von Apache ermöglicht es Module zu erzeugen, die
dem Server weitere Protokolle 'beibringen'.
Der urspüngliche Grund der Programmierer die Architektur auf diese Weise
zu entwerfen war, dass sie es jedermann ermöglichen wollten neue Protokolle
schnell und einfach zu implementieren.
Bis jetzt gibt es nur ein exemplarisches Modul mod_echo, das Apache 2.0 als
simpler Test beiliegt. Dieses Protokoll gibt ein echo von dem Text-String der
ihm zugeschickt wurde zurück.
Einige Firmen planen jedoch bereits Protokol-Module für Apache zu schreiben.
[ Seminar Linux und Apache ] ... [ Inhaltsübersicht ] ... [ Literatur ]