# 1.113.3

# Verwendung und allgemeine Konfiguration von Apache

Beschreibung: Prüfungskandidaten sollten in der Lage sein, einfache Einstellungen in den Apache Konfigurationsdateien vorzunehmen, httpd zu starten, anzuhalten und neu zu starten und das automatische starten von httpd bei Systemstart einzurichten. Dies beinhaltet nicht fortgeschrittene Konfiguration von Apache.

Die wichtigsten Dateien, Bezeichnungen und Anwendungen:

- apachectl
- httpd
- `httpd.conf`

Die Konfiguration des Webservers apache ist ein weites Feld, das problemlos ganze Bücher füllen kann. An dieser Stelle wird aber nur ein Grundwissen über den Webserver und seine Konfiguration gefordert, das relativ schnell erlernbar ist.

### Konfigurationsdateien und Verzeichnisse des Webservers

Der Webserver apache benutzte ursprünglich drei Konfigurationsdateien, die in der folgenden Reihenfolge abgearbeitet wurden:

httpd.conf
  Die zentrale Konfigurationsdatei des Webservers. Hier werden alle Einstellungen vorgenommen, die den Server selbst, den Hauptserver und eventuell existierende virtuelle Server angehen.
srm.conf
  In dieser Datei wurden die `ResourceConfig` Anweisungen des Webservers plaziert. Seit einiger Zeit wird diese Datei leer ausgeliefert und alle Einträge werden in `httpd.conf` vorgenommen.
access.conf
  In dieser Datei wurden die Anweisungen des Webservers plaziert, die mit Zugriffsrechten zu tun hatten. Seit einiger Zeit wird auch diese Datei leer ausgeliefert und alle Einträge werden in `httpd.conf` vorgenommen.

Die beiden Dateien `srm.conf` und `access.conf` sind zwar noch vorhanden, werden jedoch nicht mehr benötigt, da alle Einstellungen heute in der Datei `httpd.conf` vorgenommen werden.

Standardmäßig erwartete der Webserver seine Konfigurationsdateien in `/usr/local/etc/httpd/conf`. Dieses Verzeichnis entspricht aber nicht dem Dateisystem-Standard von Linux. Aus diesem Grund wird heute der Webserver in der Regel über eine Kommandozeilenoption `-f Dateiname` gestartet, die ihm ein anderes Verzeichnis für die Konfigurationsdatei angibt. In der Regel ist das Verzeichnis entweder `/etc/httpd` oder `/etc/apache`. Dort liegen dann alle Konfigurationsdateien des Webservers.

Neben diesem Verzeichnis gibt es noch zwei weitere, die für den Webserver eine große Rolle spielen.

ServerRoot
  Das Verzeichnis, in dem die Dateien liegen, die für den Gebrauch des Webservers wichtig sind. Das sind z.B. die Icons, die er für Dateien und Verzeichnisse benutzt oder die CGI-Programme.
DocumentRoot
  Das Verzeichnis, das die HTML-Dateien enthält, die der Webserver der Allgemeinheit anbieten soll.

Die Festlegung, welche Verzeichnisse für diese beiden Aufgaben benutzt werden sollen, wird in der Konfigurationsdatei `httpd.conf` gemacht.

### Die zentrale Konfigurationsdatei des Webservers

Auch heute noch versucht der Server alle drei oben genannten Dateien abzuarbeiten, aber die beiden Dateien `access.conf` und `srm.conf` sind in der Regel einfach leer. Alles, was früher dort untergebracht wurde, finden wir heute in der zentralen Konfigurationsdatei `httpd.conf`.

Diese Datei ermöglicht es, den Webserver komplett zu konfigurieren, von der Einstellung, auf welchen Port er hören soll, bis hin zur Angabe welcher User welche Verzeichnisse sehen darf. Die standardmäßige Konfigurationsdatei des Webservers enthält bereits eine wohldurchdachte und sehr gut kommentierte Konfigurationsdatei, die entsprechend angepasst werden kann.

Grunsätzlich ließt der Webserver diese Datei beim Start. Das heißt, wenn in dieser Datei Veränderungen vorgenommen werden sollen, dann muß der Server danach neu gestartet werden. Bitte nochmal zur Definition: Server meint hier das Programm und nicht den Rechner!

Die Konfigurationsdatei des Webservers kennt hunderte verschiedener Anweisung, die hier nicht alle dargestellt werden können. Wir werden uns hier also auf die wichtigsten Anweisungen beschränken. Die Konfigurationsdatei ist in drei Bereiche aufgeteilt: Die globalen Einstellungen, die Einstellungen des Hauptservers und die Einstellungen für die virtuellen Server.

#### Globale Einstellungen

Diese Einstellungen beziehen sich auf die grundsätzliche Funktionalität des Servers selbst. Folgende Einstellungen sind wichtig:

`ServerType standalone|inetd`
  Diese Anweisung legt fest, ob der Webserver standalone oder durch inetd gestartet werden soll. Wie schon gesagt ist es nicht empfehlenswert, den Apache durch inetd zu starten, also solte hier der Begriff `standalone` stehen.
`ServerRoot "/usr/local/httpd"`
  Die Angabe des Verzeichnisses, in dem der Apache seine Dateien vorfindet. Hier liegen in der Regel alle wichtigen Dateien und Verzeichnisse, die der Server zum Betrieb benötigt. Nicht verwechseln mit DocumentRoot.
`LockFile /var/lock/subsys/httpd/httpd.accept.lock`
  Das Lock-File des Servers. Diese Datei wird vom Server beim Start angelegt und beim Herunterfahren gelöscht. Damit kann der Server selbst feststellen, ob schon ein Apache-Server im Speicher gestartet ist.
`PidFile /var/run/httpd.pid`
  Auch diese Datei wird vom Server beim Start angelegt. Er schreibt seine ProzessID hier hinein, so daß ein späterer Zugriff - etwa zum Versenden eines Kill-Signals - auf den Server möglich ist, ohne erst lang mit dem ps-Kommando die PID herausfinden zu müssen.
`Timeout 300`
  Die Anzahl von Sekunden, die der Server beim Senden und Empfangen von Daten wartet, bis er aufgibt und einen Timeout-Fehler ausgibt.
`KeepAlive On`
  KeepAlive ermöglicht es, mehrere Transfers pro Verbindung zuzulassen (On) oder zu verbieten (Off). Damit wird verhindert, daß wegen jeder einzelnen Nachfrage erneut der komplette TCP-Handshake erfolgen muß.
`MaxKeepAliveRequests 100`
  Dieser Wert bestimmt die maximale Menge der zulässigen aufeinanderfolgenden Verbindungen, ohne erneuten TCP-Handshake. Steht der Wert auf 0, so bedeutet das, daß es keine Einschränkungen gibt (unendlich).
`KeepAliveTimeout 15`
  Die Anzahl von Sekunden nach der Übertragung einer Datei bis zum Beginn der nächsten Nachfrage, die ohne zusätzlichen Handshake stattfinden darf.
`StartServers 1`
  Die Anzahl der Serverprozesse, die beim Start geladen werden sollen.
`MinSpareServers 1`
  Die minimale Anzahl der unbenutzten Serverprozesse (Childs). Wird dieser Wert unterschritten, so werden neue Server gestartet.
`MaxSpareServers 1`
  Die maximale Anzahl unbenutzter Serverprozesse (Childs). Wird dieser Wert überschritten, so werden unbenutzte Serverprozesse heruntergefahren.
`MaxClients 150`
  Die maximale Anzahl gleichzeitig bedienbarer TCP-Verbindungen. Kommen gleichzeitig mehr als angegeben herein, so bekommen die übrigen eine Fehlermeldung und werden nicht mehr bedient.
`MaxRequestsPerChild 0`
  Nach der angegebenen Zahl von abgearbeiteten Aufträgen wird ein Child-Prozess heruntergefahren und durch einen neuen ersetzt. Steht der Wert auf 0, so findet keine Ersetzung statt (0 = unendlich). Damit kann z.B. im Dauerbetrieb festgelegt werden, daß kein Server-Child mehr als 30 Anfragen beantwortet. So wird verhindert, daß ein eventuell hängender Prozess über Tage hinweg den Server stört.

Nach diesen Grundeinstellungen werden die Module geladen. An diesen Einstellungen ist eigentlich keinerlei Veränderung nötig, es sei denn, Sie haben eigene Module entwickelt und wollen sie einbinden.

#### Konfiguration des Hauptservers

Die zweite Sektion der Konfigurationsdatei bezieht sich auf die Angaben zum "Hauptserver". Das ist der eigentliche HTTP-Server, der ohne weitere Gimmicks läuft. Im Regelfall ist das der einzige Server, nur in Spezialfällen werden sogenannte virtuelle Server dazugenommen.

`Port 80`
  Die Portnummer, die verwendet werden soll, wenn der Server als standalone-Server läuft. Der Standard-Port ist 80. Ports unter 1023 müssen mit root-Rechten ausgestattet sein, es handelt sich ja um die sogenannten privilegierten Ports. Um Sicherheitslücken zu vermeiden, werden weitere Server unter anderen UserIDs gestartet.
`User wwwrun`
  Die UserID, unter der die Child-Prozesse des Servers laufen. Alle Zugriffe des Servers aufs Dateisystem werden unter dieser ID ausgeführt.
`Group nogroup`
  Die Gruppenmitgliedschaft der Child-Prozesse.
`Listen 80`
  Diese Anweisung entspricht der Port-Anweisung, nur sind damit auch die Angabe mehrerer Ports möglich. Eine typische Form, um z.B auch das HTTPS-Protokoll (Secure Socket Layer) zu ermöglichen, wäre:

        <IfDefine SSL>
          Listen 80
          Listen 443
        </IfDefine>

`ServerAdmin root@localhost`
  Die E-Mail Adresse des Administrators dieses Webservers
`DocumentRoot "/usr/local/httpd/htdocs"`
  Die Wurzel des Dokumentenbaums. Alle Pfade in URLs (außer CGI) beziehen sich auf die diesen Pfad.
`DirectoryIndex index.html`
  Der Name (oder die Namen) der Datei, die in einem Verzeichnis aufgerufen werden soll, wenn nur der Verzeichnisname angegeben wurde. Wenn mehrere Namen angegeben werden, müssen sie durch Leerzeichen voneinander getrennt werden.
`ScriptAlias /cgi-bin/ "/usr/local/httpd/cgi-bin/"`
  Mit dieser Anweisung wird festgelegt, welches Verzeichnis CGI-Scripts enthalten darf, die vom Server ausgeführt werden sollen. Der Alias `/cgi-bin` wird also auf das Verzeichnis `/usr/local/httpd/cgi-bin/` gelegt. Damit werden URLs wie

        http://www.myhost.mydomain.de/cgi-bin/irgendwas.pl

  auf das genannte Verzeichnis umgeleitet. Es ist zwar zu empfehlen, daß das Script-Verzeichnis außerhalb des Dokumentenbaums liegt, jedoch nicht notwendig. Falls mehrere solcher Aliase angelegt werden sollen, müssen sie jeweils andere Aliasnamen tragen:

        ScriptAlias /cgi-bin/ "/usr/local/httpd/cgi-bin/"
        ScriptAlias /test/cgi-bin/ "/usr/cgi-bin/"
        ScriptAlias /users/hans/cgi-bin/ "/home/hans/cgi-bin/"

  Die entsprechenden URLs für die drei verschiedenen Verzeichnisse wären jetzt:

        http://www.myhost.mydomain.de/cgi-bin/irgendwas.pl
        http://www.myhost.mydomain.de/test/cgi-bin/irgendwas.pl
        http://www.myhost.mydomain.de/users/hans/cgi-bin/irgendwas.pl

Die meisten weiteren Einstellungen benützen jetzt ein HTML-ähnliches Format, um die Gültgkeit auf bestimmte Bereiche zu reduzieren. Dazu werden die gewünschten Bereiche (Verzeichnisse, Dateien und URLs) in spitze Klammern geschrieben und mit einem entsprechenden Abschlußtag beendet. Ein paar Beispiele:

      <Directory "/usr/local/httpd/htdocs">
        Options FollowSymLinks
        DirectoryIndex default.htm
      </Directory>

Diese Angabe legt fest, daß die beiden Befehle in den Klammern nur für das Verzeichnis "/usr/local/httpd/htdocs" und alle darin enthaltenen Unterverzeichnisse gelten.

Statt <Directory> kann auch <Location> stehen. Dann wird statt einer absoluten Pfadangabe eine URL angegeben. Das erspart einem Systemverwalter das Wissen über die tatsächliche Positionierung des DocumentRoot. Das muß dann selbstverständlich mit </Location> abgeschlossen werden.

Um einzelne Dateien direkt anzusprechen kann auch die Klammerung mit <Files> erfolgen. In der Klammer stehen dann Dateinamen, auf die sich die Angaben beziehen.

#### Konfiguration von virtuellen Servern

Die dritte Sektion der zentralen Konfigurationsdatei von Apache dient der Definition von virtuellen Servern. Virtuelle Server sind sozusagen Nebenserver, die vom selben Webserver verwaltet werden, aber eine andere Dokumentenwurzel benutzen. Dazu kommt, daß diese Server auch noch entweder über andere IP-Adressen oder andere DNS-Namen ansprechbar sind.

Die Definition eines virtuellen Servers ermöglicht es also dem Webserver zu entscheiden, an welchen DNS-Namen bzw. welche IP-Adresse die Anfrage ging. Diese Entscheidung führt dann zu unterschiedlichen DocumentRoots also werden unterschiedliche Seiten angezeigt.

Linux bietet zu diesem Zweck die Möglichkeit, daß eine einzige Ethernetkarte mehrere IP-Adressen bekommen kann. Dazu wird der Bezeichnung der Ethernetkarte (z.B. `eth0`) einfach ein Doppelpunkt und eine Nummer zugefügt (`eth0:1, eth0:2, ...`). Jeder dieser "virtuellen Netzwerkkarten" kann jetzt eine eigene IP-Adresse vergeben werden. Entweder mit dem entsprechenden Konfigurationsprogramm (yast, linuxconf,...) oder mit dem Befehl:

      ifconfig eth0:1 Adresse netmask Maske

Wenn diese zweite (dritte, vierte, ...) Adresse jetzt im Nameserver einen eigenen Eintrag erhält, so kann tatsächlich der Webserver darauf reagieren. Dazu müssen in der Konfigurationsdatei ein paar zusätzliche Einträge vorhanden sein:

      NameVirtualHost  IP-Adresse

Dieser Eintrag ist nur nötig, um mehrere namensbasierte Virtuelle Server aufzubauen. Die IP-Adresse ist die der "virtuellen Netzwerkkarte" wie oben beschrieben.

Jetzt können wir die einzelnen virtuellen Server definieren. Dazu werden wiederum Angaben in spitzen Klammern gemacht, entweder mit IP-Adressen (von virtuellen Karten) oder mit Hostnamen (Alias-Einträge im Nameserver, die auf die virtuelle Karte verweisen).

Jeder dieser Einträge bekommt jetzt einen eigenen DocumentRoot und kann alle bisher besprochenen Direktiven des normalen Servers enthalten. Ein Beispiel:

      NameVirtualHost 10.230.1.101

      <VirtualHost 10.230.1.101>
        ServerAdmin root@marvin.mydomain.de
        DocumentRoot /www2
        ServerName virtual1.mydomain.de
      </VirtualHost>

      <VirtualHost 10.230.1.101>
        ServerAdmin hans@marvin.mydomain.de
        DocumentRoot /www3
        ServerName virtual2.mydomain.de
        <Directory /www3/specialdir>
           AllowOverride All
        </Directory>
      </VirtualHost>

Hier haben wir also zwei virtuelle Hosts definiert, beide wurden über ein und dieselbe IP-Adresse (10.230.1.101) definiert, aber beide unterscheiden sich anhand ihres Namens. Natürlich muß der zweite Name entsprechend im Nameserver vorhanden sein und als Alias auf den ersten Rechner gesetzt sein.

Die zweite Möglichkeit virtueller Hosts ist die Adressenbasierte. Hier ist die Angabe des NameVirtualHost-Befehls nicht nötig. Dafür muß jeder virtuelle Server eine eigene IP-Adresse besitzen. Mit der oben gezeigten Methode ist das bis zu einem bestimmten Punkt möglich. Ab einer gewissen Anzahl (etwa ab 4 virtuellen Hosts) bietet es sich aber an, namensbasierte Hosts zu generieren, statt mit x virtuellen Netzwerkkarten zu arbeiten...

Innerhalb der <VirtualHost> Klammerung können alle Direktiven stehen, die auch schon für die Konfiguration des Hauptservers zur Anwendung kamen. Es sind also vollständig autarke Server, denen sogar eigene CGI-Verzeichnisse gegeben werden können. Das folgende Beispiel zeigt zwei virtuelle Hosts, die Adressenbasiert aufgebaut sind und je ein eigenes cgi-bin Verzeichnis besitzen:

      <VirtualHost 10.230.1.105>
        ServerAdmin root@marvin.mydomain.de
        DocumentRoot /www1/htdocs
        ScriptAlias /cgi-bin/ "www1/cgi-bin/"
        ServerName virtual1.mydomain.de
      </VirtualHost>

      <VirtualHost 10.230.1.106>
        ServerAdmin hans@marvin.mydomain.de
        DocumentRoot /www2/htdocs
        ScriptAlias /cgi-bin/ "www2/cgi-bin/"
        ServerName virtual2.mydomain.de
      </VirtualHost>

### Starten und Anhalten des Webservers

Normalerweise wird der Webserver beim Start des Systems durch ein Init-Script gestartet. Dieses Script wird beim Wechsel in den Standard-Runlevel ausgeführt und heißt meistens `/etc/init.d/apache` oder `/etc/init.d/httpd`.

In diesem Script wird - wie oben schon erwähnt - als Parameter für den Webserver die Konfigurationsdatei mit angegeben. Typische Einträge zum Starten wären also z.B.

      /usr/bin/httpd -f /etc/httpd/httpd.conf

Auch das Herunterfahren des Webservers kann in der Regel mit diesem Script ausgeführt werden, indem ihm der Parameter `stop` mitgegeben wird.

Nach jeder Änderung an der Konfigurationsdatei muß der Server neu gestartet werden. Damit das nicht nur über das Init-Script erfolgen kann, gehört zum Lieferumfang von apache ein Serverkontrollprogramm, mit dem diese Aufgaben erledigt werden können. Dieses Programm ist ein Shellscript, das eventuell an abweichende Pfade angepasst werden muß.

Die Aufrufform des Programms ist

      apachectl Kommando

Es stehen verschiedene Kommandos zur Verfügung. Die wichtigsten sind:

start
  Startet den Apache-Daemon (Webserver). Gibt eine Fehlermeldung aus, wenn er bereits läuft.
stop
  Hält den Daemon an.
restart
  Stopt den laufenden Daemon und startet ihn neu. Zu diesem Zweck wird dem Daemon ein HUP-Signal geschickt. Wenn der Daemon noch nicht gestartet war, wird er neu gestartet.
graceful
  Dieses Kommando startet den Server mit dem Signal USR1 neu. Der Unterschied zu restart ist, daß bestehende Verbindungen nicht unterbrochen werden.
configtest
  Die Konfigurationsdatei wird einem Syntax-Test unterworfen. Rückgabe ist entweder Syntax Ok oder eine detailierte Information über die gefundenen Fehler in der Konfigurationsdatei.