Obwohl der Apache Webserver immer stärkere Konkurrenz z.B. von Nginx („Engine X“) bekommt, ist er nach wie vor der beliebteste Webserver für Linux. Das liegt nicht zuletzt an der einfachen Konfiguration. In kürzester Zeit kann ein Webserver inklusive PHP und MySQL auf die Beine gestellt werden – somit eignet sich Apache besonders für Einsteiger, die den Webserver beispielsweise für ihre ersten Versuche mit PHP benötigen.
In einer kleinen Serie will ich erklären, wie ihr Schritt für Schritt zu einem funktionierenden Webserver mit allen möglichen Erweiterungen wie PHP, MySQL und SSL kommt. Die Serie beginne hier – bei der Grundlegenden Konfiguration von Apache und der Einrichtung von VirtualHosts.
Um überhaupt mit der Konfiguration loslegen zu können, muss der Webserver zuerst installiert werden. Außerdem werden die nachfolgenden Schritte als root-User ausgeführt.
sudo -s apt-get update && apt-get install apache2
Nach der Installation wird der Webserver ein erstes Mal gestartet. Die Beispielseite kann dann über einen Webbrowser angezeigt werden, indem die IP-Adresse des Servers eingegeben wird. Doch nun zur Konfiguration…
VirtualHosts machen den Webserver flexibel …
Ein Apache Webserver kann aus einem oder mehreren sog. VirtualHosts bestehen. Diese Hosts können wie weitere kleine, virtuelle „Unterserver“ aufgefasst werden. Angenommen ein Webserver mit einer bestimmten IP soll mehrere Domains bzw Subdomains bedienen: beispiel.de, keine-ahnung.de und test.keine-ahnung.de. … dann müsste für jede der drei Domains ein VirtualHost in der Konfiguration angelegt werden.
Eine grundlegende VirtualHost Konfiguration sieht so aus:
<VirtualHost *:80> ServerName beispiel.de DocumentRoot /var/www/beispiel.de/beispiel.de </VirtualHost>
Die Einstellungen zu jedem VirtualHost werden zwischen ein „<VirtualHost>“-Paar geschrieben. In der ersten Zeile wird außerdem noch der Port angegeben, für den der definierte VirtualHost zuständig sein soll. Im Beispiel lauscht der VirtualHost nur auf Verbindung, die über Port 80 (Standard HTTP) den Webserver erreichen. Anfragen via SSL (Port 443) nimmt er beispielsweise nicht entgegen.
Danach wird mit ServerName die Domain definiert, für die der VirtualHost zuständig sein soll. Im Beispiel ist er nur für beispiel.de zuständig. DocumentRoot definiert das Wurzelverzeichnis, in dem die HTML-oder PHP-Dateien liegen. In diesem Verzeichnis sollte eine index.html oder eine index.php Datei liegen. Diese wird dann beim Aufruf von beispiel.de automatisch geladen und dem Benutzer angezeigt.
VirtualHost Direktiven können noch viele weitere Einstellungen beinhalten, auf die zunächst nicht weiter eingegangen werden soll.
Die VirtualHost Definitionen werden in Konfigurationsdateien in /etc/apache2/sites-available/ geschrieben und auf Wunsch vom Webserver geladen. Warum auf Wunsch? Es ist üblich, nicht alle VH-Definitionen in eine einzige Datei zu packen, sondern diese je nach Domain in verschiedene Dateien auszulagern. So wird für beispiel.de eine Datei /etc/apache2/sites-available/beispiel.de.conf angelegt und für die beiden VHs zu „keine-ahnung.de“ eine Datei „keine-ahnung.de.conf“. Jede Domain bekommt ihre VirtualHosts also in eine eigene Datei geschrieben. In dieser Datei werden dann die Definitionen für die Domain selbst und ihre Subdomains (test.keine-ahnung.de) gesammelt. Auf diese Weise kann man Ordnung halten und hat die Möglichkeit, bestimmte Domains inaktiv zu schalten.
Die Dateien in /etc/apache2/sites-available/ werden vom Webserver eigentlich nicht beachtet. Aktiv werden die Dateien erst geschaltet, wenn sie sich in /etc/apache2/sites-enabled/ befinden oder dort verlinkt wurden. Aus diesem Grund müssen neu angelegte VH-Konfigurationsdateien zuerst aktiviert werden, ehe der Webserver sie einliest. Dann werden sie in sites-enabled verlinkt und sind damit aktiv.
Den vorhandenen VH vereinfachen
In /etc/apache2/sites-available befindet sich bereits eine Konfigurationsdatei „000-default.conf“, welche bereits aktiv ist. Bei einem Aufruf der IP des Webservers im Webbrowser wird sie aktiv, denn in ihr ist ein VirtualHost definiert, dem kein ServerName zugeordnet wurde. Auf diese Weise wird der VH aktiv, wenn kein anderer es wird (Default / Fallback). Für alle weiteren VHs muss aber zwingend ein ServerName angegeben werden!
Die Datei enthält schon eine Menge Inhalt, der der Einfachheit halber gelöscht und durch eine neue Konfiguration ersetzt wird:
> /etc/apache2/sites-available/000-default.conf nano /etc/apache2/sites-available/000-default.conf
Neuer Inhalt der Datei:
<VirtualHost *:80> DocumentRoot /var/www/html </VirtualHost>
Dieser VirtualHost zeigt noch immer auf die Demo-Seite, die beim Aufruf der Server-IP-Adresse erscheint – es wurden lediglich Kommentarzeilen entfernt, sodass die Konfiguration einfacher aussieht.
Einen neuen VirtualHost erstellen
Nun soll ein neuer VirtualHost für eine bestimmte Domain erstellt werden. Ich gehe davon aus, dass ihr eine Domain besitzt, welche bereits auf die IP-Adresse eures Webservers verweist. Für die Domain wird zunächst ein eigener Ordner innerhalb des Webserver-Verzeichnisses /var/www geschaffen:
mkdir /var/www/beispiel.de
In diesen Ordner könnt ihr nun eine Beispielseite legen, die später angezeigt werden soll.
Als nächstes wird ein neuer, passender VirtualHost benötigt, der auf die Domain anspricht und die index.html im gerade erstellten Ordner lädt. Dazu wird eine neue Datei „beispiel.de“ in /etc/apache2/sites-available erstellt:
nano /etc/apache2/sites-available/beispiel.de.conf
… und folgende Konfiguration eingetragen:
<VirtualHost *:80> ServerName beispiel.de DocumentRoot /var/www/beispiel.de </VirtualHost>
Um dem Webserver die neue Konfiguration unterzuschieben sind noch zwei weitere Schritte erforderlich: Zuerst muss die Konfiguration für beispiel.de aktiviert werden:
a2ensite beispiel.de.conf
… und dann die Konfigurationen neu eingelesen werden:
service apache2 reload
Nun ist der neue VirtualHost aktiv und wird genutzt, sobald jemand über die Eingabe von „beispiel.de“ auf euren Server surft. Die index.html / index.php in /var/www/beispiel.de/ wird automatisch geladen und angezeigt. Würde man eine zweite Datei „test.html“ in das Verzeichnis legen, wäre diese über den Seitenaufruf „beispiel.de/test.html“ erreichbar.
Ein VirtualHost lässt sich übrigens über den Befehl
a2dissite beispiel.de.conf
wieder deaktivieren. Auch in diesem Fall ist es nötig, den Webserver über ein „service apache reload“ neu zu laden.
Noch ist der Webserver relativ langweilig …
… das kann man aber ändern. In den folgenden Beiträgen geht es weiter:
- PHP und MySQL Datenbank installieren
- Verschlüsselte Verbindungen zum Webserver ermöglichen (SSL)
- SSL Zertifikate von StartSSL beziehen
- Apache Webserver als Proxy zu anderen Ports (z.B. Etherpad)
- Webmail Client Roundcube installieren
Hallo Thomas,
verspricht sehr gut zu werden, Deine Artikelserie!
Kannst Du vielleicht bei Gelegenheit noch ein paar Worte zur Nutzerverwaltung verlieren? Habe immer mal wieder gehört, daß man verschiedene Nutzer für verschiedene Seiten (Domains) nehmen sollte – ist das nun sinnvoll oder nicht?
Sollte man die Arbeit auf dem Server als Root oder www-data oder dergleichen vollführen?
Oder eben doch den Normaluser der Webgruppe (www-data?) zuordnen und dementsprechende Recht verteilen?
Danke schon mal,
Guntram
https://legacy.thomas-leister.de
Hi Guntram,
Verschiedene Nutzer für verschiedene Domains? Davon habe ich noch nicht gehört. Wüsste jetzt auch nicht, wie man das realisieren soll. :-/
Die Arbeit auf dem Server führe ich meistens als root durch.Ist einfach bequemer, weil man ja auch oft noch an Apache Config Files bastelt (und nicht nur in /var/www/), sodass man root-Rechte hin und wieder braucht. Wenn ich etwas in /var/www hochgeladen habe, wird es via chown -R www-data:www-data ziel an www-data übereignet, sodass Apache vollen Zugriff hat. Das ist besonders wichtig, wenn z.B. PHP ins Dateisystem schreiben soll.
Ich weiß nicht, wie das andere Admins handhaben oder ob es an meiner Herangehensweise etwas auszusetzen gibt. Ich sehe keine Probleme.
@Alle: Wie macht ihr das? Was könnt ihr empfehlen?
LG Thomas
Als root solltest du überhaupt nicht dein System nutzen, lieber per sudo in der Konsole alles notwendige editieren. Rechtemanagement in Linux, vor allem auf Servern, kann auch mal Sicherheitsrelevant sein. :) Danke für das tolle Tutorial.
(Falsches Kommentar kommentiert..)
http://danjou.de
Warum schreibst du das nicht alles hierein http://wiki.ubuntuusers.de/Apache ? Ich versteh‘ immer nicht, warum solche Informationen immer und immer wieder unnötig dupliziert werden…
https://legacy.thomas-leister.de
In erster Linie deshalb, weil ich dann sehen müsste, was aus dem Wiki-Artikel noch verwertbar ist und was nicht, irgendwo geht dann die Konsistenz flöten oder die Hälfte wird wieder umgeschrieben…
Hier habe ich die Freiheit, meine eigene Herangehensweise darzulegen ohne Rücksicht auf das, was andere User schon irgendwo geschrieben haben ;) Ich bin unabhängiger, freier in meiner Gestaltung. Und: So bleibt das Internet schön redundant. Sollte das Ubuntu-Wiki mal nicht erreichbar sein, ist man vllt froh, wenn man woanders nachlesen kann.
Dennoch werde ich mal weiter darüber nachdenken und dann ggf. auch zum Ubuntu-Wiki beitragen ;)
LG Thomas
Als root solltest du überhaupt nicht dein System nutzen, lieber per sudo in der Konsole alles notwendige editieren. Rechtemanagement in Linux, vor allem auf Servern, kann auch mal Sicherheitsrelevant sein. :) Danke für das tolle Tutorial.
Hallo Thomas,
vielen Dank für dieses Tutorial.
Folgendes ist mir noch aufgefallen:
Bei mir funktionierte die neue Konfiguration erst, nachdem ich die alte mit dem Befehl „a2dissite 000-default.conf.“ deaktiviert habe.
viele Grüße,
Matthias
Ja bei mir ist die neue Seite auch erst erreichbar wenn „000-default.conf“ deaktiviert wurde.
Danke für den Hinweis an dieser Stelle.
Hi Thomas,
vielen Dank für die Anleitung. Hat prima geklappt.
Noch eine Frage: Ich habe für mein Apache SSL aktiviert das 1a funzt.
Habe nun nach dieser Anleitung drei verschiedene virtual Hosts erstellt die per HTTP auch aufrufbar sind.
Nur was muss ich jetzt machen, damit diese virtual Hosts auch per HTTPS also SSL erreichbar sind?
Vielen Dank. :)
Gruss
Markus
Nachtrag zu vorhin:
Wenn ich jetzt die Subdomain per https aufrufe wird die Hauptdomain angezeigt.
Falls wichtig. :)
Hallo Thomas,
Danke für dein kleines übersichtliches Tutorial. Es ist einfach und für Anfänger geschrieben, damit es angehende Apache-User, wie mich, grundlegend verstehen.
Was ich aber mal fragen wollte, geht in eine bisschen andere Richtung. Vlt kannst du mir dennoch helfen.
Ich habe einen kleinen Server im lokalen Netzwerk zuhause. Diesen erreiche ich nun über die intern vergebene IP Adresse. Funktioniert auch alles. Nach deiner Anleitung kann ich nun diverse VHosts erstellen die auf verschiedene Domains hören. Und jetzt kommt die Frage. Wie kann ich solche Test-Domains im Heimnetzwerk vergeben. Ich habe mal bei mir auf dem Mac unter /etc/hosts einen entsprechenden Eintrag gemacht, sodass ich bei Eingabe von domain1.local auf meinen Webserver komme. Allerdings kriegt der Webserver doch nicht mit von welcher Domain er aufgerufen wurde, wenn ich das über die Host-Datei gemacht habe, oder? Deswegen greift bei mir nur der default VHost…
Irgendwie habe ich das Gefühl, dass ich da einen großen Denkfehler habe :D
Viele Grüße
Julian
http://www.swisshockeyagency.ch
Hallo Thomas
Vielen Dank für das Tutorial.
Eine Frage habe ich aber noch, ich weiss nicht wie ich Subdirectories aufrufbar mache.
Jedes mal kriege ich einen 403 Forbidden error.
Zwar findet man via Google viele Antworten, aber ich vertraue keiner wirklich, da alle den Ordnern einfach irgendwelche Rechte geben.
Wäre froh um eine Antwort.
Grüsse
Jonas
Hallo,
Ich habe alles so gemacht wie du, aber wenn ich es richtig verstanden habe sollte dann die Domain im der Adresszeile vom Browser stehen bleiben. Bei mir wird sie immer zur IP vom Server. Könntest du mir weiterhelfen?
Mfg
Jan
https://legacy.thomas-leister.de/ueber-mich-und-blog/
Hi Jan,
die Domain bleibt nur in der Adressleiste stehen, wenn du sie zuvor dort eingegeben hast oder der Server dich umleitet auf diese Domain. Der Browser wird sich niemals die Domain aneignen, die du in Apache konfiguriert hast – die ist dem Browser egal (bzw kann der Browser auch nicht ermitteln).
LG Thomas
Mir ist mal aufgefallen das ein wesentlicher Schritt vergessen wurde.
Wenn man das ganze lokal testen möchte um nicht immer über http://localhost/mypage/ zugreifen zu müssen und auch die standart Seite des Apache nicht verlieren möchte dann fehlt definitiv noch ein Eintrag in der hosts Datei.
sudo nano /etc/hosts
hier muss dann noch folgende Zeile hinzugefügt werden:
127.0.0.1 beispiele.de
jetzt kann direkt über http://www.beispiele.de oder einfach nur der direkten eingabe beispiele.de auf den virtual Host zugegriffen werden
Auch bei Https müssen die domains natürlich eingetragen werden.
EDIT:
um http://www.beispiele.de zu routen muss in der hosts auch noch der eintrag für die www direktive gesetzt werden.
mein Fehler ;(
127.0.0.1 www.beispiele.de
wenn man das nicht macht funktioniert natürlich auch nur http://beispiele.de
Hi,
Coole Anleitung!
Wäre noch toll zu sehen ob man evt noch
Order allow,deny
Allow from all
oder so anwenden muss. Braucht es dies für die Sicherheit oder so?
Perfekt verständliche Anleitung. Danke dafür.