Virtual Hosts ermöglichen es, mehrere Websites mit unterschiedlichen Domains auf einem einzigen Apache-Server zu betreiben.

Was sind Virtual Hosts?

Virtual Hosts (vHosts) unterscheiden Anfragen anhand des Domain-Namens. Wenn jemand beispiel.de aufruft, liefert Apache andere Dateien als bei anderesbeispiel.de - obwohl beide auf demselben Server liegen.

Arten von Virtual Hosts

  • Namensbasiert: Unterscheidung nach Domain-Name (Standard)
  • IP-basiert: Unterscheidung nach IP-Adresse
  • Port-basiert: Unterscheidung nach Port

Namensbasierte Virtual Hosts sind am häufigsten und werden hier behandelt.

Voraussetzungen

  • Apache installiert
  • Domains zeigen auf die Server-IP (A-Records)
  • Root-Zugriff auf den Server

Verzeichnisstruktur anlegen

Erstellen Sie für jede Website ein eigenes Verzeichnis:

mkdir -p /var/www/beispiel.de/public_html
mkdir -p /var/www/anderesbeispiel.de/public_html

Testdateien erstellen

echo "<h1>Willkommen auf beispiel.de</h1>" > /var/www/beispiel.de/public_html/index.html
echo "<h1>Willkommen auf anderesbeispiel.de</h1>" > /var/www/anderesbeispiel.de/public_html/index.html

Berechtigungen setzen

chown -R www-data:www-data /var/www/beispiel.de
chown -R www-data:www-data /var/www/anderesbeispiel.de
chmod -R 755 /var/www

Virtual Host konfigurieren

Konfigurationsdatei erstellen

Unter Debian/Ubuntu liegt jeder vHost in einer eigenen Datei:

nano /etc/apache2/sites-available/beispiel.de.conf

Grundkonfiguration

<VirtualHost *:80>
    ServerName beispiel.de
    ServerAlias www.beispiel.de

    DocumentRoot /var/www/beispiel.de/public_html

    <Directory /var/www/beispiel.de/public_html>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/beispiel.de-error.log
    CustomLog ${APACHE_LOG_DIR}/beispiel.de-access.log combined
</VirtualHost>

Erklärung der Direktiven

| Direktive | Beschreibung | |-----------|--------------| | ServerName | Hauptdomain | | ServerAlias | Zusätzliche Domains | | DocumentRoot | Verzeichnis der Website | | Options -Indexes | Verzeichnislisting deaktivieren | | Options +FollowSymLinks | Symlinks erlauben | | AllowOverride All | .htaccess erlauben | | Require all granted | Zugriff erlauben |

Zweiten Virtual Host anlegen

nano /etc/apache2/sites-available/anderesbeispiel.de.conf
<VirtualHost *:80>
    ServerName anderesbeispiel.de
    ServerAlias www.anderesbeispiel.de

    DocumentRoot /var/www/anderesbeispiel.de/public_html

    <Directory /var/www/anderesbeispiel.de/public_html>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/anderesbeispiel.de-error.log
    CustomLog ${APACHE_LOG_DIR}/anderesbeispiel.de-access.log combined
</VirtualHost>

Virtual Host aktivieren

Unter Debian/Ubuntu

a2ensite beispiel.de.conf
a2ensite anderesbeispiel.de.conf

Standard-vHost deaktivieren (optional)

a2dissite 000-default.conf

Konfiguration prüfen

apache2ctl configtest

Die Ausgabe sollte Syntax OK sein.

Apache neu laden

systemctl reload apache2

Erweiterte Konfiguration

PHP-Einstellungen pro vHost

<VirtualHost *:80>
    ServerName beispiel.de
    DocumentRoot /var/www/beispiel.de/public_html

    <Directory /var/www/beispiel.de/public_html>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    # PHP-Einstellungen
    php_admin_value upload_max_filesize 50M
    php_admin_value post_max_size 50M
    php_admin_value max_execution_time 300
    php_admin_value memory_limit 256M
</VirtualHost>

Mit PHP-FPM

<VirtualHost *:80>
    ServerName beispiel.de
    DocumentRoot /var/www/beispiel.de/public_html

    <Directory /var/www/beispiel.de/public_html>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    <FilesMatch \.php$>
        SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost"
    </FilesMatch>
</VirtualHost>

Mit eigenem PHP-FPM-Pool

Für bessere Isolation kann jede Website einen eigenen PHP-FPM-Pool haben:

<VirtualHost *:80>
    ServerName beispiel.de
    DocumentRoot /var/www/beispiel.de/public_html

    <FilesMatch \.php$>
        SetHandler "proxy:unix:/run/php/php-fpm-beispiel.sock|fcgi://localhost"
    </FilesMatch>
</VirtualHost>

Authentifizierung

<VirtualHost *:80>
    ServerName admin.beispiel.de
    DocumentRoot /var/www/admin.beispiel.de/public_html

    <Directory /var/www/admin.beispiel.de/public_html>
        AuthType Basic
        AuthName "Admin-Bereich"
        AuthUserFile /etc/apache2/.htpasswd
        Require valid-user
    </Directory>
</VirtualHost>

Passwort-Datei erstellen:

htpasswd -c /etc/apache2/.htpasswd admin

Weiterleitung auf www

<VirtualHost *:80>
    ServerName beispiel.de
    Redirect permanent / https://www.beispiel.de/
</VirtualHost>

<VirtualHost *:80>
    ServerName www.beispiel.de
    DocumentRoot /var/www/beispiel.de/public_html
</VirtualHost>

SSL/HTTPS mit Let's Encrypt

Certbot installieren

apt install certbot python3-certbot-apache

Zertifikat anfordern

certbot --apache -d beispiel.de -d www.beispiel.de

Certbot erstellt automatisch einen HTTPS-vHost:

<VirtualHost *:443>
    ServerName beispiel.de
    ServerAlias www.beispiel.de
    DocumentRoot /var/www/beispiel.de/public_html

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/beispiel.de/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/beispiel.de/privkey.pem
</VirtualHost>

HTTP auf HTTPS umleiten

<VirtualHost *:80>
    ServerName beispiel.de
    ServerAlias www.beispiel.de
    Redirect permanent / https://beispiel.de/
</VirtualHost>

Fehlersuche

Welcher vHost wird verwendet?

apache2ctl -S

Logs prüfen

tail -f /var/log/apache2/beispiel.de-error.log

Häufige Probleme

403 Forbidden:

  • Berechtigungen prüfen: chown -R www-data:www-data /var/www/
  • Directory-Direktive fehlt oder falsch

DNS zeigt nicht auf Server:

dig beispiel.de

Falscher vHost wird geladen:

  • ServerName prüfen
  • apache2ctl -S zeigt die Zuordnung

Default Virtual Host

Der erste geladene vHost ist der Default für unbekannte Domains:

# /etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
    ServerName localhost
    DocumentRoot /var/www/html
</VirtualHost>

Best Practices

1. Eindeutige Namen: Dateinamen = Domainname 2. Separate Logs: Jede Website eigene Log-Dateien 3. Berechtigungen: Korrekte Besitzer und Rechte 4. HTTPS: Immer SSL aktivieren 5. Verzeichnisse: Übersichtliche Struktur unter /var/www

Zusammenfassung

| Aktion | Befehl | |--------|--------| | vHost erstellen | /etc/apache2/sites-available/domain.conf | | vHost aktivieren | a2ensite domain.conf | | vHost deaktivieren | a2dissite domain.conf | | Konfiguration prüfen | apache2ctl configtest | | Apache neu laden | systemctl reload apache2 | | vHosts auflisten | apache2ctl -S |

Fazit

Virtual Hosts sind der Standard für Multi-Domain-Hosting. Mit wenigen Zeilen Konfiguration betreiben Sie dutzende Websites auf einem Server. Vergessen Sie nicht SSL für alle produktiven Websites.