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:

http://httpd.apache.org

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.

root# tasksel install web-server (Debian) root# yum groupinstall 'Web-Server' (CentOS, RHEL) root# dnf groupinstall 'Web-Server' (Fedora) root# zypper intall -t pattern lamp_server (SUSE) user$ sudo apt-get install tasksel (Ubuntu) user$ sudo tasksel install lamp-server

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:

http://www.php.net/manual/en/faq.installation.php

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:

root# firewall-cmd --get-zone-of-interface=enp0s3 (aktive Zone herausfinden) FedoraWorkstation root# firewall-cmd --permanent --zone=FedoraWorkstation --add-service=http root# firewall-cmd --permanent --zone=FedoraWorkstation --add-service=https root# firewall-cmd --reload

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).

Apache-Testseite eines
  Fedora-Rechners

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:

root# restorecon -R -v /var/www/html/*

Wenn Sie Ihre HTML-Dateien in einem anderen Verzeichnis ablegen, ist hingegen das folgende Kommando erforderlich:

root# chcon -R system_u:object_r:httpd_sys_content_t:s0 /mein-web-verzeichnis

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:

user$ cd /etc/httpd (bzw.) cd /etc/apache2 user$ find -type f -exec grep -i -q Schlüsselwort {} \; -print

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:

root# . /etc/apache2/envvars root# apache2 -t Syntax OK

Anschließend fordern Sie Apache dazu auf, die Konfigurationsdateien neu einzulesen:

root# service apache2|httpd reload

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.

# in /etc/apache2/httpd.conf (Debian/Ubuntu) # bzw. /etc/httpd/conf/httpd.conf (Fedora/Red Hat) ServerName mars.sol # geben Sie hier den Namen Ihres Rechners an

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:

# Datei /etc/apache2/ports.conf (Debian, Ubuntu) # Dateien /etc/httpd/conf/httpd.conf und conf.d/ssl.conf (CentOS, Fedora, RHEL) # Datei /etc/apache2/listen.conf (SUSE) Listen 0.0.0.0:80 Listen 0.0.0.0:443 https

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:

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:

# Datei /etc/logrotate.d/apache2 /var/log/apache2/*.log /home/meinefirma/www-log/*.log { weekly missingok rotate 52 ... }