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_htmlTestdateien 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.htmlBerechtigungen 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/wwwVirtual Host konfigurieren
Konfigurationsdatei erstellen
Unter Debian/Ubuntu liegt jeder vHost in einer eigenen Datei:
nano /etc/apache2/sites-available/beispiel.de.confGrundkonfiguration
<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.confStandard-vHost deaktivieren (optional)
a2dissite 000-default.confKonfiguration prüfen
apache2ctl configtestDie Ausgabe sollte Syntax OK sein.
Apache neu laden
systemctl reload apache2Erweiterte 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 adminWeiterleitung 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-apacheZertifikat anfordern
certbot --apache -d beispiel.de -d www.beispiel.deCertbot 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 -SLogs prüfen
tail -f /var/log/apache2/beispiel.de-error.logHä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.deFalscher vHost wird geladen:
- ServerName prüfen
apache2ctl -Szeigt 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.