Apache ist ein Klassiker: Der HTTP-Daemon läuft auf etlichen Webservern. Für die Level-1-Zertifizierung erwartet das LPI Grundkenntnisse zur Konfiguration, wie sie dieser Artikel vermittelt.
Für die erfolgreiche Teilnahme an der LPI-Prüfung 102 sind auch grundlegende Kenntnisse über die Installation und Konfiguration des Webservers Apache notwendig – wenn auch bei Weitem nicht so detailliert wie für die Level-2-Prüfungen. Dieser Artikel gibt einen Überblick über die wichtigsten Einstellungen. Apache gibt es in zwei Versionszweigen: Zwar betrachten die Entwickler Apache 2.x schon seit Jahren als stabile Version, der 1.x-Zweig erfreut sich aber immer noch großer Popularität und es erscheinen auch gelegentlich neue Versionen.
Apache-Konfiguration
Bei der Basiskonfiguration eines einfachen Webservers gibt es aber nur wenige Unterschiede zwischen Apache 1.x und 2.x, sodass eine gleichzeitige Beschreibung beider Versionen möglich ist. In beiden Apaches heißt die zentrale Konfigurationsdatei »httpd.conf«, sie liegt abhängig von der Version und der eingesetzten Linux-Distribution in unterschiedlichen Verzeichnissen – etwa »/etc/apache« oder »/etc/apache2«.
Bei der Konstellation Debian/Apache 2 heißt die Datei »apache2.conf«. Ist der Aufenthaltsort unklar, hilft eine Überprüfung mit dem Paketmanager, unter Debian- und RPM-basierten Distributionen zum Beispiel mit »rpm -ql apache2 | grep httpd.conf« oder »dpkg -L apache«. Der Administrator »root« hat häufig das Apache-Binary (das »httpd«, »httpd2« oder »apache« heißt) im Pfad und kann es mit der Option »-V« aufrufen, um den Pfad zur Konfigurationsdatei zu erfragen:
# httpd2 -V | grep SERVER_CONF -D SERVER_CONFIG_FILE="/etc/apache2/httpd.conf"
Die Konfigurationsdatei ist gut dokumentiert (Abbildung 1), das vorbereitete Template enthält schon alle notwendigen Einträge, wenn auch teils auskommentiert. Am Anfang der Datei stehen einige globale Einstellungen: Die Option »ServerType« legt fest, ob Apache als eigenständiger Daemon (»ServerType standalone«) läuft oder ob ein Internet Services Daemon [4] ihn startet (»ServerType inetd«). »ServerRoot« gibt das Installationsverzeichnis des Webservers an: Wenn diese Option gesetzt ist, versteht Apache relative Angaben in anderen Optionen und bezieht sie auf dieses Wurzelverzeichnis. Über »ErrorLog« und »CustomLog« ist es möglich, systemweite Logdateien für Fehler und für Zugriffe festzulegen. Diese Angaben nehmen die meisten Administratoren aber für jede gehostete Domain individuell vor (siehe Abschnitt “Virtuelle Hosts”).

Abbildung 1: Die Konfigurationsdatei von Apache 2 liest über »Include«-Anweisungen zahlreiche weitere Dateien ein. Einige Editoren, etwa Kate und Vi, verstehen das Format und erleichtern die Anpassung durch Syntax-Highlighting.
|
LPI-Aufgabengruppen |
|---|
|
Das Linux Professional Institute gliedert die Prüfungsfragen in Aufgabengruppen. Dieser Artikel erklärt den folgenden Abschnitt:
|
Einstellungsdetails
Die Option »DirectoryIndex« legt fest, nach welchen Dateien Apache suchen soll, wenn ein Webbrowser ein Verzeichnis anfordert (etwa [http://www.example.org/] statt [http://www.example.org/index.html]) – häufig steht hier nur »DirectoryIndex index.html index.htm«. Damit Apache auch CGI-Indexdateien akzeptiert, ist dieser Eintrag wie folgt zu erweitern:
DirectoryIndex index.html index.htm index.cgi
Für die Optimierung kennen Apache 1.x und 2.x unterschiedliche Parameter. Welche die richtigen sind, hängt vom Laufzeitmodell ab, mit dem der Daemon arbeitet: Die alte Version startet für die parallele Bearbeitung mehrerer Anfragen separate Prozesse, während Apache 2.x hierfür mehrere Modelle anbietet und wahlweise mit Prozessen oder Threads arbeitet. Typisch für das Prozessmodell (Apache 1.x oder 2.x) sind die Optionen »StartServers«, »MinSpareServers«, »MaxSpareServers«, »ServerLimit«, »MaxClients« und »MaxRequestsPerChild«, während für die Thread-Variante (nur Apache 2.x) Einträge der Form
StartServers 3 MinSpareThreads 25 MaxSpareThreads 75 ThreadLimit 64 MaxClients 150 ThreadsPerChild 25 MaxRequestsPerChild 10000
in der Konfigurationsdatei stehen. Bei Apache 2 finden sich diese Angaben oft in einer separaten Datei (bei Open Suse etwa in »/etc/apache2/server-tuning.conf«), auf die die Datei »httpd.conf« mit einer »Include«-Anweisung verweist.
Um einen Wechsel zwischen beiden Laufzeitmodellen ohne Änderung der Konfiguration zu erlauben, ist das verwendete Modell über Blöcke »<IfModule prefork.c> … </IfModule>« (für das Prozessmodell) und »<IfModule worker.c> … </IfModule>« (für das Thread-Modell) abfragbar.
Apache unterstützt das Konzept der virtuellen Server. Das bedeutet, dass ein einziger Server mehrere (Sub-)Domains verwaltet und abhängig vom Servernamen, der Teil der Anfrage ist, unterschiedliche Webseiten ausliefert.
Virtuelle Hosts
Für die Konfiguration dieser virtuellen Server sind »VirtualHost«-Blöcke zuständig, die in der Minimalfassung wie folgt aussehen:
<VirtualHost *> ServerName www.example.org DocumentRoot /var/www ErrorLog /var/log/apache/error.log CustomLog /var/log/apache/access.log full </VirtualHost>
Diese sechs Zeilen teilen dem Daemon mit, wie er Anfragen mit dem Servernamen »www.example.org« bearbeiten soll. Wichtig ist vor allem die Option »DocumentRoot«, die den Ort festlegt, an dem sich die Webseiten befinden. Ist ein Apache für mehrere Domains zuständig, bietet es sich an, Unterordner anzulegen, etwa »example.org« und »example.net« unterhalb von »/var/www«. Der Kasten “Freie Port-Wahl” erklärt die Definition virtueller Hosts auf anderen Ports.
|
Freie Port-Wahl |
|---|
|
Der Standardport für HTTP-Server ist 80, wie im Zweifelsfall ein Blick in die Datei »/etc/services« verrät. Bei dieser Vorgabe muss es aber nicht bleiben. Apache kann jeden beliebigen Port überwachen (sofern er mit Root-Rechten startet), nicht privilegiert gestartete Daemons haben immerhin freie Wahl unter allen Ports ab 1024. Auf Wunsch überwacht Apache mehrere Ports auf Anfragen und liefert abhängig von der Kombination Port/Rechnername unterschiedliche Inhalte aus. Der Parameter »Listen« legt den Port fest, auf dem der Server lauscht. Um hier mehrere Ports einzustellen, sind mehrere »Listen«-Zeilen notwendig, etwa in der folgenden Form für die Ports 80 und 8099: Listen 80 Listen 8099 Die »Listen«-Zeilen müssen im allgemeinen Teil der Konfigurationsdatei stehen. Zusätzlich enthält nun die Definition eines virtuellen Servers eine Portangabe, wenn dieser auf einem anderen als dem Standardport 80 erreichbar sein soll. Das sieht dann so aus: <VirtualHost *:8099> ServerName www.example.org DocumentRoot /var/www/port8099 [...] </VirtualHost> Der so definierte virtuelle Server ist nun von außen über die URL [http://www.example.org:8099] erreichbar und liefert unter dieser Adresse andere Daten als unter [http://www.example.org] aus – nämlich die Dateien aus dem Verzeichnis »/var/www/port8099«. Apache 1.x kennt außerdem noch die Option »Port«, die ebenfalls festlegt, auf welchem Port der Server lauscht – der Daemon wertet einen »Port«-Eintrag aber nur aus, wenn es keine »Listen«-Zeilen gibt, und es ist mit »Port« nicht möglich, mehrere Ports anzugeben – Apache ignoriert alle »Port«-Zeilen nach der ersten. |
Die Optionen »ErrorLog« und »CustomLog« regeln das Logging, wobei die erste Datei alle Fehlermeldungen für diesen virtuellen Server aufnimmt, während die zweite die Zugriffe protokolliert. Bei den Zugriffen erlaubt Apache eine individuelle Festlegung der Informationen, die er mit ins Log aufnehmen soll: Formate legt der Befehl »LogFormat« fest, für das Protokollformat »full« etwa über die Zeile:
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i" %T %v" full
Es ist auch möglich, auf die »LogFormat«-Anweisung zu verzichten und den Format-String in die »CustomLog«-Zeile zu übernehmen:
CustomLog /var/log/apache/access.log "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i" %T %v"
Abbildung 2 zeigt einige typische Protokollzeilen: Am Anfang jedes Eintrags stehen die IP-Adresse oder der aufgelöste Rechnername, dann folgen Datum, Uhrzeit und Zeitzone des Zugriffs, der vom Browser gesendete »GET«-Befehl, der Return-Code des Servers (meist 200: OK oder 404: Not found), die Anzahl der übertragenen Bytes, die Referer-Webseite und die Browserkennung.

Abbildung 2: Im Modus »full« erzeugt Apache Logeinträge, die neben Zugriffszeit und abgefragtem Dokument auch Dateigröße, Referer und Browserkennung enthalten.
Beim Referer handelt es sich entweder um jene Seite, von der aus der Browser über einen Link zum aktuellen Dokument gekommen ist, oder dieser Logeintrag bezieht sich auf ein eingebettetes Objekt (etwa ein Bild); dann ist der Referer die HTML-Seite, die dieses Objekt nachlädt. Tools wie Webalizer ([5], Abbildung 3) und AWStats [6] ermöglichen eine komfortable Auswertung der so gespeicherten Daten [7].

Abbildung 3: Webalizer erzeugt aus den Logdaten Analysen der Seitenbesuche – dieser Ausschnitt zeigt Rankings der Browser und Herkunftsländer an.
Bei Apache 2 ist es üblich, die Definitionen der virtuellen Server in separate Dateien auszulagern und diese mit »Include« einzulesen. Wer viele Domains verwaltet, sorgt für mehr Übersicht, wenn er jedem virtuellen Host eine eigene Konfigurationsdatei spendiert, diese zentral in einem Unterverzeichnis (etwa in »/etc/apache2/vhosts.d«) ablegt und über die Option »Include /etc/apache2/vhosts.d/*.conf« einbindet.
Starten und Stoppen
Um den Daemon zu aktivieren und wieder anzuhalten, verwenden Administratoren das Tool »apachectl« (oder »apache2ctl«), das ähnliche Parameter akzeptiert, wie sie von Start- und Stopp-Skripten in »/etc/init.d« bekannt sind: »apachectl start« und »apachectl stop« sind die Aufrufvarianten, die beim Rechnerstart und beim Herunterfahren zum Einsatz kommen. Interessanter ist der Neustart des Apache-Servers nach Änderungen an der Konfigurationsdatei, hierfür bietet »apachectl« zwei Varianten:
- Das Kommando »apachectl restart« schickt dem Daemon
ein Hangup-Signal (»SIGHUP«). - Über »apachectl graceful« erhält der
Server das Signal »SIGUSR1«. Auch hier liest Apache die
Konfiguration neu ein und arbeitet ab sofort mit den
geänderten Einstellungen, allerdings schließt er offene
Verbindungen bei dieser Neustartvariante nicht.
In beiden Fällen prüft »apachectl« vor dem Neustart, ob die Konfigurationsdatei syntaktisch in Ordnung ist, und verweigert bei einem negativen Testergebnis die Ausführung – das garantiert einen unterbrechungsfreien Betrieb. Für den Syntaxcheck ohne Neustart gibt es die separate Option »configtest«.
Auf Verzeichnisebene
Es gibt zahlreiche Einstellungen, die der Administrator für jedes Verzeichnis separat festlegen kann. Das ist auf zwei Arten möglich:
- Eine Datei ».htaccess« in einem Webverzeichnis
enthält Optionen, die für dieses Verzeichnis gelten. - Die Konfigurationsdatei (oder eine mit »Include«
eingebundene Datei) enthält einen
»<Directory>«-Block.
Um beispielsweise in einem Verzeichnis »/var/www/fotos« ohne Indexdatei das Auflisten des Verzeichnisinhalts zu erlauben, gibt es die Option »Options +Indexes«, die der Administrator nun entweder in eine Datei »/var/www/fotos/.htaccess« schreibt oder in Form des folgenden Blocks in die Konfigurationsdatei aufnimmt:
<Directory /var/www/fotos> Options +Indexes </Directory>
Eine weitere häufig auf Verzeichnisebene verwendete Option ist die Zugriffskontrolle. Das einfachste Verfahren überprüft einen Benutzernamen und das zugehörige Passwort, wobei es eine als Option anzugebende Passwortdatei nutzt.
Um ein Verzeichnis auf diese Weise zu schützen, sind zwei Schritte nötig. Zunächst erzeugt der Aufruf »htpasswd -c Passwortdatei Benutzername« eine neue Passwortdatei und legt darin einen neuen Account an. Statt »htpasswd« kann das Tool auch »htpasswd2« heißen. Die so erzeugte neue Passwortdatei (etwa ».htpass«) enthält eine Zeile mit dem Benutzernamen und einem berechneten Passwort-Hash; die beiden Felder trennt ein Doppelpunkt. Die »htpasswd«-Option »-c« (create) darf nur beim ersten Aufruf auftauchen, weil sie bereits vorhandene Passwörter überschreibt.
In die Datei ».htaccess« (oder in den »Directory«-Eintrag für dieses Verzeichnis) nimmt der Administrator nun noch die folgenden Zeilen auf:
AuthType Basic AuthName "Nur für Linux-Magazin-Leser" AuthUserFile /var/www/fotos/.htpass Require user Benutzername
Danach ist das Verzeichnis geschützt und bei jedem Versuch, darauf zuzugreifen, erscheint ein Passwortdialog (siehe Abbildung 4).

Abbildung 4: Dieses Verzeichnis hat der Systemverwalter durch eine Passwortdatei und die richtigen Optionen in ».htaccess« geschützt.
Damit Besucher der Webseite keinen Zugriff auf die Datei ».htaccess« oder die Passwortdatei erhalten, gibt es in der Apache-Konfiguration den Eintrag:
<Files ~ "^.ht">
Order allow,deny
Deny from all
</Files>
Seine Aufgabe ist es, alle Dateien, deren Namen mit ».ht« anfangen, zu blockieren. Darum fängt im Beispiel auch der Name der Passwortdatei mit ».ht« an.
Alles ausprobieren
Für die Bewerbung als Webserver-Administrator reichen die in diesem Artikel besprochenen Aspekte sicherlich nicht aus und auch LPI-Prüfungskandidaten verbessern ihre Chance, wenn sie das hier Gezeigte live auf einem Linux-System ausprobieren. Da alle großen Distributionen fertige Apache-Pakete bereithalten, ist die Installation schnell erledigt. Es bleibt also Zeit, um mit den zahlreichen Konfigurationsoptionen herumzuspielen und einen Blick in die ausführliche Dokumentation zu werfen.
|
Infos |
|---|
|
[1] LPI-Seite mit den Prüfungsinhalten: [http://www1.lpi.org/de/obj_102.html] [2] Dokumentation zu Apache 1.3: [http://httpd.apache.org/docs/1.3/] [3] Dokumentation zu Apache 2.3: [http://httpd.apache.org/docs/2.3/] [4] Hans-Georg Eßer, “Kleine Diener – LPIC-1-Kurs, Teil 13”: Linux-Magazin 08/07, S. 78 [5] Webalizer: [http://www.mrunix.net/webalizer/] [6] AWStats: [http://awstats.sourceforge.net] [7] Peter Kreußel, “Für Durchblick sorgen – Log-Analyzer für Apache im Vergleich”: Linux-Magazin 09/07, S. 68 |





