Tutorials  /  Linux Basics

Mehrere Webseiten mit Nginx & PHP-FPM auf Ubuntu 20.04

Ccentron Redaktion · Juli 2025 ·6 Min. Lesezeit ·Linux Basics, Tutorial

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.
VM

Passende Infrastruktur bei centron

Zum Ausprobieren braucht es keine eigene Hardware: ccloud³ VMs mit vollem Root-Zugriff gibt es ab 3,12 € im Monat, stundengenau abgerechnet und in Sekunden bereit. Cloud Server mieten →

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:

Konsole
$ 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:

Konsole
$ 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:

Konsole
$ 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:

Konsole
$ 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:

Konsole
$ 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:

Konsole
$ 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:

Konsole
$ sudo service php7.4-fpm restart

Anschließend den Status des Dienstes überprüfen, um sicherzustellen, dass beide Pools aktiv sind:

Konsole
$ sudo service php7.4-fpm status

Die Ausgabe sollte prozessspezifische Einträge für die einzelnen Pools enthalten, ähnlich wie:

Code
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:

Konsole
$ sudo nano /etc/nginx/sites-available/site1

Folgende Inhalte einfügen:

Code
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:

Konsole
$ sudo nano /etc/nginx/sites-available/site2

Diese Konfiguration einfügen:

Code
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:

Konsole
$ 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:

Konsole
$ 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:

Konsole
$ nano /var/www/site1/index.php

Folgenden Inhalt einfügen:

PHP
<?php
phpinfo();

PHP-Info-Datei für site2

Gleiche Vorgehensweise für site2:

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

Den gleichen Code einfügen:

PHP
<?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.

Jetzt 200 € Guthaben sichern

Testen Sie Ihr Setup auf ccloud³

Registrieren Sie sich in der ccloud³ und erhalten Sie 200 € Startguthaben für Ihr Projekt – z. B. für eine PostgreSQL-VM mit automatischen Backups.

centron Redaktion Technische Redaktion

Das Redaktionsteam von centron schreibt Anleitungen aus dem Betriebsalltag: getestet auf unserer eigenen Plattform, betrieben im Rechenzentrum in Hallstadt bei Bamberg.

Kategorie Linux Basics
Teilen
Noch offene Fragen?

Our team will help you with your specific setup - in German or English, by people who run the platform themselves.

War dieses Tutorial hilfreich?

Your answer is stored anonymously and helps us improve our tutorials.

Kommentare

No comments yet - be the first to ask a question about this tutorial.

Sign in to comment

Comments are open to centron customers. Sign in to your account to ask a question about this tutorial.

Weiterlesen

Das könnte Sie auch interessieren

Jetzt kostenlos anfangen

Melden Sie sich an und erhalten Sie in den ersten 60 Tagen ein Guthaben von 200 € bei centron.

Dieses Werbeangebot gilt nur für neue Konten. Angebot ausschließlich für Gewerbetreibende.

Jetzt loslegen Sales kontaktieren