malte70.blog()

Apache-Tutorial: Webseite erstellen

Dieses kurze Tutorial zeigt, wie Du im Apache HTTPd eine neue Webseite einrichtest. Als Serversystem wird ein Debian-Derivat wie z.B. Raspberry Pi OS ( a.k.a. Raspbian) verwendet.

Neben einer Subdomain (die einfachste Variante) zeige ich Dir auch, wie du die „Hauptseite“ unter der Second-Level-Domain, inkl. Weiterleitung von der www.-Subdomain, erstellst (no-www Class B).

Folgendes wird vorausgesetzt:

  1. Die Domain der Seite kann via DNS aufgelöst werden. Im folgenden sind dies die Domains example.com, www.example.com & foo.example.com.
    • www.example.com ist idealerweise ein CNAME-Record, der auf example.com zeigt.
  2. Die Wurzelverzeihnisse der Webseiten (bei Apache DocumentRoot genannt) liegen unter /srv/http/<webseite>.
  3. Die Pakete apache2 und certbot sind installiert.

DNS-Auflösung testen und DocumentRoot erstellen

Die DNS-Auflösung lässt sich mit dem Programm host testen:

host example.com
host www.example.com
host foo.example.com

Nun wird der DocumentRoot-Ordner erstellt, das Wurzelverzeichnis der Webseite; mit einer minimalen index.html-Datei. Außerdem ändern wir die Gruppe in www-data, damit für PHP-Skripte der Schreibzugriff durch ein chmod g+w gewährt werden kann, statt durch ein viel zu unsicheres chmod 777:

sudo mkdir -p /srv/http/foo.example.com /srv/http/example.com
sudo chown -R $USER:www-data \
	/srv/http/foo.example.com /srv/http/example.com
echo '<h1>foo.example.com</h1>' > /srv/http/foo.example.com/index.html
echo '<h1>example.com</h1>' > /srv/http/example.com/index.html

Apache VHost-Config für foo.example.com

Nun wird die Apache-Konfigurationsdatei /etc/apache2/sites-available/foo.example.com.conf erstellt:

<VirtualHost *:80>
    ServerName foo.example.com
    ServerAdmin webmaster@example.com
    
    DocumentRoot /srv/http/foo.example.com

    # Eigene Logfiles
    ErrorLog ${APACHE_LOG_DIR}/foo.example.com_error.log
    CustomLog ${APACHE_LOG_DIR}/foo.example.com_access.log combined
    
    <Directory /srv/http/foo.example.com>
        Require all granted
        AllowOverride All
        Options +Indexes +SymLinksIfOwnerMatch
    </Directory>
</VirtualHost>

Ein kurzer Überblick über die hier vorgenommenen Einstellungen:

  • ServerName, ServerAdmin und DocumentRoot erklären sich von selbst
  • Eigene Log-Dateien für den VHost. CustomLog erstellt ein dabei die access_log.
  • Ein Require all granted innerhalb einer <Directory>-Direktive erlaubt den Zugriff auf den DocumentRoot, ansonsten würde der Server nur mit einem 403-Fehler antworten
  • AllowOverride All erlaubt alle Direktiven und Einstellungen innerhalb von .htaccess-Dateien. Sollte aus Sicherheitsgründen nicht verwendet werden, wenn Dritte Dateien im DocumentRoot ändern können.
  • Die Option Indexes aktiviert Verzeichnis-Listings, falls keine index-Datei vorhanden ist. Im Produktiv-Betrieb und falls ein CMS o.ä. eingesetzt wird, sollte die Option evtl. deaktiviert werden (durch angabe von -Indexes).
  • Die Option SymLinksIfOwnerMatch folgt symbolischen Links, falls das Ziel dem gleichen Benutzer gehört. So kann nicht auf System-Verzeichnisse oder VHosts von anderen Nutzern verlinkt werden.

Aktiviert wird die Seite mit:

sudo a2ensite foo.example.com
sudo systemctl reload apache2

Dabei wird ein symbolischer Link in /etc/apache2/sites-enabled erstellt und Apache angewiesen die Konfiguration neu einzulesen.

Jetzt sollte die Seite unter http://foo.example.com erreichbar sein.

Ein VHost für mehrere Domains: example.com & www.example.com

Um die Second-Level-Domain inkl. www.-Subdomain einzurichten, erstellen wir die Datei /etc/apache2/sites-available/example.com, in der wir www.example.com als ServerAlias angeben:

<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    ServerAdmin webmaster@example.com
    
    DocumentRoot /srv/http/example.com

    # Logfiles
    ErrorLog ${APACHE_LOG_DIR}/example.com_error.log
    CustomLog ${APACHE_LOG_DIR}/example.com_access.log combined
    
    <Directory /srv/http/example.com>
        Require all granted
        AllowOverride All
        Options +Indexes +SymLinksIfOwnerMatch
    </Directory>
	
	# Weiterleitung www.example.com -> example.com
	<IfModule mod_rewrite.c>
		RewriteEngine On
		RewriteCond %{HTTP_HOST} ^www\.example\.com$
		RewriteRule ^(.*)$ %{REQUEST_SCHEME}://example.com$1 [R=301,L]
	</IfModule>
</VirtualHost>

Mithilfe des Apache-Moduls mod_rewrite wird hierbei von www.example.com permanent zu example.com umgeleitet. Anmerkung: Doppelter Content ohne Umleitung kann von Google mit einer Herabstufung im Index bestraft werden, deshalb sollten diese Rewrite-Regeln immer verwendet werden.

Nachdem das Modul aktiviert wurde, kann die Seite aktiviert werden. Da ein Modul aktiviert wurde, muss der Apache-Daemon komplett neu gestartet werden:

sudo a2enmod rewrite
sudo a2ensite example.com
sudo systemctl restart apache2

SSL-Zertifikat via Let’s Encrypt

Mithilfe von certbot beantragen wir nun ein SSL-Zertifikat von Let’s Encrypt:

sudo certbot --apache -d foo.example.com

Dabei fragt certbot, ob wir eine automatische Umleitung auf HTTPS wollen, welchem wir zustimmen.

Die neue Apache Konfigurationsdatei /etc/apache2/sites-available/foo.example.com-le-ssl.conf wurde dabei erstellt und direkt aktiviert.

Für example.com müssen wir im SSL-Zertifikat zusätzlich die www.-Subdomain eintragen. Dafür kann bei Certbot die Option -d wiederholt werden. Die erste Nennung wird dabei als commonName im Zertifikat hinterlegt, alle weiteren als subjectAlternateNames:

sudo certbot --apache -d example.com -d www.example.com

Um die neuen SSL-VHosts zu aktivieren, muss mod_ssl aktiviert werden und der Webserver neu geladen werden:

sudo a2enmod ssl
sudo systemctl reload apache2