Jörg Lehmann und Alexander Rahmeier
Die Aufgabe eines WWW-Servers besteht eigentlich im wesentlichen darin, auf Anfrage eines
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.
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:
#-Zeichen beginnen
Rule, welche
die Erzeugung des Makefiles (s.u.) steuern.
Module beginnen und in denen die
einzukompilierenden Module angegeben sind
%Module für Module,
die zwar mit einkompiliert aber zunächst nicht aktiviert
werden sollen
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.
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.
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.
Für die Konfiguration benötigen wir drei Dateien, die im Verzeichnis
/usr/local/etc/httpd/conf abgelegt werden.
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:
Als Kontext tauchen dabei
Syntax: Beispiel Parameter
Voreinstellung: Beispiel Standardparameter
Kontext: Wo verwendet
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.
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:
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.
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.
Syntax: User Benutzername oder User #Benutzer-ID
Voreinstellung: User #-1
Kontext: Serverkonfiguration, Virtuelle Hosts
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].
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.
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.
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.
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 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.
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.
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.
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.
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/
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:
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.
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:
Wird eine Option ohne vorangestellte ExecCGI, FollowSymLinks, Includes und
Indexes
#exec und #include in CGI-Skripten sind ausgeschaltet
index.html-Datei (oder entsprechendes)
enthält, wird eine formatierte Ausgabe des Verzeichnisses zurückgeliefert,
falls diese Option gesetzt ist
+ oder - angegeben, werden
alle Optionen ausgeschaltet, d. h. auch die Standardoption all.
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].
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-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-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.
allow-Anweisung den
Zugriff erlauben und keine deny-Anweisung gegen den Zugriff
sprechen, damit der Client zugreifen darf.
Syntax: allow from Host Host...
Kontext: Verzeichnis, .htaccess
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.
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.
http://www.apache.org/
htdocs/manual der Apache-Quellen