Apache HTTP Server Version 2.0

Modularisierung und Erweiterbarkeit


[ Seminar Linux und Apache ] ... [ Inhaltsübersicht ] ... [ Literatur ]


Übersicht: Modularisierung und Erweiterbarkeit

Nach oben

Apache ist ein modularer Server. Nur die grundlegende Basis-Funktionalität ist direkt im Server-Kern enthalten. Zusätzliche Features können durch Module Apache hinzugefügt werden.

Ü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.

Nach oben

Zuweisung von Modulen/Filtern

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>


Nach oben

Filter

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.

Nach oben

Datenübergabe zwischen Filtern

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.


Nach oben

mod_ext_filter

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".
"mode=output"
zeigt, dass es sich um einen Output-Filter handelt, und als Kommando cmd wird der sort-Befehl verwendet.
Die Ausgabe des Filters ist wieder vom MIME-Typ text/plain.

Nach oben

Multiprotocol Support

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.

Einen einzelnen Server mehrere Protokolle bedienen zu lassen bietet einige Vorteile.

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.

Nach oben

[ Seminar Linux und Apache ] ... [ Inhaltsübersicht ] ... [ Literatur ]