Apache - eine kurze Einführung

Jörg Lehmann und Alexander Rahmeier

1 Einleitung

Die Aufgabe eines WWW-Servers besteht eigentlich im wesentlichen darin, auf Anfrage eines Clients, der eine URL (Universal Resource Locator, z. B. http://www.augsburg-live.de/luga/) übergibt, diese entweder in einen Dateinamen umzuwandeln und die entsprechende Datei zurückzusenden oder ein passendes Programm auszuführen, dessen Ausgabe dann an den Client übertragen wird.

Der erste Webserver überhaupt wurde am europäischen Zentrum für Hochenergiephysik CERN in Genf entwickelt. Wichtige Innovationen im Software-Bereich können also durchaus auch aus Europa kommen, und auch die Bedeutung von Grundlagenforschung sollte nicht unterschätzt werden...

Der Webserver Apache selbst ist eine Weiterentwicklung des NCSA-httpd des National Center for Supercomputing Applications, ist also quasi eine ,,gepatchte`` Version dieses Programmes, woher auch der Name rühren soll. Obwohl Apache kostenlos zur Verfügung gestellt wird, wir seine Entwicklung von einer ausgewählten Gruppe von Programmierern übernommen, der Apache Group.

Apache ist mit einem Anteil von fast 50 % inzwischen der meistverwendete WWW-Server im Internet.

2 Konfiguration

2.1 Allgemeines

Die Konfiguration des Apache gliedert sich in zwei Abschnitte. Zum einen muß man aufgrund der modularen Struktur des Apache vor seiner Übersetzung festlegen, welche Module man einbinden will. Dies ist in Abschnitt 2.2 näher beschrieben. Die notwendigen Verzeichnisse sowie die richtigen Zugriffsrechte werden in Abschnitt 2.3 erläutert. Die eigentliche Einrichtung erfolgt dann mittels einiger Konfigurationsdateien, die in Abschnitt 2.4 behandelt werden.

Übersetzung

 

Nachdem man die Quellen des Apache von CD installiert oder von [1] bzw. diversen Mirrors heruntergeladen und entpackt hat, sollte man sich in das Unterverzeichnis src begeben und dort die Datei Configuration editieren. Falls diese nicht existiert muß man zunächst Configuration.tmpl nach Configuration kopieren.

Die Datei Configuration enthält fünf verschiedene Arten von Zeilen:

Wichtig sind vor allem die Modulauswahlzeilen, da mit ihnen der Funktionsumfang des Apache festgelegt wird. Dabei kann man zunächst durchaus großzügig bei der Auswahl der einzukompilierenden Module vorgehen, da eine große Zahl von eingebundenen Modulen außer einer größeren Binärdatei keine wahrnehmbaren Performanceeinbußen verursachen sollte. Die Reihenfolge, in der die Module angegeben werden, bestimmt die Präzedenz, mit der diese später ausgeführt werden, wobei das zuletzt angegebene Modul die höchste Priorität erhält. Die Proxyfunktionalität des Apache kann beispielsweise bei Bedarf durch Angabe der Zeile

Module proxy_module modules/proxy/libproxy.a
aktiviert werden.

Nachdem man die gewünschte Module eingetragen hat, kann man mit

./Configure
aus Makefile.tmpl das eigentliche Makefile erstellen lassen. Die Übersetzung erfolgt wie gewohnt mit
make
und sollte als Resultat die ausführbare Datei httpd liefern, die man anschließend z. B. nach /usr/local/bin kopieren kann.

2.3 Verzeichnisse und Zugriffsrechte

 

Zur weiteren Einrichtung des Apache muß man nun einige Verzeichnisse für die Konfigurations- und Logdateien und natürlich auch für die Webseiten anlegen. Im weiteren verwenden wir folgende Verzeichnisstruktur:

/usr/local/etc/httpd Wurzelverzeichnis der Konfigurations- und Logdateien
/usr/local/etc/httpd/conf Verzeichnis für Konfigurationsdateien
/usr/local/etc/httpd/log Verzeichnis für Logdateien
/var/httpd Wurzelverzeichnis der HTML-Dokumente und CGI-Skripten
/var/httpd/htdocs Wurzelverzeichnis der HTML-Dokumente
/var/httpd/cgi-bin Wurzelverzeichnis der CGI-Skripten
/var/httpd/icons Einige Icons für die Darstellung von Indexseiten

Alle Verzeichnisse und die darin enthaltenen Dateien sollten dabei root und der Gruppe root gehören, zumindest falls der Verwalter der WWW-Seiten zugleich Systemverwalterrechte besitzt. Sollte dies nicht der Fall sein, muß man sich von Fall zu Fall eine etwas andere Regelung überlegen.

Nun benötigt man noch einen Benutzer und eine Gruppe, mit deren Rechten schließlich der httpd laufen soll. gif In unserem Fall haben wir hierfür einen Benutzer wwwrun und die Gruppe www eingerichtet. Wichtig ist hierbei nur, daß in /var/httpd und Unterverzeichnissen keine Datei und kein Verzeichnis wwwrun oder www gehören darf und daß nur der Inhaber (und evtl. auch die Gruppe) einer Datei bzw. eines Verzeichnisses Schreibrechte besitzt. Auf diese Weise kann verhindert werden, daß ein möglicher Eindringling, der sich auf irgendeine Weise die Rechte des Apache-Prozesses verschafft hat, an den WWW-Seiten oder, was noch schlimmer wäre, an den CGI-Skripten Veränderungen vornehmen kann. Für eine HTML-Datei würden in unserem Fall also typischerweise folgende Rechte gesetzt werden:

-rw-r--r-- 1 root root 516 May 1 1997 index.html
Die Verzeichnisse, in denen die HTML-Dateien bzw. die CGI-Skripten liegen, und alle im Pfad darüberliegenden Verzeichnisse müssen natürlich ,,andere`` Benutzer zumindest betreten (Recht x) können, also beispielsweise
drwxr-xr-x 3 root root 1024 May 1 14:41 htdocs/
Hinweis: Das hier noch gesetzte Leserecht für andere Benutzer, erlaubt bekanntlicherweise das Lesen des Inhaltsverzeichnisses des entsprechenden Unterverzeichnisses, was unter Umständen nicht erwünscht ist.

2.4 Konfigurationsdateien

 

Für die Konfiguration benötigen wir drei Dateien, die im Verzeichnis /usr/local/etc/httpd/conf abgelegt werden. gif Im den folgenden Abschnitten sind diese Dateien zusammen mit den wichtigsten Anweisungen anhand einer Beispielkonfiguration beschrieben. Bessere, vor allem ausführlich kommentierte Vorlagen für die Einrichtung des Apache findet man im Unterverzeichnis conf der Apache-Quellen unter den Namen httpd.conf-dist, access.conf.dist und srm.conf-dist. Eine Beschreibung aller Anweisungen im HTML-Format findet man in [3] oder in gedruckter Form in [2]. Wie dort haben wir bei der Beschreibung der Anweisungen folgendes Format gewählt:

Anweisung

Syntax: Beispiel Parameter
Voreinstellung: Beispiel Standardparameter
Kontext: Wo verwendet

Als Kontext tauchen dabei Serverkonfiguration, d.h. überall in den Konfigurationsdateien außer in Anweisungsblöcken für Virtuelle Hosts, Verzeichnisse, etc., auf die im Rahmen dieses Vortrages nur zum Teil eingegangen werden kann.

2.4.1 Die Datei httpd.conf

Mittels dieser Datei werden generelle Eigenschaften des Servers, wie z.B. die Portnummer und die Wurzelverzeichnisse der Konfigurations- und Logdateien, festgelegt. In unserer Beispielkonfiguration sieht das wie folgt aus:

# /usr/local/etc/httpd/conf/httpd.conf
    ServerType standalone
    Port 80
    User wwwrun
    Group www
    ServerAdmin www-admin@bubble.bobble.org 
    ServerRoot /usr/local/etc/httpd
    ErrorLog logs/error_log
    TransferLog logs/access_log
    PidFile logs/httpd.pid
    ServerName www.bubble.bobble.org
    MaxRequestsPerChild 30

Nun die Erläuterung der verwendeten Anweisungen:

ServerType

Syntax: ServerType Typ
Voreinstellung: ServerType standalone
Kontext: Serverkonfiguration

Die ServerType-Anweisung gibt an, ob der Server als Hintergrundprozeß laufen soll (Typ=standalone) oder erst auf Anfrage eines Clients via inetd gestartet werden soll (Typ=inetd). Im Normalfall sollte aus Performancegründen ein als Hintergrundprozeß laufender Webserver bevorzugt werden und nur bei knappen Ressourcen auf den Start durch den inetd umgestellt werden, zumal laut [2] die Unterstützung dieser Betriebsart am auslaufen ist.

Port

Syntax: Port Portnummer
Voreinstellung: Port 80
Kontext: Serverkonfiguration

Gibt die Portnummer an, auf welcher der Server auf eine Anfrage eines Clients wartet. Dies ist im Normalfall natürlich Port 80, der Standardport für das HTTP-Protokoll.

User

Syntax: User Benutzername oder User #Benutzer-ID
Voreinstellung: User #-1
Kontext: Serverkonfiguration, Virtuelle Hosts

Group

Syntax: Group Gruppenname oder Group #Gruppen-ID
Voreinstellung: Group #-1
Kontext: Serverkonfiguration, Virtuelle Hosts

Legt Benutzer und Gruppe fest, unter denen der Webserver Anfragen von Clients beantwortet. Dazu muß allerdings der ursprünglich gestartete httpd mit root-Rechten gestartet werden. Zur Sicherheitsrelevanz dieser Einstellungen: vgl. Abschnitt 2.3 und [2, 3].

ServerAdmin

Syntax: ServerAdmin e-Mail-Adresse
Kontext: Serverkonfiguration, Virtuelle Hosts

Gibt die e-Mail-Adresse an, die der Server in Fehlermeldungen einfügt, die er an die Clients zurücksendet.

ServerRoot

Syntax: ServerRoot Verzeichnisname
Voreinstellung: ServerRoot /usr/local/etc/httpd
Kontext: Serverkonfiguration

Gibt das Wurzelverzeichnis für die Konfigurations- und Logdateien des Webservers an. Relative Pfadnamen von solchen Dateien beziehen sich dann auf dieses Verzeichnis. Die Kommandozeilenoption -d des httpd wird durch diese Anweisung überschrieben, kann aber natürlich verwendet werden, um das Verzeichnis der Konfigurationsdateien und insbesondere der Datei httpd.conf beim Start des Servers anzugeben.

ErrorLog

Syntax: ErrorLog Dateiname
Voreinstellung: ErrorLog logs/error_log
Kontext: Serverkonfiguration, Virtuelle Hosts

Gibt den Namen der Datei an, die zum Protokollieren der Fehlermeldungen des Servers verwendet wird. Wenn der Dateiname nicht mit einem / beginnt, wird er als relativ zu ServerRoot interpretiert.

TransferLog

Syntax: TransferLog Dateiname oder Transferlog |Programm
Kontext: Serverkonfiguration, Virtuelle Hosts

Diese Anweisung ist nur verfügbar, wenn das Modul mod\_log\_config einkompiliert ist, was ab Apache 1.2 standardmäßig der Fall sein sollte. Dann kann als Option entweder eine Datei angegeben werden, in der die Zugriffe auf den Webserver protokolliert werden (zur Syntax des Dateinamen: vgl. ErrorLog) oder ein Pipe-Zeichen (|) gefolgt von einem Programmnamen. In letzterem Fall wird dem Programm auf der Standardeingabe die Logging-Information zur Verfügung gestellt. Dabei sollte man allerdings beachten, daß dieses Programm mit den Rechten desjenigen Benutzers läuft, der den httpd gestartet hat, also im allgemeinen root.

PidFile

Syntax: PidFile Dateiname
Voreinstellung: PidFile logs/httpd.pid
Kontext: Serverkonfiguration

Gibt die Datei an, in der die Prozeß-ID des laufenden httpd gespeichert wird. Diese Option ist nur im standalone-Modus des Servers wirksam. Bezüglich der Angabe des Dateinamens gilt natürlich wieder die unter der ErrorLog-Anweisung beschriebene Regel.

ServerName

Syntax: ServerName FQDN
Kontext: Serverkonfiguration, Virtuelle Hosts

Hiermit kann der Name des Webservers als fully qualified domain name angegeben werden, falls die standardmäßig vorgenommene Auflösung des Namens aus der IP-Adresse des Servers nicht das gewünschte Resultat liefert, da z. B. zwei Namen für die IP-Adresse vergeben sind und einer davon der gewünschte ist (z. B. www.bubble.bobble.org statt server.bubble.bobble.org). Benötigt wird dieser Name allerdings nur, falls man ,,umgeleitete URLs`` verwendet, auf die hier nicht näher eingegangen werden kann.

MaxRequestsPerChild

Syntax: MaxRequestsPerChild Zahl
Voreinstellung: MaxRequestsPerChild 0
Kontext: Serverkonfiguration

Als Beispiel für die vielen Anweisungen, die dem Feintuning des Servers dienen, sei hier MaxRequestsPerChild angegeben, da eine Veränderung der Standardeinstellung hier besonders sinnvoll erscheint. Setzt man nämlich MaxRequestsPerChild auf einen Wert größer Null, so wird ein vom httpd gestarteter Tochterprozeß nach der angegebenen Anzahl von Anfragen beendet und neu gestartet. Dies hat vor allem den Vorteil, daß durch Speicherlecks - solche können durch Fehler im Apache selbst oder in den von ihm verwendeten Bibliotheken durchaus entstehen - eventuell verloren gegangener Speicher wieder freigegeben wird.

2.4.2 Die Datei srm.conf

In dieser Datei werden u. a. das Wurzelverzeichnis der HTML-Dokumente, die automatische Generierung von Indexseiten durch den Server, usw. festgelegt. Für unserer Beispielkonfiguration sieht das auszugsweise folgendermaßen aus:

# /usr/local/etc/httpd/conf/srm.conf
    DocumentRoot /var/httpd/htdocs
    UserDir public_html
    DirectoryIndex index.html
    FancyIndexing on

    AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip

    AddIconByType (TXT,/icons/text.gif) text/*
    AddIconByType (IMG,/icons/image2.gif) image/*
    ..

    AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
    AddIcon /icons/layout.gif .html .shtml .htm .pdf
    AddIcon /icons/text.gif .txt
    AddIcon /icons/folder.gif ^^DIRECTORY^^
    ...

    DefaultIcon /icons/unknown.gif

    ReadmeName README
    HeaderName HEADER

    IndexIgnore */.??* *~ *# */HEADER* */README* */RCS

    AccessFileName .htaccess

    DefaultType text/plain

    AddEncoding x-compress Z
    AddEncoding x-gzip gz

    AddLanguage en .en
    AddLanguage de .de
    ...

    LanguagePriority de en fr

    Alias /icons/ /usr/local/apache/icons/

    #ScriptAlias /cgi-bin/ /usr/local/apache/cgi-bin/

2.4.3 Die Datei access.conf

Hier wird der Zugriff auf die Verzeichnisse, in denen die HTML-Dokumente bzw. die CGI-Skripten abgelegt sind, festgelegt. In unserem Fall sieht das so aus:

# /usr/local/etc/httpd/conf/access.conf
    <Directory /var/httpd/htdocs>
    Options Indexes FollowSymLinksIfOwnerMatch
    AllowOverride None
    order allow,deny
    allow from all
    </Directory>

    <Directory /var/httpd/cgi-bin>
    Options ExecCGI
    AllowOverride None
    </Directory>
Die auftretenden Anweisungen werden im folgenden kurz erläutert:

<Directory>

Syntax: <Directory Verzeichnis>...</Directory>
Kontext: Serverkonfiguration, Virtuelle Hosts

<Directory> und </Directory> schließen einen Anweisungsblock ein, der sich auf das angegebene Verzeichnis und dessen Unterverzeichnis bezieht. Dabei können die von der Shell gewohnten Wildcards ? und * benutzt werden, oder durch Voranstellen einer Tilde (~) reguläre Ausdrücke verwendet werden. Innerhalb des Directory-Anweisungsblocks lassen sich nur die innerhalb eines Verzeichnisskontextes möglichen Anweisungen verwenden.

Options

Syntax: Options [+|-] Option [+|-] Option ...
Voreinstellung: Options All
Kontext: Serverkonfiguration, Virtuelle Hosts, Verzeichnis, .htaccess

Hiermit kann man angeben, welche Serverfunktionen (im den entsprechenden Verzeichnissen) aktiviert werden. Folgende Optionen sind verfügbar:

All:
Entspricht ExecCGI, FollowSymLinks, Includes und Indexes
ExecCGI:
Erlaubt die Ausführung von CGI-Skripten
FollowSymLinks:
Der Server folgt symbolischen Links
Includes:
Erlaubt ,,server-side includes``
IncludesNoExec:
,,server-side includes`` sind erlaubt, aber #exec und #include in CGI-Skripten sind ausgeschaltet
Indexes:
Falls eine URL angefragt wird, die auf ein Verzeichnis zeigt, das keine index.html-Datei (oder entsprechendes) enthält, wird eine formatierte Ausgabe des Verzeichnisses zurückgeliefert, falls diese Option gesetzt ist
MultiViews:
Schaltet die Unterstützung von Multiviews ein, d. h. Client und Server können das Rückgabeformat und die Sprache von Dokumenten untereinander aushandeln.
SymLinksIfOwnerMatch:
Symbolische Links werden nur dann verfolgt, wenn sie auf Dateien oder in Verzeichnisse führen, die dem gleichen Benutzer gehören wie der Link.

Wird eine Option ohne vorangestellte + oder - angegeben, werden alle Optionen ausgeschaltet, d. h. auch die Standardoption all.

AllowOverride

Syntax: AllowOverride Option Option ...
Voreinstellung: AllowOverride All
Kontext: Verzeichnis

Diese Anweisung gibt an, welche Einstellungen eine .htaccess-Datei noch verändern kann. In unserem Fall haben wir hier None angegeben, was die Verwendung dieser Datei gewissermaßen ausschaltet. Näheres in [2, 3].

order

Syntax: order Ordnung
Voreinstellung: order deny,allow
Kontext: Verzeichnis, .htaccess

Diese Option benötigt das Modul mod\_access und gibt an, in welcher Reihenfolge allow- und deny-Anweisungen ausgewertet werden. Ordering kann folgende Werte annehmen:

deny,allow:
Wenn ein Client durch eine deny-Anweisung ausgeschlossen wird, wird er abgewiesen, sofern ihm nicht eine allow-Anweisung doch den Zugriff erlaubt. Falls keine der beiden Anweisungen auf ihn zutrifft, wird ihm der Zugriff erlaubt.
allow,deny:
Wenn eine allow-Anweisung den Zugriff eines Clients erlaubt, erhält er diesen auch, falls keine deny-Anweisung auf ihn zutrifft. Trifft keine der beiden Anweisungen auf ihn zu, wir der Zugriff verweigert.
mutual-failure:
Hier muß eine allow-Anweisung den Zugriff erlauben und keine deny-Anweisung gegen den Zugriff sprechen, damit der Client zugreifen darf.

allow

Syntax: allow from Host Host...
Kontext: Verzeichnis, .htaccess

deny

Syntax: deny from Host Host...
Kontext: Verzeichnis, .htaccess

Diese Anweisungen stehen wiederum nur bei einkompiliertem mod\_access-Modul zur Verfügung. Sie legen zusammen mit der order-Anweisung fest, welchen Clients der Zugriff auf die entsprechenden Verzeichnisse gestattet wird. Die Angabe all für Host paßt dabei auf alle Clients. Ansonsten kann man (Teile von) Hostnamen oder IP-Adressen angeben und so den Zugriff steuern.

Der Vollständigkeit halber sei noch hinzugefügt, daß man natürlich auch den Zugriff auf Benutzerbasis steuern kann. Dies verlangt allerdings etwas mehr Aufwand und kann daher im Rahmen dieses Vortrages nicht behandelt werden.

Literatur

1
http://www.apache.org/
2
LAURIE, BEN; LAURIE, PETER, Apache: The Definitive Guide Cambridge: O'Reily & Associates, 1997
3
Apache User's Guide im Unterverzeichnis htdocs/manual der Apache-Quellen
...soll.
Eigentlich laufen nur die vom ursprünglichen httpd gestarteten Tochterprozesse unter dieser Benutzer- und Gruppenkennung.
    
...werden.
Man kann auch die gesamte Konfiguration in einer Datei zusammenfassen, vgl. [2]; wir halten uns aber an die Vorgaben der Apache-Gruppe, die drei Dateien vorsehen.