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.
