Der Webserver apache
¶
Ein Webserver ist ein Dienst, der eingehende HTTP-Anfragen bearbeitet und die angeforderten Dokumente ausgibt. Meist handelt es sich bei diesen Dokumenten um HTML-Dateien; via HTTP können allerdings auch beliebige andere Dokumente ausgeliefert werden.
Der Webserver apache
ist der weltweit am weitesten verbreitete Webserver.
Unter Debian/Ubuntu/LinuxMint kann apache
(aktuellen Version 2017: 2.4)
folgendermaßen installiert werden:
sudo apt install apache2 apache2-utils
Für den Webserver wird bei der Installation standardmäßig ein eigener
Benutzer-Account namens www-data
und eine angelegt; der Apache-Webserver
wird mit diesem Account als Eigentümer des Prozesses automatisch gestartet (und
künftig bei jedem Systemstart automatisch geladen). Öffnet man in einem
Webbrowser die Adresse http://localhost
, so bekommt man eine entsprechende
Willkommens-Seite angezeigt.
Inhalte, die der Webserver ausgeben soll, werden in einem als document root
bezeichneten Verzeichnis abgelegt. Bei apache2
ist dieses Verzeichnis
standardmäßig /var/www/html/
. Die oben genannte Willkommens-Seite liegt mit
dem Namen index.html
in genau diesem Verzeichnis.
Möchte man den Webserver manuell starten, stoppen, oder neu laden, so ist dies wie üblich via systemd möglich:
# Webserver starten:
sudo systemctl start apache2
# Webserver stoppen:
sudo systemctl stop apache2
# Webserver neu starten:
sudo systemctl restart apache2
Als Alternative hierzu kann auch die Anweisung apache2ctl
verwendet werden.
Neben apache2ctl start|stop|restart
kann man auch folgende Anweisung
aufrufen, um die Einstellungen auf Syntax-Korrektheit zu prüfen:
# Webserver-Einstellungen prüfen:
apache2ctl configtest
Mit apache2ctl graceful
kann man die Konfigurationen neu laden, ohne den
Server beziehungsweise bestehende Verbindungen zu unterbrechen.
Apache-Konfigurationsdateien¶
Die grundlegende Konfigurationsdatei für den Apache-Webserver ist die Datei
/etc/apache2/apache2.conf
. In früheren Zeiten war dies die einzige
Konfigurationsdatei. Inzwischen wurden zwecks einer besseren Übersichtlichkeit
und Wartbarkeit einzelne Konfigurations-Teile in andere Dateien ausgelagert;
diese werden nach Bedarf mittels Include
-Anweisungen geladen. Beispielsweise
wird so über die Datei /etc/apache2/ports.conf
festgelegt, auf welche Ports
der Apache-Server achten soll.
Die zusätzlichen Apache-Konfigurationsdateien werden üblicherweise in folgenden Verzeichnissen abgelegt:
/etc/apache2/mods-available
Dieses Verzeichnis enthält verfügbare Erweiterungs-Module.
/etc/apache2/conf-available
Dieses Verzeichnis enthält verfügbare Konfigurationen.
/etc/apache2/sites-available
Dieses Verzeichnis enthält Definitionen bezüglich verfügbarer Webseiten.
Zu jedem der drei obigen Verzeichnisse existiert unter /etc/apache2
ein
entsprechendes Verzeichnis, das auf -enabled
endet. In diesen Verzeichnisses
befinden sich lediglich Symlinks auf gleichnamige Dateien, die
in den zugehörigen, auf -available
endenden Verzeichnissen liegen. Anstelle
die Symlinks manuell anzulegen, können folgende Anweisungen genutzt werden:
a2enmod
unda2dismod
Mit diesen beiden Anweisungen können Erweiterungs-Module aktiviert beziehungsweise deaktiviert werden.
a2enconf
unda2disconf
Mit diesen beiden Anweisungen können einzelne Konfigurationen aktiviert beziehungsweise deaktiviert werden.
a2ensite
unda2dissite
Mit diesen beiden Anweisungen können einzelne Webseiten aktiviert beziehungsweise deaktiviert werden.
Standardmäßig gibt es im Verzeichnis /etc/apache2/sites-available
der
verfügbaren Webseiten nur zwei Einträge, nämlich 000-default.conf
und
default-ssl.conf
; diese beiden Dateien enthalten Grundeinstellungen für das
Verzeichnis /var/www/html
. Diese .conf
-Dateien sollte auch so beibehalten
werden, da sie grundlegende Standard-Einstellungen beinhalten.
Viruelle Hosts¶
Ein apache
-Webserver kann gleichzeitig mehrere Domains hosten. Dies bedeutet
konkret, dass beispielsweise für die zwei verschiedenen Domains
example-one.de
und example-two.de
keine zwei unterschiedlichen Server
benötigt werden. Stattdessen kommen bei apache
so genannte „Virtuelle Hosts“
zum Einsatz, um mehrere eigenständige Webseiten nebeneinander nutzen zu können.
Üblicherweise wird für jeden derartigen virtuellen Host beziehungsweise eine
eigene Datei .conf
-Datei im Verzeichnis /etc/apace2/sites-available
angelegt. Für die Beispiel-Domain example-one.de
würde diese
example-one.de.conf
heißen. Diese kann beispielsweise folgenden Inhalt
haben:
<VirtualHost *:80>
ServerName www.example-one.de
ServerAlias example-one.de www.example-one.de
ServerAdmin webmaster@example-one.de
DocumentRoot /var/www/example-one.de/
DirectoryIndex index.html
ErrorLog /var/log/apache2/error.log
CustomLog /var/log/apache2/access.log combined
<Directory /var/www/example-one.de/>
Options +Indexes -FollowSymLinks
</Directory>
</VirtualHost>
Durch die Angabe von <VirtualHost *:80>
wird festgelegt, dass die folgende
Konfiguration für Anfragen von beliebigen Adressen (*
) für den HTTP-Port (80
)
gültig ist. Die zusätzlichen Zeilen haben folgende Bedeutung:
- Über die Attribute
ServerName
undServerAlias
wird festgelegt, für welche Domain die folgenden Einstellungen relevant sind. Wird im obigen Beispiel der Webserver also über die Adressewww.example-one.de
kontaktiert (wahlweise mit oder ohne anfänglicheswww
), so wird der Inhalt des alsDocumentRoot
bezeichneten Verzeichnisses ausgegeben. Befindet sich in diesem Verzeichnis eine Datei namensindex.html
, so wird diese automatisch geladen.[1] - Über die Einstellung
ServerAdmin
wird eine Email-Adresse angegeben, über die der Betreuer der Webseite für Rückfragen erreichbar ist. Eine Email-Adresse der Artwebmaster@domain-name.tld
hat sich dabei als Standard etabliert (TLD wird häufig als allgemeines Kürzel für den Begriff „Top-Level-Domain“ verwendet, also beispielsweise für.de
,.com
,.org
,.net
, usw.). Damit eine Email-Adresse dieser Art funktioniert, muss neben dem Webserver auch ein Mailserver installiert werden. - Mittels den Einstellungen für
ErrorLog
undCustomLog
wird festgelegt, in welchen Dateien auftretende Fehler beziehungsweise Zugriffe auf den virtuellen Host protokolliert werden sollen. Neue Einträge in diesen Dateien kann beispielsweise mittels tail -f in einem separaten Shell-Fenster im Blick behalten.
Durch die
Directory
-Einstellung werden zusätzliche Optionen festgelegt, die ausschließlich für das angegebene Verzeichnis gelten. Durch die Option+Indexes
wird festgelegt, dass beim Aufruf eines Verzeichnisses (einer Webadresse, die mit/
endet) eine Liste aller sich darin befindenden Dateien ausgegeben wird, sofern darin keine der mittels der OptionDirectoryIndex
definierten Dateien existiert. Das Plus-Zeichen ist bei der Angabe von+Indexes
optional; soll andernfalls eine Auflistung des Ordnerinhalts unterdrückt werden, so ist dies mittels der Option-Indexes
möglich.Diese Art der Aktivierung beziehungsweise Deaktivierung einzelner Optionen funktioniert auch mit weiteren Einstellungs-Möglichkeiten, beispielsweise:
- Mit
AllowOverride
wird festgelegt, ob einzelne Verzeichnis-Einstellungen durch so genannte Access-Files dezentral überschrieben werden dürfen. Standardmäßig ist dies seit der Apache-Version 2.4 nicht erlaubt. MitAllowOverride All
wird eine Änderung aller hier beschriebenen Einstellungen mittels Access-Files ermöglicht, mitAllowOverride AuthConfig Indexes
dürfen nur die Zugriffs-Einschränkungen für Ordner-Inhalte/Dateien und Verzeichnis-Listen dezentral geändert werden, um beispielsweise einen Passwort-Schutz für einzelne Bereiche einer Webseite zu ermöglichen. - Mit
FollowSymlinks
wird festgelegt, ob Symlinks in Web-Verzeichnissen erlaubt sind. Ist diese Option erlaubt, so können auch Dateien oder Verzeichnisse außerhalb des mitDocumentRoot
festgelegten Verzeichnisses mittels Verlinkungen angezeigt/abgerufen werden. Standardmäßig ist dies erlaubt. - Mit
ExecCGI
wird das Ausführen von CGI-Skripten erlaubt. Standardmäßig ist dies nicht erlaubt.
- Mit
Eine vollständige Liste mit allen derartigen Einstellungs-Möglichkeiten („Direktiven“) gibt es hier beziehungsweise hier
Um den im obigen Beispiel definierten virtuellen Host zu aktivieren, würde man
sudo a2ensite example-one.de.conf
angeben. Hierdurch legt der Apache-Server
automatisch einen entsprechenden symbolischen Link in das
sites-enabled
-Verzeichnis an. Schließlich müssen die Konfigurations-Dateien
noch neu geladen werden:
# Webserver-Konfigurationen neu laden:
sudo system reload apache2
Für weitere Domains können entsprechende .conf
-Dateien angelegt und
aktiviert werden.
SSL-Zertifikate¶
Es wird zunehmend zum Standard, dass Webseiten nicht über http://adresse
,
sondern über https://adresse
angesprochen werden. Dieser Unterschied bringt
eine Verschlüsselung der übertragenen Daten mit sich, setzt allerdings auf der
Server-Seite ein valides SSL-Zertifikat voraus.
Eine Möglichkeit, ein solches Zertifikat zu erhalten, besteht darin, sich selbst eines mittels ref:openssl <OpenSSL> auszustellen. Dies hat allerdings den Nachteil, dass dies von nahezu allen Browsern als unsicher eingestuft wird, da keinen externe Instanz die Echtheit des Zertifikats bestätigen kann. Wesentlich besser ist es in diesem Fall, ein (kostenloses) Zertifikat über das Let’s Encrypt <https://de.wikipedia.org/wiki/Let’s_Encrypt>-Projekt zu erhalten, das seit einigen Jahren von der EFF (Electronic Frontier Foundation) getragen wird. Dies gelingt am einfachsten durch die Verwendung des so genannten „Certbots“.
Für die Installation von certbot
gibt es hier eine ausführliche Liste mit
Installations-Anleitungen für verschiedene Linux-Systeme.
Um
certbot
auf einem System mit Ubuntu 16.04 Xenial zu installieren, muss man das Entwickler-Paket (PPA) des Certbot-Teams hinzufügen. Dafür gibt man folgende Anweisungen ein:sudo aptitude update sudo aptitude install software-properties-common sudo add-apt-repository ppa:certbot/certbot sudo aptitude update
Anschließend kann
certbot
folgendermaßen installiert werden:sudo aptitude install python3-certbot-apache
Für Debian 9 (Stretch) gibt es momentan (Stand: Feb. 2018) noch kein Repository. Man kann allerdings weiterhin das entsprechende Repository aus der Vorgänger-Version nutzen, indem man folgende Zeile in die Datei
/etc/apt/sources.list
hinzufügt:deb http://ftp.debian.org/debian stretch-backports main
Anschließend kann
certbot
folgendermaßen installiert werden:sudo aptitude -t stretch-backports install python-certbot-apache
Nach der Installation kann man certbot
aufrufen:
# Zertifikate einrichten:
sudo certbot --apache
Es erscheint ein kurzer Abfrage-Dialog. In diesem muss einerseits den
Nutzungsbedingungen zustimmen, andererseits muss eine Email-Adresse angegeben
werden, an die bei Bedarf Fehlermeldungen geschickt werden können.
Einer Weitergabe der Email-Adresse an die EFF muss man nicht zustimmen.
Schließlich muss man noch auswählen, für welche (in Apache bereits aktivierte
und über das Internet zugängliche) Domain das Zertifikat ausgestellt werden
soll. Bei der Nachfrage, ob http
-Anfragen künftig automatisch in
https
-Anfragen umgewandelt werden sollen („Redirect“), ist es empfehlenswert
„Ja“ auszuwählen.
Mit der obigen Anweisung erledigt certbot
den Rest automatisch: Es erstellt
zur .conf
-Datei einer Domain / eines virtuellen Hosts im Verzeichnis
/etc/apache2/sites-available
automatisch eine gleichnamige Datei, die
allerdings auf le-ssl.conf
endet und fügt die notwendigen Ergänzungen ein.
Anschließend ruft certbot
automatisch a2ensite
auf und lädt die neuen
Einstellungen für den Apache-Server neu. Für spezielle Anwendungsfälle hilft die
englischsprachige Original-Anleitung weiter.
Die von Let’s Encrypt bereitgestellten Zertifikate haben eine Gültigkeitsdauer
von 90 Tagen. certbot
richtet daher mit dem obigen Aufruf automatisch auch
einen Cronjob ein, mit dem das Zertifikat beziehungsweise die
Zertifikate automatisch erneuert werden. Davon kann man sich in der neu
angelegten Datei /etc/cron.d/certbot
selbst überzeugen; manuell können
Zertifikate mittels sudo certbot renew
erneuert werden.
Zugriffs-Beschränkungen mittels Access-Dateien¶
Die Apache-Standard-Einstellungen erlauben grundsätzlich den Zugriff auf
alle Dateien des mit der Einstellung DocumentRoot
festgelegten
Verzeichnisses einer Webseite. Möchte man diese Zugriffsmöglichkeiten einschränken
und beispielsweise ein Unterverzeichnis nur nach Eingabe eines Passworts
zugänglich machen, so können hierfür so genannte „Access-Dateien“ genutzt
werden. Derartige Dateien haben oftmals den Namen .htaccess
.
Eine .htaccess
-Datei kann beispielsweise folgenden Inhalt haben:
AuthUserFile /var/www/verzeichnis-der-zieldomain/.htpasswd
AuthName "Bitte Benutzername und Passwort eingeben!"
AuthType Basic
Require valid-user
Eine solche Datei kann einfach mittels eines Text-Editors angelegt werden.
Um die zugehörige Passwort-Datei .htpasswd
zu erstellen, muss hingegen das
Programm htpasswd
(aus dem apache2-utils
-Paket) verwendet werden. Eine neue
.htpasswd
-Datei kann folgendermaßen im aktuellen Verzeichnis erstellt werden:
# Passwort-Datei .htpasswd erstellen:
htpasswd -c .htpasswd BENUTZERNAME
Als Benutzername muss hierbei ein Name angegeben werden, mit dem künftig ein Login im Passwort-geschützten Bereich möglich sein soll; anschließend muss das zugehörige Passwort zweimal eingegeben werden.
Soll ein Login auch mit einem anderen Benutzernamen-/Passwort-Paar möglich sein,
so kann man wie oben htpasswd
aufrufen, allerdings ohne die Option -c
:
Diese Option steht für „create, erzeugt also jedes mal eine neue Datei. Ist
diese Option hingegen nicht aktiv, so wird ein zusätzlicher Benutzer-Eintrag der
bestehenden Datei hinzugefügt.
Sofern in den Apache-Einstellungen für die Ziel-Domain, genauer gesagt den
dortigen Directory-Einstellungen die Option
AllowOverride AuthConfig
gesetzt ist, so genügt es, die beiden Dateien
.htaccess
und .htpasswd
in das künftig passwortgeschützte
Zielverzeichnis zu kopieren; die Pfad-Einstellung in der Datei .htaccess
muss dabei mit dem dem Zielverzeichnis übereinstimmen.
Der Vorteil dieser Methode liegt insbesondere darin, dass ein Webhosting-Nutzer
auf diese Weise Änderungen an den Zugriffs-Optionen vornehmen kann, ohne
selbst den Apache-Server modifizieren zu können. Ist man selbst der Betreiber
des Webservers, so kann die .htpasswd
-Datei auch in einem separaten
Verzeichnis, sogar außerhalb des DocumentRoots
der Domain abgelegt und
von mehreren .htaccess
-Dateien gleichzeitig genutzt werden – dazu brauchen
lediglich die Pfad-Angaben für die AuthUserFile
angepasst werden.
… to be continued …
Anmerkungen:
[1] | Damit eine Browser-Anfrage für www.example-one.de überhaupt beim
richtigen Webserver ankommt, muss diese Domain bei einem Domain-Anbieter
(beispielsweise do.de oder netcup.de)
registriert und die IP-Adresse des Webservers als Ziel-IP-Adresse angegeben
werden. |