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:
Die auftretenden Anweisungen werden im folgenden kurz erläutert:# /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>
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