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 und site2.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 in user = site1.
  • group = www-data ersetzen durch group = site1.
  • listen = /var/run/php/php7.4-fpm.sock anpassen auf listen = /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 auf user = site2 ändern.
  • group = www-data ersetzen durch group = site2.
  • listen = /var/run/php/php7.4-fpm.sock anpassen auf listen = /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-Info-Datei für site2

Gleiche Vorgehensweise für site2:

$ nano /var/www/site2/index.php

Den gleichen Code einfügen:

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.

Quelle: vultr.com

Jetzt 200€ Guthaben sichern

Registrieren Sie sich jetzt in unserer ccloud³ und erhalten Sie 200€ Startguthaben für Ihr Projekt.

Das könnte Sie auch interessieren:

Moderne Hosting Services mit Cloud Server, Managed Server und skalierbarem Cloud Hosting für professionelle IT-Infrastrukturen

Jenkins auf Ubuntu mit Docker Compose installieren

Docker, Tutorial
Jenkins auf einem Ubuntu-Server mit Docker Compose installieren Jenkins ist eine beliebte Open-Source-Anwendung, die in Java entwickelt wurde und sich hervorragend zur Einrichtung von Continuous Integration und Continuous Deployment (CI/CD)-Pipelines…