> For the complete documentation index, see [llms.txt](https://docs.instantroot.de/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.instantroot.de/kvm-server/linux/webserver-installieren.md).

# Webserver installieren

Mit einem Webserver kannst du Webseiten, Webanwendungen oder APIs auf deinem KVM-Server bereitstellen.

In diesem Artikel erklären wir dir, wie du unter Linux einen einfachen Webserver installierst, welche Unterschiede es zwischen Apache und Nginx gibt und welche Schritte nach der Installation wichtig sind.

### Voraussetzungen

Du benötigst:

* einen KVM-Server mit Linux
* Root-Zugriff oder einen Benutzer mit sudo-Rechten
* eine aktive SSH-Verbindung
* Grundkenntnisse im Umgang mit der Konsole
* optional eine Domain, die auf deinen Server zeigt

Für die Beispiele verwenden wir Debian oder Ubuntu. Viele Schritte funktionieren ähnlich auch auf anderen Linux-Distributionen, die Befehle können dort aber abweichen.

### Was ist ein Webserver?

Ein Webserver ist ein Dienst, der Webseiten und Webinhalte ausliefert.

Wenn ein Besucher deine Domain im Browser öffnet, fragt der Browser deinen Server nach der Webseite. Der Webserver nimmt diese Anfrage an und liefert die passenden Dateien zurück.

Typische Webserver sind:

* Apache
* Nginx

Beide können Webseiten ausliefern. Welcher Webserver besser passt, hängt vom Einsatzzweck und deinen Anforderungen ab.

### Apache oder Nginx?

Apache und Nginx sind die bekanntesten Webserver unter Linux.

| Webserver | Beschreibung                                                                             |
| --------- | ---------------------------------------------------------------------------------------- |
| Apache    | Sehr verbreitet, flexibel, viele Anleitungen, gute Unterstützung für `.htaccess`         |
| Nginx     | Schnell, ressourcenschonend, häufig für moderne Webanwendungen und Reverse Proxy genutzt |

Wenn du eine klassische Webseite oder WordPress betreiben möchtest, ist Apache oft ein einfacher Einstieg.

Wenn du eine performante Webseite, eine API oder einen Reverse Proxy betreiben möchtest, ist Nginx häufig eine gute Wahl.

### System aktualisieren

Bevor du einen Webserver installierst, solltest du dein System aktualisieren.

Melde dich per SSH auf deinem Server an und führe aus:

`apt update`

Danach installierst du verfügbare Updates:

`apt upgrade`

Wenn wichtige Systemupdates installiert wurden, kann ein Neustart sinnvoll sein:

`reboot`

### Apache installieren

Apache installierst du unter Debian oder Ubuntu mit folgendem Befehl:

`apt install apache2`

Nach der Installation wird Apache normalerweise automatisch gestartet.

Prüfe den Status:

`systemctl status apache2`

Wenn Apache läuft, kannst du die IP-Adresse deines Servers im Browser öffnen.

Beispiel:

`http://123.123.123.123`

Wenn alles funktioniert, erscheint die Standardseite von Apache.

### Apache starten, stoppen und neustarten

Apache starten:

`systemctl start apache2`

Apache stoppen:

`systemctl stop apache2`

Apache neustarten:

`systemctl restart apache2`

Apache neu laden, ohne aktive Verbindungen hart zu beenden:

`systemctl reload apache2`

Apache beim Systemstart automatisch starten:

`systemctl enable apache2`

### Nginx installieren

Nginx installierst du unter Debian oder Ubuntu mit folgendem Befehl:

`apt install nginx`

Nach der Installation wird Nginx normalerweise automatisch gestartet.

Prüfe den Status:

`systemctl status nginx`

Wenn Nginx läuft, kannst du die IP-Adresse deines Servers im Browser öffnen.

Beispiel:

`http://123.123.123.123`

Wenn alles funktioniert, erscheint die Standardseite von Nginx.

### Nginx starten, stoppen und neustarten

Nginx starten:

`systemctl start nginx`

Nginx stoppen:

`systemctl stop nginx`

Nginx neustarten:

`systemctl restart nginx`

Nginx neu laden, ohne aktive Verbindungen hart zu beenden:

`systemctl reload nginx`

Nginx beim Systemstart automatisch starten:

`systemctl enable nginx`

### Nicht Apache und Nginx gleichzeitig auf Port 80 betreiben

Apache und Nginx nutzen standardmäßig beide Port `80` für HTTP und Port `443` für HTTPS.

Wenn beide Webserver gleichzeitig auf denselben Ports laufen, kann einer der Dienste nicht starten.

Typische Fehlermeldung:

`Address already in use`

Entscheide dich deshalb am Anfang für einen Webserver.

Wenn du von Apache zu Nginx wechseln möchtest, stoppe Apache zuerst:

`systemctl stop apache2`

Optional Apache deaktivieren:

`systemctl disable apache2`

Wenn du von Nginx zu Apache wechseln möchtest, stoppe Nginx zuerst:

`systemctl stop nginx`

Optional Nginx deaktivieren:

`systemctl disable nginx`

### Firewall öffnen

Damit deine Webseite von außen erreichbar ist, müssen die passenden Ports freigegeben sein.

Für Webseiten brauchst du meistens:

| Port  | Zweck |
| ----- | ----- |
| `80`  | HTTP  |
| `443` | HTTPS |

Wenn du UFW verwendest, kannst du HTTP und HTTPS freigeben.

HTTP freigeben:

`ufw allow 80/tcp`

HTTPS freigeben:

`ufw allow 443/tcp`

Status prüfen:

`ufw status`

Wenn UFW noch nicht aktiviert ist, kannst du sie aktivieren:

`ufw enable`

**Wichtig:** Stelle sicher, dass SSH erlaubt ist, bevor du die Firewall aktivierst. Sonst kannst du dich möglicherweise nicht mehr per SSH verbinden.

SSH erlauben:

`ufw allow 22/tcp`

### Webverzeichnis verstehen

Webseiten-Dateien liegen häufig unter:

`/var/www/`

Bei Apache ist das Standardverzeichnis oft:

`/var/www/html`

Bei Nginx ebenfalls häufig:

`/var/www/html`

Wenn du eine eigene Webseite betreiben möchtest, kannst du für jede Domain ein eigenes Verzeichnis anlegen.

Beispiel:

`/var/www/deinedomain.de`

Verzeichnis erstellen:

`mkdir -p /var/www/deinedomain.de`

Eine einfache Testdatei erstellen:

`nano /var/www/deinedomain.de/index.html`

Beispielinhalt:

`Meine Webseite funktioniert.`

### Rechte für Webdateien setzen

Die Dateien sollten vom Webserver gelesen werden können.

Für einfache Webseiten kannst du häufig folgende Rechte verwenden:

`chown -R www-data:www-data /var/www/deinedomain.de`

`find /var/www/deinedomain.de -type d -exec chmod 755 {} \;`

`find /var/www/deinedomain.de -type f -exec chmod 644 {} \;`

`www-data` ist auf Debian und Ubuntu der typische Benutzer, unter dem Apache oder Nginx laufen.

### Domain auf den Server zeigen lassen

Damit deine Webseite über eine Domain erreichbar ist, muss die Domain auf die IP-Adresse deines KVM-Servers zeigen.

Dafür wird im DNS ein A-Record gesetzt.

Beispiel:

| Typ | Name  | Ziel              |
| --- | ----- | ----------------- |
| A   | `@`   | `123.123.123.123` |
| A   | `www` | `123.123.123.123` |

Wenn du IPv6 nutzt, kannst du zusätzlich einen AAAA-Record setzen.

| Typ  | Name  | Ziel                        |
| ---- | ----- | --------------------------- |
| AAAA | `@`   | IPv6-Adresse deines Servers |
| AAAA | `www` | IPv6-Adresse deines Servers |

DNS-Änderungen sind nicht immer sofort aktiv. Es kann einige Minuten bis mehrere Stunden dauern, bis die Änderung überall übernommen wurde.

### Apache Virtual Host einrichten

Ein Virtual Host legt fest, welche Webseite für welche Domain ausgeliefert wird.

Erstelle eine neue Konfigurationsdatei:

`nano /etc/apache2/sites-available/deinedomain.de.conf`

Beispielkonfiguration:

`<VirtualHost *:80> ServerName deinedomain.de ServerAlias www.deinedomain.de DocumentRoot /var/www/deinedomain.de ErrorLog ${APACHE_LOG_DIR}/deinedomain_error.log CustomLog ${APACHE_LOG_DIR}/deinedomain_access.log combined </VirtualHost>`

Aktiviere die Webseite:

`a2ensite deinedomain.de.conf`

Deaktiviere optional die Standardseite:

`a2dissite 000-default.conf`

Konfiguration prüfen:

`apache2ctl configtest`

Apache neu laden:

`systemctl reload apache2`

### Nginx Server Block einrichten

Bei Nginx heißt die Domain-Konfiguration meist Server Block.

Erstelle eine neue Konfigurationsdatei:

`nano /etc/nginx/sites-available/deinedomain.de`

Beispielkonfiguration:

`server { listen 80; server_name deinedomain.de www.deinedomain.de; root /var/www/deinedomain.de; index index.html index.htm; location / { try_files $uri $uri/ =404; } }`

Aktiviere die Webseite:

`ln -s /etc/nginx/sites-available/deinedomain.de /etc/nginx/sites-enabled/`

Konfiguration prüfen:

`nginx -t`

Nginx neu laden:

`systemctl reload nginx`

### PHP installieren

Viele Webseiten und Anwendungen benötigen PHP. Das gilt zum Beispiel für WordPress, viele CMS-Systeme und ältere Webanwendungen.

PHP für Apache installieren:

`apt install php libapache2-mod-php`

Apache neu starten:

`systemctl restart apache2`

PHP für Nginx installieren:

`apt install php-fpm`

Nginx muss danach so konfiguriert werden, dass PHP-Anfragen an PHP-FPM weitergegeben werden.

### Datenbank installieren

Viele Webanwendungen benötigen eine Datenbank.

Häufig wird MariaDB verwendet.

MariaDB installieren:

`apt install mariadb-server`

Dienst starten:

`systemctl start mariadb`

Dienst beim Systemstart aktivieren:

`systemctl enable mariadb`

Sicherheitsassistent starten:

`mysql_secure_installation`

Mit MariaDB verbinden:

`mysql`

### SSL-Zertifikat mit Let's Encrypt einrichten

Für Webseiten solltest du HTTPS verwenden.

HTTPS schützt die Verbindung zwischen Besucher und Webseite.

Für kostenlose SSL-Zertifikate kannst du Let's Encrypt mit Certbot verwenden.

Certbot installieren:

`apt install certbot`

Für Apache:

`apt install python3-certbot-apache`

Zertifikat für Apache einrichten:

`certbot --apache`

Für Nginx:

`apt install python3-certbot-nginx`

Zertifikat für Nginx einrichten:

`certbot --nginx`

Folge danach den Anweisungen im Terminal.

### Automatische Zertifikatserneuerung prüfen

Let's Encrypt Zertifikate laufen regelmäßig ab und müssen erneuert werden.

Certbot richtet normalerweise eine automatische Erneuerung ein.

Du kannst die Erneuerung testen:

`certbot renew --dry-run`

Wenn dieser Test erfolgreich ist, sollte die automatische Erneuerung funktionieren.

### Logs prüfen

Wenn deine Webseite nicht funktioniert, sind Logs sehr wichtig.

Apache Logs:

`/var/log/apache2/access.log`

`/var/log/apache2/error.log`

Nginx Logs:

`/var/log/nginx/access.log`

`/var/log/nginx/error.log`

Logs live anzeigen:

`tail -f /var/log/apache2/error.log`

oder:

`tail -f /var/log/nginx/error.log`

### Häufige Probleme

#### Webseite ist nicht erreichbar

Prüfe:

* läuft Apache oder Nginx?
* zeigt die Domain auf die richtige IP-Adresse?
* sind Port `80` und `443` geöffnet?
* blockiert die Firewall?
* ist die Webserver-Konfiguration korrekt?
* ist der Server grundsätzlich erreichbar?

Status prüfen:

`systemctl status apache2`

oder:

`systemctl status nginx`

#### Port 80 ist bereits belegt

Wenn Apache oder Nginx nicht startet, kann Port `80` bereits von einem anderen Dienst genutzt werden.

Prüfen:

`ss -tulpen`

Typische Ursache:

* Apache läuft bereits
* Nginx läuft bereits
* ein anderes Panel nutzt Port `80`
* ein Docker-Container nutzt Port `80`

#### 403 Forbidden

Die Meldung `403 Forbidden` bedeutet, dass der Webserver die Anfrage verstanden hat, aber keinen Zugriff auf die Dateien erlaubt.

Mögliche Ursachen:

* falsche Dateirechte
* falscher Besitzer
* fehlende Index-Datei
* falsches Webverzeichnis
* Zugriff durch Konfiguration blockiert

Prüfe, ob eine Datei wie `index.html` oder `index.php` im Webverzeichnis liegt.

#### 404 Not Found

Die Meldung `404 Not Found` bedeutet, dass die angeforderte Seite nicht gefunden wurde.

Mögliche Ursachen:

* Datei existiert nicht
* falscher DocumentRoot
* falscher Pfad
* Rewrite-Regeln fehlen
* Domain zeigt auf falsche Webseite

#### 502 Bad Gateway

Die Meldung `502 Bad Gateway` tritt häufig bei Nginx in Verbindung mit PHP-FPM oder Reverse Proxy auf.

Mögliche Ursachen:

* PHP-FPM läuft nicht
* falscher Socket oder Port
* Anwendung ist abgestürzt
* Backend-Dienst ist nicht erreichbar

PHP-FPM Status prüfen:

`systemctl status php*-fpm`

#### SSL funktioniert nicht

Prüfe:

* zeigt die Domain bereits auf den Server?
* sind Port `80` und `443` geöffnet?
* ist Certbot erfolgreich durchgelaufen?
* ist die Webserver-Konfiguration gültig?
* wurde der Webserver neu geladen?

Apache prüfen:

`apache2ctl configtest`

Nginx prüfen:

`nginx -t`

### Sicherheit nach der Installation

Nach der Installation solltest du einige grundlegende Sicherheitsmaßnahmen umsetzen:

* System regelmäßig aktualisieren
* nur benötigte Ports öffnen
* HTTPS aktivieren
* sichere Passwörter verwenden
* Dateirechte prüfen
* nicht benötigte Standardseiten entfernen
* Webanwendungen aktuell halten
* Backups erstellen
* Logs regelmäßig prüfen

Wenn du WordPress oder ein anderes CMS nutzt, halte auch Plugins, Themes und Erweiterungen aktuell.

### Support kontaktieren

Wenn dein Webserver nicht funktioniert, kontaktiere den Support mit möglichst genauen Angaben.

Hilfreich sind:

* Betriebssystem
* verwendeter Webserver: Apache oder Nginx
* Domain
* Server-IP
* genaue Fehlermeldung
* Auszug aus den Logs
* welche Schritte du bereits durchgeführt hast
* ob die Webseite über IP-Adresse erreichbar ist
* ob die Domain bereits auf den Server zeigt

Sende niemals Passwörter, private SSH-Keys oder andere geheime Zugangsdaten an den Support.
