Separate PHP-FPM-Pools für mehrere Websites mit Nginx unter Ubuntu 20.04 konfigurieren
Dank moderner Serverarchitekturen, die mehr Leistung und Effizienz bieten, ist das Hosten mehrerer Webseiten unter einer einzelnen Nginx-Instanz heutzutage eine verbreitete und zuverlässige Praxis. Um eine hohe Performance, konsequente Trennung und verbesserte Sicherheit zu gewährleisten, sollte jede Website über einen eigenen PHP-FPM-Pool verfügen. In dieser Anleitung wird gezeigt, wie sich unter Ubuntu 20.04 LTS mit PHP 7.4 und Nginx separate PHP-FPM-Pools konfigurieren lassen, damit mehrere virtuelle Hosts sicher auf einem Server betrieben werden können.
Systemvoraussetzungen
- Ein Benutzerkonto mit sudo-Rechten (kein Root-Konto) erstellen.
- Das Ubuntu-System auf den neuesten Stand bringen.
- Eine vollständige LEMP-Installation auf Ubuntu 20.04 LTS vornehmen.
- Zwei A-DNS-Einträge auf dieselbe Server-IP mit unterschiedlichen Subdomains setzen, etwa
site1.example.com
undsite2.example.com
.
Schritt 1: Standardkonfiguration von Nginx entfernen
Standardmäßig liefert Nginx eine voreingestellte virtuelle Host-Konfiguration mit. Da diese nicht benötigt wird, sollte sie über ein Benutzerkonto mit sudo-Rechten entfernt werden:
$ sudo rm /etc/nginx/sites-enabled/default
Schritt 2: Isolierte Benutzer für jede Website erstellen
Aus Sicherheitsgründen empfiehlt es sich, für jede Website einen eigenen Systembenutzer ohne Login-Zugriff einzurichten. Der Webserver-Benutzer wird anschließend zur jeweiligen Benutzergruppe hinzugefügt:
$ sudo useradd site1
$ sudo useradd site2
$ usermod -a -G site1 www-data
$ usermod -a -G site2 www-data
Schritt 3: Verzeichnisse anlegen und Berechtigungen setzen
Nun werden die Verzeichnisse für beide Webseiten erstellt und die Zugriffsrechte so gesetzt, dass jede Umgebung sicher voneinander getrennt bleibt:
$ sudo mkdir /var/www/site1
$ sudo chown -R site1:site1 /var/www/site1
$ sudo mkdir /var/www/site2
$ sudo chown -R site2:site2 /var/www/site2
$ sudo chmod 770 /var/www/site2
Die Berechtigungen (770) gewähren dem Eigentümer und der Gruppe vollständigen Zugriff, während allen anderen der Zugang verweigert wird. So bleibt die Sicherheit jeder Seite gewährleistet.
Schritt 4: PHP-FPM-Pool-Konfigurationen kopieren
Als Ausgangspunkt dient die Standardkonfiguration, die für jede Seite dupliziert wird. Danach kann die ursprüngliche Datei gelöscht werden:
$ sudo cp /etc/php/7.4/fpm/pool.d/www.conf /etc/php/7.4/fpm/pool.d/fpm-site1.conf
$ sudo cp /etc/php/7.4/fpm/pool.d/www.conf /etc/php/7.4/fpm/pool.d/fpm-site2.conf
$ sudo rm /etc/php/7.4/fpm/pool.d/www.conf
Schritt 5: PHP-FPM-Einstellungen für site1 anpassen
Die Konfigurationsdatei für site1 öffnet sich und vier zentrale Direktiven angepasst:
$ sudo nano /etc/php/7.4/fpm/pool.d/fpm-site1.conf
[www]
durch[site1]
ersetzen.user = www-data
ändern inuser = site1
.group = www-data
ersetzen durchgroup = site1
.listen = /var/run/php/php7.4-fpm.sock
anpassen auflisten = /var/run/php/php7.4-site1-fpm.sock
.
Schritt 6: PHP-FPM-Einstellungen für site2 anpassen
Die oben genannten Anpassungen werden nun für site2 wiederholt:
$ sudo nano /etc/php/7.4/fpm/pool.d/fpm-site2.conf
[www]
durch[site2]
ersetzen.user = www-data
aufuser = site2
ändern.group = www-data
ersetzen durchgroup = site2
.listen = /var/run/php/php7.4-fpm.sock
anpassen auflisten = /var/run/php/php7.4-site2-fpm.sock
.
Schritt 7: PHP-FPM neu starten, um Konfigurationen zu übernehmen
Damit die neu erstellten Pool-Dateien ladbar ist, muss man den PHP-FPM-Dienst neu starten:
$ sudo service php7.4-fpm restart
Anschließend den Status des Dienstes überprüfen, um sicherzustellen, dass beide Pools aktiv sind:
$ sudo service php7.4-fpm status
Die Ausgabe sollte prozessspezifische Einträge für die einzelnen Pools enthalten, ähnlich wie:
CGroup: /system.slice/php7.4-fpm.service
├─70796 php-fpm: master process (/etc/php/7.4/fpm/php-fpm.conf)
├─70807 php-fpm: pool site1
├─70808 php-fpm: pool site1
├─70809 php-fpm: pool site2
└─70810 php-fpm: pool site2
Hinweis: Die hier gezeigten Prozess-IDs sind beispielhaft und variieren je nach Systemstatus.
Schritt 8: Nginx für eigene PHP-FPM-Pools konfigurieren
Für jede Domain ist ein separater virtueller Host definiert, der auf den passenden PHP-FPM-Socket verweist.
site1: Server-Block in Nginx anlegen
Ein neues Konfigurationsfile für site1 erstellen:
$ sudo nano /etc/nginx/sites-available/site1
Folgende Inhalte einfügen:
server {
server_name site1.example.com;
access_log /var/log/nginx/site1.access.log;
error_log /var/log/nginx/site1.error.log;
root /var/www/site1;
index index.php;
try_files $uri $uri/ /index.php?$query_string;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php7.4-fpm-site1.sock;
include snippets/fastcgi-php.conf;
}
}
Wichtige Konfigurationspunkte:
- server_name: Domainname der Seite.
- access_log: Protokolliert Seitenzugriffe.
- error_log: Speichert Fehlermeldungen.
- root: Verzeichnis der Website.
- fastcgi_pass: Verweist auf den PHP-FPM-Socket dieser Website.
site2: Server-Block in Nginx anlegen
Nun dieselben Schritte für site2 durchführen:
$ sudo nano /etc/nginx/sites-available/site2
Diese Konfiguration einfügen:
server {
server_name site2.example.com;
access_log /var/log/nginx/site2.access.log;
error_log /var/log/nginx/site2.error.log;
root /var/www/site2;
index index.php;
try_files $uri $uri/ /index.php?$query_string;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php7.4-fpm-site2.sock;
include snippets/fastcgi-php.conf;
}
}
Beide Server-Blöcke aktivieren
Erstellen von symbolischen Links in das sites-enabled-Verzeichnis, um die Konfigurationen zu aktivieren:
$ sudo ln -s /etc/nginx/sites-available/site1 /etc/nginx/sites-enabled/site1
$ sudo ln -s /etc/nginx/sites-available/site2 /etc/nginx/sites-enabled/site2
Anschließend Nginx neu laden, damit die Änderungen aktiv werden:
$ sudo service nginx restart
Schritt 9: Isolierung überprüfen und Konfiguration validieren
Um sicherzustellen, dass beide Seiten korrekt getrennt arbeiten, legt man in jeder Seite eine einfache PHP-Datei an, die Informationen zur PHP-Umgebung anzeigt.
PHP-Info-Datei für site1
Datei im Webverzeichnis von site1 anlegen:
$ nano /var/www/site1/index.php
Folgenden Inhalt einfügen:
<?php
phpinfo();
PHP-Info-Datei für site2
Gleiche Vorgehensweise für site2:
$ nano /var/www/site2/index.php
Den gleichen Code einfügen:
<?php
phpinfo();
Besuche nun im Browser http://site1.example.com
und http://site2.example.com
, um die Trennung zu prüfen. Im Abschnitt PHP Variables der PHP-Info-Seite sollte unter $_SERVER['USER']
jeweils site1
bzw. site2
angezeigt werden.
Fazit
Die Zuweisung eines eigenen PHP-FPM-Pools pro Website erhöht die Sicherheit, verbessert die Leistung und erleichtert sowohl die Fehleranalyse als auch die Ressourcenkontrolle. Die Konfiguration erfolgt über Dateien im Verzeichnis /etc/php/7.4/fpm/pool.d
. Ein besonders häufig modifizierter Parameter ist pm
, der das Verhalten bei der Verwaltung von Kindprozessen regelt. Abhängig von den Anforderungen kann dieser auf dynamic, static oder ondemand setzen. Für detaillierte Informationen zu allen verfügbaren Optionen empfiehlt sich ein Blick in die offizielle Dokumentation zu PHP-FPM.