33Apache
In diesem Kapitel beschreibe ich, wie Sie Ihren eigenen Webserver aufsetzen. Außer auf Apache und seine Basiskonfiguration gehe ich auch auf einige beliebte Erweiterungen ein, unter anderem auf PHP, Webalizer und Awstats. Das Kapitel endet mit Informationen zu FTP – und der Empfehlung, auf einen FTP-Server zu verzichten.
Ich gehe in diesem Kapitel davon aus, dass Sie einen öffentlichen Webserver im Internet betreiben möchten. Grundsätzlich ist es natürlich auch möglich, Apache nur innerhalb eines LANs einzusetzen, beispielsweise als firmeninternes Kommunikationszentrum mit einem Wiki und Seiten zur Projektplanung, Zeiterfassung etc. In diesem Fall müssen Sie aber unbedingt sicherstellen, dass die hier gesammelten Daten tatsächlich intern bleiben und dass kein ungeschützter Webzugriff aus dem Internet möglich ist (siehe auch Abschnitt 33.2, »Webverzeichnisse einrichten und absichern«).
Generell gilt: Dieses Kapitel ist lediglich eine Einführung in die Konfiguration von Apache und beschreibt bestenfalls ein Prozent der Schlüsselwörter zur Apache-Konfiguration. Der professionelle Einsatz von Apache setzt das Studium weiterführender Dokumentation voraus, sei es in Buchform oder aus dem Internet.
33.1Apache
Apache ist der Webserver der Open-Source-Welt. Im September 2015 liefen laut http://netcraft.com ca. 38 Prozent aller Websites unter Apache. Wird nur die Million der am meisten besuchten Websites betrachtet, steigt der Marktanteil sogar auf 48 Prozent. Aktuelle Informationen sowie eine umfassende Dokumentation zu Apache finden Sie auf der Apache-Website:
Apache 2.4 wurde Anfang 2012 fertiggestellt und kommt bei allen gängigen Distributionen zum Einsatz. Damit ist Apache 2.2 aber noch nicht tot: Es wird noch über viele Jahre auf Langzeit-Distributionen wie CentOS/RHEL 6 laufen. Dieses Kapitel berücksichtigt deswegen beide Versionen.
Eine typische Apache-Installation besteht aus zahlreichen zusammengehörenden Paketen: dem Server an sich, diversen Bibliotheken, Plugins, Programmiersprachen etc. Um Ihnen die Installation zu erleichtern, können Sie bei einigen Distributionen jeweils eine ganze Gruppe von Paketen zur Installation auswählen. Damit werden neben Apache auch die wichtigsten MySQL- und PHP-Pakete installiert.
Das richtige Multi-Processing-Modul (MPM)
Apache stellt vier unterschiedliche Multi-Processing-Module zur Auswahl, nämlich perchild, prefork, worker und event. Diese Multi-Threading-Verfahren haben Einfluss darauf, wie effizient Apache mehrere Anfragen gleichzeitig verarbeiten kann. Beim Einrichten von Apache müssen Sie sich für eine dieser Varianten entscheiden, indem Sie das entsprechende apache2-mpm-xxx-Paket installieren.
Wenn Sie zusammen mit Apache die Programmiersprache PHP einsetzen möchten, ist das Verfahren prefork die sicherste Wahl. Bei den anderen Varianten sind Fehler aufgrund von nicht thread-sicheren PHP-Bibliotheken möglich:
Apache ist ein Dämon, der je nach Distribution explizit gestartet werden muss. Eine Zusammenfassung der erforderlichen Kommandos finden Sie in Abschnitt 14.5, »Systemprozesse (Dämonen)«. Der Name des Init-Scripts variiert je nach Distribution: Er lautet apache2 bei Debian, SUSE und Ubuntu bzw. httpd bei CentOS, Fedora und RHEL.
Unter Fedora, RHEL und (open)SUSE blockiert die standardmäßig aktive Firewall den Zugriff auf den Webserver von außen. Sie können Apache also vorerst nur direkt auf dem Rechner ausprobieren, auf dem der Webserver läuft (http://localhost). Damit der Webserver auch von außen erreichbar ist, müssen Sie in der Firewall Ausnahmeregeln für die Protokolle HTTP und HTTPS definieren, also für die Port-Nummern 80 und 443.
Unter SUSE verwenden Sie zur Firewall-Konfiguration am besten YaST. Unter CentOS/Fedora/RHEL können Sie wie folgt vorgehen: Sie stellen zuerst fest, welche Firewall-Zone für die Netzwerkschnittstelle zum Internet gilt, und aktivieren dann für diese Zone Ausnahmeregeln:
Alternative Verfahren zur Firewall-Konfiguration sowie eine Menge Hintergrundinformationen zu diesem Thema folgen in Kapitel 38, »Firewalls«.
Der Service-Name für das Init-System variiert je nach Distribution. Aus Sicherheitsgründen wird der Webserver wie die meisten anderen Netzwerk-Dämonen nicht unter dem Account root ausgeführt, sondern unter einem anderen Account. Dessen Namen stellen Sie am einfachsten mit ps axu fest. Tabelle 33.1 fasst zusammen, unter welchem Namen Apache dem Init-System bekannt ist, unter welchem Account das Programm läuft und wo sich standardmäßig die HTML-Dateien befinden.
Distribution |
Prozessname |
Account |
DocumentRoot |
---|---|---|---|
Debian, Ubuntu |
apache2 |
www-data |
/var/www/html |
CentOS, Fedora, RHEL |
httpd |
apache |
/var/www/html |
SUSE |
httpd-threadverfahren |
wwwrun |
/srv/www/htdocs |
Tabelle 33.1Programmname, Account und DocumentRoot-Verzeichnis von Apache
Um zu testen, ob alles funktioniert, starten Sie auf dem lokalen Rechner einen Webbrowser und geben als Adresse http://localhost/ oder http://servername/ ein. Sie sollten nun eine Testseite des Webservers sehen (siehe Abbildung 33.1).
Abbildung 33.1Apache-Testseite eines Fedora-Rechners
Damit statt der Testseite die Startseite Ihres eigenen Webauftritts erscheint, müssen Sie Ihre HTML-Dateien in das Dokumentverzeichnis von Apache speichern. Auch dieses Verzeichnis ist distributionsabhängig (Schlüsselwort DocumentRoot in den Konfigurationsdateien, siehe Tabelle 33.1). Ihre HTML-Dateien müssen für den Account des Apache-Webservers lesbar sein!
Wenn Sie unter Fedora oder RHEL arbeiten, müssen Sie außerdem darauf achten, dass alle HTML-Dateien mit dem SELinux-Attribut httpd\_sys\_content\_t ausgestattet sind. Für Dateien innerhalb von /var/www/html erreichen Sie das am einfachsten durch das folgende Kommando:
Wenn Sie Ihre HTML-Dateien in einem anderen Verzeichnis ablegen, ist hingegen das folgende Kommando erforderlich:
Beachten Sie, dass für CGI-, Webalizer- und Konfigurationsdateien andere Attribute vorgesehen sind. Details zum SELinux-Modul für Apache können Sie mit man httdp_selinux nachlesen, wenn Sie vorher das Paket selinux-policy-doc installieren.
Konfiguration
In diesem Buch fehlt der Platz, um detailliert auf alle Konfigurationsoptionen und -varianten einzugehen. Ich möchte Ihnen an dieser Stelle aber zumindest einen Überblick darüber geben, wo sich die Konfigurationsdateien je nach Distribution befinden und wie ganz elementare Einstellungen durchgeführt werden.
Früher erfolgte die Konfiguration von Apache durch eine einzige Datei httpd.conf, wobei deren genauer Ort distributionsabhängig war. Diese Konfigurationsdatei wurde im Laufe der Zeit immer unübersichtlicher.
Aus diesem Grund sind die meisten Distributionen dazu übergegangen, die Einstellungen auf diverse Dateien zu verteilen, die durch Include-Anweisungen aus verschiedenen Verzeichnissen gelesen werden (siehe Tabelle 33.2 bis Tabelle 33.4). Das macht jede einzelne Datei übersichtlicher und ermöglicht eine automatisierte Wartung – also beispielsweise das Aktivieren oder Deaktivieren von Plugins durch Kommandos oder Scripts. Wenn Sie ein bestimmtes Schlüsselwort in den Konfigurationsdateien suchen, gehen Sie am besten so vor:
Dateien |
Inhalt |
---|---|
/etc/apache2/apache2.conf |
Startpunkt |
/etc/apache2/httpd.conf |
benutzerspezifische Konfiguration |
/etc/apache2/ports.conf |
überwachte Ports, normalerweise Port 80 |
/etc/apache2/conf.d/* |
weitere Konfigurationsdateien |
/etc/apache2/mods-available/ |
verfügbare Erweiterungsmodule |
/etc/apache2/mods-enabled/*.conf |
Links auf aktive Erweiterungsmodule |
/etc/apache2/conf-available/ |
verfügbare Konfigurationsdateien |
/etc/apache2/conf-enabled/*.conf |
Links auf aktive Konfigurationsdateien |
/etc/apache2/sites-available/ |
verfügbare Websites (virtuelle Hosts) |
/etc/apache2/sites-enabled/*.conf |
Links auf aktive Websites |
/etc/apache2/envvars |
Umgebungsvariablen für das Init-Script |
Tabelle 33.2Apache-Konfiguration bei Debian und Ubuntu
Dateien |
Inhalt |
---|---|
/etc/httpd/conf/httpd.conf |
Startpunkt |
/etc/httpd/conf/magic |
MIME-Konfiguration (für mod_mime) |
/etc/httpd/conf.d/*.conf |
sonstige Konfigurationsdateien |
Tabelle 33.3Apache-Konfiguration bei Fedora und Red Hat
Dateien |
Inhalt |
---|---|
/etc/apache2/httpd.conf |
Startpunkt |
/etc/apache2/*.conf |
globale Konfigurationsdateien |
/etc/apache2/sysconf.d/*.conf |
automatisch erzeugte Systemkonfigurationsdateien |
/etc/apache2/conf.d/*.conf |
sonstige Konfigurationsdateien |
/etc/apache2/vhosts.d/*.conf |
Websites (virtuelle Hosts) |
/etc/sysconfig/apache2 |
Grundeinstellungen |
Tabelle 33.4Apache-Konfiguration bei SUSE
Bei Debian/Ubuntu enthält das Verzeichnis mods-available eine Kollektion von *.load- und *.conf-Dateien für diverse Apache-Module. Um weitere Module zu aktivieren, richten Sie in mods-enabled Links auf diese Dateien ein. Bei der Verwaltung der Links helfen die Debian-spezifischen Kommandos a2enmod und a2dismod.
Des Weiteren können Sie mit a2ensite und a2dissite virtuelle Hosts aktivieren bzw. deaktivieren. Standardmäßig enthält sites-available nur die Dateien 000-default.conf und default-ssl.conf: Dort befinden sich diverse Grundeinstellungen für das Verzeichnis /var/www. Der Mechanismus funktioniert wie bei den Modulen: Das Verzeichnis sites-available enthält die Konfigurationsdateien für alle Hosts, in sites-enabled befinden sich die entsprechenden Links.
Bei aktuellen Debian/Ubuntu-Versionen mit Apache 2.4 wurde dieser Mechanismus auch auf sonstige Konfigurationsdateien ausgeweitet. Die Dateien befinden sich in conf-available. Mit den Kommandos a2enconf bzw. a2disconf werden im Verzeichnis conf-enabled entsprechende Links darauf eingerichtet bzw. wieder entfernt. Bei älteren Ubuntu-Versionen sowie bei Debian werden derartige Konfigurationsdateien in conf.d gespeichert. Die Verwaltung erfolgt manuell ohne Kommandos.
Bei SUSE werden sämtliche *.conf-Dateien im Verzeichnis sysconf.d bei jedem Apache-Start durch das Init-V-Script /etc/init.d/apache2 neu erstellt. Änderungen in diesen Dateien sind daher zwecklos. Vielmehr müssen Sie die Variablen in /etc/sysconfig/apache2 ändern. In dieser Datei ist auch festgelegt, welche Module beim Apache-Start geladen werden (Variable APACHE_MODULES). Wenn Sie den SUSE-Konfigurationsdateien eine eigene Datei hinzufügen möchten, geben Sie deren Dateinamen in der Variable APACHE_CONF_INCLUDE_FILES an.
Nach Änderungen an der Syntax können Sie mit httpd -t, httpd2 -t bzw. apache2 -t testen, ob die Konfiguration frei von Syntaxfehlern ist. Bei Debian und Ubuntu müssen Sie vorher einige Umgebungsvariablen aus envvars einlesen:
Anschließend fordern Sie Apache dazu auf, die Konfigurationsdateien neu einzulesen:
Der Webserver Apache funktioniert zwar im Regelfall auf Anhieb. Je nach Netzwerkkonfiguration müssen Sie aber zumindest eine Zeile in den Konfigurationsdateien ändern bzw. zu ihnen hinzufügen: ServerName sollte den Namen Ihres Rechners enthalten. Falls diese Einstellung nicht wirksam wird, müssen Sie außerdem die Einstellung UseCanonicalName Off verwenden.
Bei SUSE stellen Sie den Rechnernamen in /etc/sysconfig/apache2 mit der Variablen APACHE_SERVERNAME ein.
Sofern der Root-Server über eine IPv6-Adresse verfügt, beantwortet Apache auch IPv6-Webanfragen. Dafür verantwortlich ist die Standardeinstellung Listen 80, mit der Apache den Port 80 überwacht, unabhängig von der IP-Version. Wenn Sie IPv6 deaktivieren möchten, fügen Sie die Anweisung Listen 0.0.0.0:80 in die passende Konfigurationsdatei ein. Falls Apache auch HTTPS-Seiten liefern soll, benötigen Sie eine weitere Listen-Anweisung für den Port 443:
Standardzeichensatz
Bei allen gängigen Linux-Distributionen gilt automatisch der Unicode-Zeichensatz UTF-8. Wenn Sie also mit einem Texteditor eine Textdatei erstellen, die die deutschen Buchstaben ä, ö, ü oder ß enthält, werden diese in der UTF-8-Codierung gespeichert.
Apache ist die Codierung der HTML-Dateien grundsätzlich egal. Das Programm überträgt die Dateien einfach Byte für Byte an den Webbrowser, der die Seite angefordert hat. Allerdings sendet Apache zusätzlich einen sogenannten Header mit, der unter anderem Informationen darüber enthält, in welchem Zeichensatz die Seite codiert ist. Der Webbrowser wertet diese Information aus und verwendet den angegebenen Zeichensatz zur Darstellung der Seite.
Der springende Punkt ist nun, dass Apache den richtigen Zeichensatz angibt: Wenn das schiefgeht, sieht der Benutzer in seinem Webbrowser statt ä oder ü irgendwelche merkwürdigen Zeichenkombinationen. Aus diesem Grund bietet Apache diverse Möglichkeiten zur Zeichensatzkonfiguration:
-
AddDefaultCharset off: Bei dieser Einstellung wertet Apache das <meta>-Tag in der zu übertragenden HTML-Datei aus und sendet den dort angegebenen Zeichensatz an den Browser. Wenn die HTML-Datei wie folgt beginnt, kommt der Zeichensatz Unicode UTF-8 zur Anwendung:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> ... -
AddDefaultCharset zeichensatz: Apache überträgt den hier angegebenen Zeichensatz für alle Seiten an den Browser. Die Einstellung gilt sowohl für HTML- als auch für PHP-Dateien. Das <meta>-Tag im HTML-Code wird ignoriert.
-
AddCharset zeichensatz kennung: Damit wird ein Zeichensatz für Dateien mit einer bestimmten Kennung eingestellt. AddCharset utf-8 .utf8 bewirkt also, dass für alle Dateien, deren Name auf .utf8 endet, als Zeichensatz Unicode UTF-8 an den Browser gesendet wird. AddCharset setzt das Apache-Modul mod_mime voraus.
Natürlich gilt je nach Distribution eine unterschiedliche Standardkonfiguration. Für die globale Voreinstellung des Zeichensatzes ist unter Debian und Ubuntu die Konfigurationsdatei /etc/apache2/conf-enabled/charset.conf vorgesehen. Normalerweise ist diese Datei leer, d.h., es gilt AddDefaultCharset off.
Sie können AddDefaultCharset und AddCharset auch in den Konfigurationsdateien für virtuelle Hosts (Verzeichnis sites-available) sowie in .htaccess-Dateien einsetzen, wenn Sie eine host- bzw. verzeichnisspezifische Konfiguration wünschen. Beachten Sie aber, dass die Zeichensatzeinstellungen in .htaccess nur berücksichtigt werden, wenn für das Webverzeichnis AllowOverride All oder FileInfo gilt.
Bei Fedora und Red Hat gilt AddDefaultCharset UTF-8. Die Einstellung befindet sich in /etc/httpd/conf/httpd.conf. In derselben Datei ist auch AllowOverride None für das Verzeichnis /var/www/html eingestellt.
Bei SUSE fehlt in den Konfigurationsdateien eine explizite Zeichensatzeinstellung. Damit gilt AddDefaultCharset off, d.h., die <meta>-Informationen in den HTML-Dateien sind für die richtige Zeichensatzerkennung entscheidend. Ein geeigneter Ort zur Einstellung von AddDefaultCharset ist die Datei /etc/apache2/mod_mime-defaults.conf. Auch bei SUSE gilt AllowOverride None für das Verzeichnis /srv/www/htdocs. Sie können die Einstellung in /etc/apache2/default-server.conf verändern.
Logrotate
Die Logging-Dateien von Apache zählen bei vielen Servern zu den Dateien, die am schnellsten wachsen. Deswegen müssen Sie sich darum kümmern, dass die Logging-Dateien regelmäßig umbenannt, komprimiert und schließlich gelöscht werden. Genau diese Aufgabe erledigt das Programm Logrotate (siehe Abschnitt 19.8, »Logging«), das auf Linux-Servern in der Regel standardmäßig installiert ist.
Das Programm wird üblicherweise einmal täglich durch /etc/cron.daily/logrotate gestartet. In der Standardkonfiguration verarbeitet es die Apache-Logging-Dateien /var/log/httpd/*.log (Fedora/RHEL) bzw. /var/log/apache2/*.log (Debian/Ubuntu) einmal pro Woche, benennt sie in name.nn um und komprimiert sie. Die komprimierten Dateien werden für 52 Wochen archiviert und dann gelöscht.
Falls Sie bei der Konfiguration virtueller Hosts eigene Logging-Verzeichnisse definieren, müssen Sie in der Konfigurationsdatei /etc/logrotate.d/apache2 die erste Zeile anpassen und dort die Orte der zusätzlichen Logging-Dateien angeben. Dabei sind auch Muster wie /home/*/www-log/*.log erlaubt: