nginx mit PHP-FPM ist eine schnelle und ressourcenschonende Grundlage für PHP-Anwendungen wie WordPress, Laravel oder Nextcloud. In dieser Anleitung richten Sie auf einem Debian- oder Ubuntu-Server nginx und PHP-FPM ein, legen eine Website an und sichern sie mit einem kostenlosen SSL-Zertifikat ab.

Voraussetzungen

  • Ein vServer mit Debian 12/13 oder Ubuntu 22.04/24.04
  • Eine Domain, deren A- und AAAA-Eintrag auf die IP-Adressen des Servers zeigen
  • Die Ports 80 und 443 sind in der Firewall freigegeben

Schritt 1: nginx und PHP installieren

sudo apt update
sudo apt install -y nginx php-fpm php-cli php-mysql php-curl php-gd php-intl php-mbstring php-xml php-zip

Die installierte PHP-Version hängt von Ihrer Distribution ab: Debian 12 bringt PHP 8.2 mit, Debian 13 PHP 8.4, Ubuntu 24.04 PHP 8.3. Prüfen Sie die Version und den Namen des PHP-FPM-Dienstes:

php -v
systemctl list-units 'php*-fpm*'

In den folgenden Beispielen verwenden wir PHP 8.4. Ersetzen Sie die Versionsnummer gegebenenfalls durch Ihre.

Schritt 2: Verzeichnis für die Website anlegen

sudo mkdir -p /var/www/ihre-domain.at/public
sudo chown -R www-data:www-data /var/www/ihre-domain.at
echo '<?php echo "PHP läuft: " . PHP_VERSION;' | sudo tee /var/www/ihre-domain.at/public/index.php

Schritt 3: nginx-Konfiguration erstellen

Erstellen Sie die Datei /etc/nginx/sites-available/ihre-domain.at:

server {
    listen 80;
    listen [::]:80;
    server_name ihre-domain.at www.ihre-domain.at;

    root /var/www/ihre-domain.at/public;
    index index.php index.html;

    access_log /var/log/nginx/ihre-domain.at.access.log;
    error_log  /var/log/nginx/ihre-domain.at.error.log;

    client_max_body_size 64M;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.4-fpm.sock;
    }

    location ~ /\.(?!well-known) {
        deny all;
    }
}

Die letzte Regel blockiert versteckte Dateien wie .env oder .git, erlaubt aber das Verzeichnis .well-known, das für SSL-Zertifikate benötigt wird.

Aktivieren Sie die Website, prüfen Sie die Konfiguration und laden Sie nginx neu:

sudo ln -s /etc/nginx/sites-available/ihre-domain.at /etc/nginx/sites-enabled/
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx

Rufen Sie http://ihre-domain.at auf. Es sollte „PHP läuft“ mit der Versionsnummer erscheinen.

Schritt 4: SSL-Zertifikat mit Certbot

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d ihre-domain.at -d www.ihre-domain.at

Certbot fragt nach einer E-Mail-Adresse, stellt das Zertifikat aus, ergänzt die nginx-Konfiguration und richtet eine Weiterleitung von HTTP auf HTTPS ein. Die automatische Verlängerung läuft über einen systemd-Timer. Testen Sie sie mit:

sudo certbot renew --dry-run

Schritt 5: PHP-Einstellungen anpassen

Die Einstellungen für PHP-FPM liegen in /etc/php/8.4/fpm/php.ini. Legen Sie eigene Werte besser in einer zusätzlichen Datei ab, damit sie bei Updates erhalten bleiben:

sudo tee /etc/php/8.4/fpm/conf.d/99-custom.ini > /dev/null <<'EOF'
memory_limit = 256M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 120
date.timezone = Europe/Vienna
expose_php = Off
EOF
sudo systemctl restart php8.4-fpm

Achten Sie darauf, dass client_max_body_size in nginx mindestens so groß ist wie upload_max_filesize.

Schritt 6: OPcache prüfen

OPcache speichert übersetzten PHP-Code im Arbeitsspeicher und beschleunigt Anwendungen erheblich. Er ist bei Debian und Ubuntu standardmäßig aktiv. Prüfen Sie das mit:

php-fpm8.4 -i | grep -i "opcache.enable "

Mehrere Websites

Für jede weitere Website legen Sie ein eigenes Verzeichnis und eine eigene Datei in sites-available an. Für eine stärkere Trennung können Sie jeder Website einen eigenen PHP-FPM-Pool mit eigenem Benutzer geben. Kopieren Sie dazu /etc/php/8.4/fpm/pool.d/www.conf, passen Sie Name, Benutzer und Socket an und verwenden Sie den neuen Socket in der nginx-Konfiguration.

Fehlerbehebung

„502 Bad Gateway“

nginx erreicht PHP-FPM nicht. Prüfen Sie, ob der Dienst läuft (systemctl status php8.4-fpm) und ob der Socket-Pfad in der nginx-Konfiguration mit ls /run/php/ übereinstimmt.

PHP-Dateien werden heruntergeladen statt ausgeführt

Der location ~ \.php$-Block fehlt oder wird nicht verwendet. Prüfen Sie die Konfiguration mit sudo nginx -T | less.

„413 Request Entity Too Large“

Erhöhen Sie client_max_body_size in der nginx-Konfiguration und laden Sie nginx neu.

Wo finde ich Fehlermeldungen?

sudo tail -f /var/log/nginx/ihre-domain.at.error.log
sudo journalctl -u php8.4-fpm -f

Für die Datenbank lesen Sie weiter im Artikel MariaDB installieren und absichern. Einen passenden Server finden Sie bei unseren vServern.

War diese Antwort hilfreich? 0 Benutzer fanden dies hilfreich (0 Stimmen)