> Die vollständige Liste der Artikel steht in [llms.txt](https://docs.f3cloud.com/llms.txt). Jede Seite gibt es auch als Markdown, dazu einfach .md an die Adresse anhängen. Diese Seite als Markdown: [https://docs.f3cloud.com/de/software-setup/nginx-installation.md](https://docs.f3cloud.com/de/software-setup/nginx-installation.md).

# Nginx mit PHP-FPM und SSL auf Ubuntu und Debian installieren

So installieren Sie Nginx auf einem VPS mit Ubuntu oder Debian, legen eine Website an und binden PHP-FPM sowie ein kostenloses SSL-Zertifikat von Let's Encrypt ein. Konfiguration prüfen, Fehler 502, 403 und 413 beheben und Nginx entfernen.

**Nginx** ist ein schneller Webserver, auf dem ein großer Teil aller Websites im Internet läuft. Er liefert Seiten und Dateien an Besucher aus, übergibt PHP-Skripte zur Ausführung und verschlüsselt die Verbindung per HTTPS.

In dieser Anleitung installieren wir Nginx, legen eine Website an, binden PHP ein und stellen ein kostenloses SSL-Zertifikat aus. Alle Befehle haben wir unter Debian 12 getestet, unter Ubuntu funktionieren sie genauso.

> **Was Sie brauchen.**
>
> Zunächst benötigen Sie einen VPS mit Ubuntu oder Debian und SSH-Zugang dazu, zum Beispiel über [Termius](https://docs.f3cloud.com/de/vps/termius-connection.md). Für HTTPS brauchen Sie außerdem eine Domain, deren A-Record auf die IP-Adresse des Servers zeigt.

***

### 1. Nginx installieren

```bash
# Paketliste aktualisieren und Nginx installieren
apt update && apt install -y nginx

# Prüfen, ob Nginx gestartet ist
systemctl status nginx
```

Steht in der Zeile **Active** ein grünes `active (running)`, läuft Nginx und startet künftig nach jedem Neustart des Servers von selbst.

<figure><img src="https://docs.f3cloud.com/img/nginx-status.png" alt="Ausgabe von systemctl status nginx mit dem Status active (running)"><figcaption><p>Nginx ist installiert und läuft</p></figcaption></figure>

Öffnen Sie im Browser `http://IP-Adresse-des-Servers`. Es sollte die Startseite von Nginx erscheinen.

<figure><img src="https://docs.f3cloud.com/img/nginx-welcome.png" alt="Startseite Welcome to nginx" width="460"><figcaption><p>Die Startseite von Nginx</p></figcaption></figure>

> **Die Seite öffnet sich nicht?.**
>
> Wenn auf dem Server eine Firewall aktiv ist, geben Sie darin die Ports **80** und **443** frei. Wie das geht, zeigen wir im Artikel [über die Firewall](https://docs.f3cloud.com/de/client-area/protect-vps-from-unauthorised-access/firewall.md).

***

### 2. Ordner für die Website anlegen

Die Dateien jeder Website bewahren Sie am besten in einem eigenen Ordner unter `/var/www` auf. Wir legen einen Ordner und eine einfache Testseite an. Ersetzen Sie `example.com` hier und im Folgenden durch Ihre eigene Domain.

```bash
# Ordner für die Dateien der Website anlegen
mkdir -p /var/www/example.com

# Testseite hineinlegen
echo '<h1>Die Website funktioniert!</h1>' > /var/www/example.com/index.html

# Ordner dem Benutzer www-data übergeben, unter dem Nginx läuft
chown -R www-data:www-data /var/www/example.com
```

***

### 3. Website in Nginx einrichten

Die Einstellungen der Websites liegen im Ordner `/etc/nginx/sites-available`. Legen Sie dort eine Datei für Ihre Website an.

```bash
nano /etc/nginx/sites-available/example.com
```

Fügen Sie die folgenden Einstellungen ein und ersetzen Sie die Domain durch Ihre eigene. Speichern können Sie die Datei in nano mit <kbd>Ctrl</kbd> + <kbd>O</kbd> und <kbd>Enter</kbd>.\
Den Editor verlassen Sie mit <kbd>Ctrl</kbd> + <kbd>X</kbd>.

```nginx
server {
    # Normale HTTP-Anfragen über IPv4 und IPv6 annehmen
    listen 80;
    listen [::]:80;

    # Domain der Website, mit und ohne www
    server_name example.com www.example.com;

    # Ordner mit den Dateien der Website und die Startseite
    root /var/www/example.com;
    index index.html index.php;

    # Eigene Logs für diese Website
    access_log /var/log/nginx/example.com-access.log;
    error_log  /var/log/nginx/example.com-error.log;

    # Maximale Größe einer Datei, die auf die Website hochgeladen werden kann
    client_max_body_size 100M;

    location / {
        # Datei oder Ordner ausliefern, sonst Fehler 404
        try_files $uri $uri/ =404;
    }
}
```

Eine Datei in `sites-available` wirkt für sich allein noch nicht. Nginx liest nur den Ordner `sites-enabled`, deshalb aktivieren Sie die Website mit einem Link auf die Datei. Deaktivieren Sie dabei gleich die Standardseite von Nginx, damit unter der IP-Adresse Ihre eigene Website erscheint.

```bash
# Unsere Website aktivieren
ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

# Standardseite mit der Startseite deaktivieren
rm /etc/nginx/sites-enabled/default

# Einstellungen auf Fehler prüfen
nginx -t
```

Meldet `nginx -t` die Zeilen `syntax is ok` und `test is successful`, ist alles fehlerfrei.

<figure><img src="https://docs.f3cloud.com/img/nginx-test.png" alt="Erfolgreiche Prüfung der Konfiguration mit nginx -t"><figcaption><p>Die Prüfung der Einstellungen war erfolgreich</p></figcaption></figure>

Übernehmen Sie die Einstellungen. Der Befehl `reload` liest die Konfiguration neu ein, ohne die Website anzuhalten.

```bash
systemctl reload nginx
```

Unter der Adresse des Servers öffnet sich jetzt Ihre Seite mit dem Text „Die Website funktioniert!“.

> **Prüfen Sie die Einstellungen immer vor dem Neuladen.**
>
> Gewöhnen Sie sich an, nach jeder Änderung der Konfiguration `nginx -t` auszuführen. Enthält die Datei einen Fehler, kann Nginx nicht neu starten, und die Website ist nicht mehr erreichbar.

***

### 4. PHP einbinden

Für Websites auf PHP-Basis, etwa WordPress, installieren Sie **PHP-FPM**. Dieser Dienst führt PHP-Skripte aus, sobald Nginx sie anfordert.

```bash
# PHP-FPM installieren
apt install -y php-fpm

# PHP-Version anzeigen
php -v

# Nachsehen, wie die Datei für die Verbindung zu PHP heißt
ls /run/php/
```

<figure><img src="https://docs.f3cloud.com/img/nginx-php-fpm.png" alt="PHP-Version und Dateien im Ordner /run/php"><figcaption><p>PHP 8.2 ist installiert, die Verbindung läuft über php8.2-fpm.sock</p></figcaption></figure>

Unter Debian 12 wird PHP 8.2 installiert, auf aktuellen Ubuntu-Versionen ist die Version neuer. Merken Sie sich den Namen der Datei mit der Endung `.sock`, zum Beispiel `php8.2-fpm.sock`.

Öffnen Sie die Einstellungen der Website mit `nano /etc/nginx/sites-available/example.com` und fügen Sie vor der letzten schließenden Klammer `}` zwei Blöcke ein.

```nginx
    # PHP-Dateien zur Ausführung an PHP-FPM übergeben.
    # Tragen Sie den Namen der .sock-Datei ein, den der Befehl ls /run/php/ angezeigt hat
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
    }

    # Zugriff auf die Systemdateien .htaccess sperren
    location ~ /\.ht {
        deny all;
    }
```

Prüfen Sie die Einstellungen und übernehmen Sie sie.

```bash
nginx -t && systemctl reload nginx
```

Um sicherzugehen, dass PHP funktioniert, legen Sie eine Testdatei an.

```bash
# Seite mit Informationen über PHP anlegen
echo '<?php phpinfo();' > /var/www/example.com/info.php
```

Öffnen Sie `http://IP-Adresse-des-Servers/info.php`. Es sollte eine Seite mit der PHP-Version erscheinen, und in der Zeile **Server API** steht `FPM/FastCGI`.

<figure><img src="https://docs.f3cloud.com/img/nginx-phpinfo.png" alt="Seite phpinfo mit PHP-Version 8.2"><figcaption><p>PHP läuft über PHP-FPM</p></figcaption></figure>

> **Löschen Sie die Testdatei.**
>
> Die Seite `info.php` zeigt Details über den Server, die nicht öffentlich zugänglich bleiben sollten. Löschen Sie sie nach der Prüfung mit dem Befehl `rm /var/www/example.com/info.php`.

Die meisten Websites benötigen zusätzliche PHP-Module. Für WordPress installieren Sie zum Beispiel diese.

```bash
# Module für MySQL-Datenbanken, Bilder, Archive und Anfragen
apt install -y php-mysql php-curl php-gd php-mbstring php-xml php-zip

# PHP-FPM neu starten, damit die Module geladen werden
systemctl restart php8.2-fpm
```

***

### 5. SSL-Zertifikat einbinden

Das kostenlose Zertifikat von Let's Encrypt stellt das Programm **Certbot** aus. Vergewissern Sie sich vorher, dass der A-Record der Domain bereits auf die IP-Adresse des Servers zeigt und die Website über die Domain per `http://` erreichbar ist.

```bash
# Certbot und sein Modul für Nginx installieren
apt install -y certbot python3-certbot-nginx

# Zertifikat für die Domain mit und ohne www ausstellen
certbot --nginx -d example.com -d www.example.com
```

Certbot fragt nach einer E-Mail-Adresse für Benachrichtigungen und bittet Sie, den Bedingungen von Let's Encrypt zuzustimmen. Danach stellt er das Zertifikat selbst aus, ergänzt die Einstellungen der Website um HTTPS und richtet die Weiterleitung von `http://` auf `https://` ein.

<figure><img src="https://docs.f3cloud.com/img/ssl-nginx-issue.png" alt="Erfolgreiche Ausstellung des Zertifikats mit certbot --nginx"><figcaption><p>Das Zertifikat ist ausgestellt und in Nginx eingebunden</p></figcaption></figure>

Zertifikate von Let's Encrypt gelten nur kurz, aber Sie müssen sie nicht von Hand verlängern. Certbot hat die automatische Verlängerung bereits eingerichtet, prüfen können Sie sie mit dem folgenden Befehl.

```bash
# Testweise Verlängerung, das Zertifikat bleibt dabei unverändert
certbot renew --dry-run
```

Mehr über das Ausstellen von Zertifikaten, auch für Apache, erfahren Sie in einem [eigenen Artikel](https://docs.f3cloud.com/de/software-setup/lets-encrypt-ssl-nginx-apache.md).

***

### Wenn auf dem Server Apache läuft

Nginx und Apache können nicht gleichzeitig auf Port 80 arbeiten. Prüfen Sie, welches Programm den Port belegt.

```bash
# Anzeigen, wer auf Port 80 lauscht
ss -tlnp | grep ':80 '
```

Steht in der Ausgabe `apache2` und Sie brauchen Apache nicht, stoppen und entfernen Sie ihn und starten Sie danach Nginx.

```bash
# Apache stoppen und samt Einstellungen entfernen
systemctl stop apache2
apt purge -y apache2

# Nginx starten
systemctl start nginx
```

***

### Nginx deinstallieren

```bash
# Nginx stoppen
systemctl stop nginx

# Nginx samt Einstellungen entfernen
apt purge -y nginx nginx-common

# Nicht mehr benötigte Pakete entfernen
apt autoremove -y
```

Die Dateien Ihrer Websites im Ordner `/var/www` bleiben dabei erhalten.

***

### Häufige Fragen

<details>

<summary>nginx -t meldet test failed</summary>

In den Einstellungen steckt ein Fehler, und Nginx zeigt Ihnen genau, wo. Die Meldung `invalid number of arguments in "root" directive in /etc/nginx/sites-enabled/example.com:7` bedeutet zum Beispiel, dass in Zeile 7 der Datei mit der Direktive `root` etwas nicht stimmt. Meistens fehlt ein Semikolon am Zeilenende oder es gibt eine geschweifte Klammer zu viel.

</details>

<details>

<summary>Statt der Website öffnet sich die Startseite von Nginx</summary>

Wahrscheinlich ist die Standardseite nicht deaktiviert, oder die Domain in `server_name` ist anders geschrieben, als Sie sie im Browser aufrufen. Prüfen Sie, dass im Ordner `/etc/nginx/sites-enabled` keine Datei `default` liegt, und führen Sie `nginx -t && systemctl reload nginx` aus.

</details>

<details>

<summary>Fehler 502 Bad Gateway</summary>

Nginx kann die Anfrage nicht an PHP-FPM weitergeben. Prüfen Sie mit `systemctl status php8.2-fpm`, ob der Dienst läuft, und vergleichen Sie den Dateinamen in `fastcgi_pass` mit der Ausgabe von `ls /run/php/`. Details zum Fehler finden Sie im Log der Website, zum Beispiel `/var/log/nginx/example.com-error.log`.

</details>

<details>

<summary>Fehler 403 Forbidden</summary>

Nginx hat die Startseite nicht gefunden oder kann die Dateien nicht lesen. Stellen Sie sicher, dass im Ordner der Website eine `index.html` oder `index.php` liegt, und setzen Sie die Rechte mit `chown -R www-data:www-data /var/www/example.com` zurück.

</details>

<details>

<summary>Fehler 413 Request Entity Too Large beim Hochladen einer Datei</summary>

Die Datei ist größer als erlaubt.\
Erhöhen Sie `client_max_body_size` in den Einstellungen der Website.\
Bei PHP-Websites erhöhen Sie außerdem `upload_max_filesize` und `post_max_size` in der Datei `/etc/php/8.2/fpm/php.ini`, denn standardmäßig sind dort nur 2 und 8 MB eingestellt. Starten Sie danach PHP-FPM und Nginx neu.

</details>

<details>

<summary>Der Browser lädt die PHP-Datei herunter, statt die Seite anzuzeigen</summary>

In den Einstellungen der Website fehlt der Block `location ~ \.php$`, oder Sie haben die Änderungen nicht übernommen. Fügen Sie den Block aus Schritt 4 hinzu und führen Sie `nginx -t && systemctl reload nginx` aus. Leeren Sie danach den Cache Ihres Browsers.

</details>

***

### Unsere Ressourcen

**Telegram-Kanal:** [https://t.me/f3cloud_news](https://t.me/f3cloud_news)\
**Hosting-Website:** [https://f3cloud.com](https://f3cloud.com/de)
