So installierst und nutzt du mit deinem Ubuntu-Webserver mehrere PHP-Versionen parallel. Ich zeige dir, wie ich das bei meinem Webserver-Projekt konfiguriert habe.
In diesem Teil geht es um die wichtigste Funktion des Webservers, nämlich die Verwendung von PHP.
Dieser Beitrag baut auf Teil 3 – Installation MariaDB und Freigaben auf.
Wir möchten gern, dass man mit unserem Apache-Webserver mehrere PHP-Versionen parallel nutzen kann. Dafür richten wir PHP nicht als Webservermodul ein, sondern als FPM-Dienst, was vom Webserver dann als Fast-CGI angesprochen wird. Das bedeutet also, dass alle installierten PHP-Versionen als Dienst laufen und wir ganz bequem über die .htaccess‑Datei die benötigte PHP-Version für das Webprojekt wählen können. Ähnlich, wie es auch bei vielen Webhostern möglich ist.
Warum mehrere PHP-Versionen?
PHP-Versionen sind nicht abwärtskompatibel: Ein WordPress-Plug-in, das für PHP 7.4 geschrieben wurde, kann unter PHP 8.3 Fehler erzeugen – und umgekehrt verlangt modernes Drupal PHP 8.2 oder höher. Auf einem eigenen Server kannst du mehrere PHP-Versionen parallel betreiben und jeder Webseite genau die Version zuweisen, die sie benötigt.
Was ist PHP-FPM?
PHP-FPM steht für FastCGI Process Manager. Es handelt sich um einen eigenständigen PHP-Prozess-Manager, der effizienter als das klassische mod_php ist. PHP-FPM läuft als separater Systemdienst und kommuniziert mit Apache über einen Unix-Socket. Jede PHP-Version hat ihren eigenen FPM-Dienst und Socket.
| Befehl / Option | Bedeutung |
| mod_php (alt) | PHP lief direkt im Apache-Prozess. Nachteil: Nur eine Version möglich, alle Benutzer teilen denselben PHP-Prozess. |
| PHP-FPM (modern) | PHP läuft als separater Dienst. Vorteil: Mehrere Versionen gleichzeitig, jede Webseite kann eigene PHP-Einstellungen haben, bessere Performance. |
| FastCGI | Protokoll zur Kommunikation zwischen Webserver (Apache) und der PHP-Anwendung. Schneller als klassisches CGI. |
| Unix-Socket | Eine Datei (/run/php/php8.3-fpm.sock) die als Kommunikationskanal dient. Schneller als TCP/IP für lokale Verbindungen. |
PHP-Paket-Quellen zufügen
In dem offiziellen Repository von Ubuntu ist leider nur eine PHP-Version verfügbar, und das auch nur als Server-Modul. Damit können wir unsere Funktionalität nicht realisieren.
Dazu müssen wir das beliebte und am weitesten verbreitete PPA (Personal Package Archive) für PHP unter Ubuntu und Debian zu unserem Repository hinzufügen. Das PPA wird von dem Debian-Entwickler Ondřej Surý betrieben und ermöglicht es, mehrere, aktuelle PHP-Versionen parallel auf einem System zu installieren und zu verwalten.
Mit folgendem Befehl fügen wir das Repository hinzu:
sudo add-apt-repository ppa:ondrej/php
Im Anschluss müssen wir alle Paket-Quellen neu einlesen:
sudo apt update
Zur Erläuterung:
| Befehl / Option | Bedeutung |
| add-apt-repository | Fügt eine externe Paket-Quelle (PPA) zu apt hinzu. Importiert automatisch den GPG‑Schlüssel für die Signaturprüfung. |
| ppa:ondrej/php | Ondrej Surys PHP-PPA. Enthält PHP 5.6 bis PHP 8.5 für Ubuntu. Sehr verbreitet und gut gepflegt. |
| -y | Beantwortet die Sicherheitsnachfrage automatisch mit Ja. |
PHP-Version installieren
Jetzt können wir anfangen, die benötigten PHP-Versionen zu installieren. Aktuell sind die Versionen PHP 5.6, PHP 7.4, PHP 8.0, PHP 8.1, PHP 8.2, PHP 8.3, PHP 8.4 und PHP 8.5 erhältlich. Offiziell supportet werden nur noch PHP 8.2 aufwärts.
Mit den nachfolgenden Befehlen installieren wir die jeweilige PHP-Version und die benötigten PHP-Module. Ich liste dir hier alle gängigen Versionen auf, sodass du dir einfach den Befehl für die von dir gewünschte Version heraussuchen und kopieren kannst.
Für PHP 8.1:
sudo apt install php8.1 libapache2-mod-php8.1 php8.1-apcu php8.1-bcmath php8.1-curl php8.1-fpm php8.1-gd php8.1-imagick php8.1-intl php8.1-mbstring php8.1-xml php8.1-xsl php8.1-yaml php8.1-zip php8.1-bz2 php8.1-cli php8.1-mysql php8.1-opcache php8.1-readline php8.1-soap
Für PHP 8.2:
sudo apt install php8.2 libapache2-mod-php8.2 php8.2-apcu php8.2-bcmath php8.2-curl php8.2-fpm php8.2-gd php8.2-imagick php8.2-intl php8.2-mbstring php8.2-xml php8.2-xsl php8.2-yaml php8.2-zip php8.2-bz2 php8.2-cli php8.2-mysql php8.2-opcache php8.2-readline php8.2-soap
Für PHP 8.3:
sudo apt install php8.3 libapache2-mod-php8.3 php8.3-apcu php8.3-bcmath php8.3-curl php8.3-fpm php8.3-gd php8.3-imagick php8.3-intl php8.3-mbstring php8.3-xml php8.3-xsl php8.3-yaml php8.3-zip php8.3-bz2 php8.3-cli php8.3-mysql php8.3-opcache php8.3-readline php8.3-soap
Für PHP 8.4:
sudo apt install php8.4 libapache2-mod-php8.4 php8.4-apcu php8.4-bcmath php8.4-curl php8.4-fpm php8.4-gd php8.4-imagick php8.4-intl php8.4-mbstring php8.4-xml php8.4-xsl php8.4-yaml php8.4-zip php8.4-bz2 php8.4-cli php8.4-mysql php8.4-opcache php8.4-readline php8.4-soap
Wer die Version 8.5, 7.4 oder 5.6 haben möchte, kann sich die Modulnamen für die Installation selbst anpassen.
Zur Erläuterung:
| Befehl/Option | Bedeutung |
| php8.3-fpm | Der PHP-FPM-Daemon für PHP 8.3. Läuft als separater Dienst auf dem System. |
| php8.3-cli | PHP als Kommandozeilen-Tool. Nötig für Composer, Artisan (Laravel), WP-CLI usw. |
| php8.3-mysql | PDO- und MySQLi-Erweiterungen für die Datenbankverbindung. Ohne dieses Paket kann PHP nicht mit MariaDB kommunizieren! |
| php8.3-curl | cURL-Erweiterung. Nötig für HTTP-Anfragen aus PHP heraus, z. B. API‑Aufrufe, Webhooks. |
| php8.3-gd | GD-Grafikbibliothek. Nötig für Bildbearbeitung: Thumbnails erstellen, Wasserzeichen, Bildgroesse aendern. |
| php8.3-mbstring | Multibyte-String-Funktionen. Pflicht für alle Anwendungen, die Unicode-Text (Umlaute, Emoji) verarbeiten. |
| php8.3-xml | XML-Verarbeitung und DOM-Manipulation. Nötig für viele Frameworks und Dateiimporte. |
| php8.3-zip | ZIP-Archiv-Unterstützung. Nötig z. B. für WordPress-Updates und Plugin-Installationen. |
| php8.3-intl | Internationalisierung. Stellt Sprachformatierungen, Kollationen und Locale-Funktionen bereit. |
| php8.3-bcmath | Mathematik mit beliebiger Präzision. Nötig für Finanzberechnungen (Runden ohne Gleitkomma-Fehler). |
| php8.3-opcache | Kompiliert PHP-Code in Bytecode und speichert ihn im RAM. Beschleunigt PHP um den Faktor 2-10x! |
Jetzt lassen wir uns erst einmal alle geladenen Dienste anzeigen, um zu sehen, ob unsere installierten PHP‑FPM‑Versionen als Dienst schon laufen.
systemctl list-units --type=service --state=running
Alle installierten PHP-FPM-Versionen laufen schon als Dienste. Das ist schon mal gut.

PHP als FastCGI laden
Nach der Installation der ersten PHP-Version ist PHP als Modul geladen. Das wollen wir natürlich nicht, weshalb wir das jetzt erst mal ändern.
Als Erstes lassen wir uns zum Test eine PHP-Info-Datei im Browser ausgeben, um zu prüfen, ob PHP auch ausgegeben wird. Dazu legen wir uns in dem HTML-Verzeichnis eine info.php an. Da schreiben wir dann nur folgende Anweisung rein.
<?php phpinfo(); ?>
Jetzt können wir die Datei mit dem Browser einmal aufrufen:

Aus der Testseite sehen wir auch gleich, dass PHP als Server-Modul und nicht als FastCGI läuft. Das werden wir gleich ändern.
Wir aktivieren zum testen die PHP8.3-FPM-Konfiguration mit folgendem Befehl:
sudo a2enconf php8.3-fpm
Deaktivieren lassen sich im Apache diese Konfigurationen mit dem Apache-Befehl a2disconf, als sudo a2disconf php8.3-fpm.
Nun starten wir den Apache einmal neu:
sudo systemctl restart apache2
Danach laden wir die phpinfo in unserem Browser neu und sehen, dass jetzt bei Server-API nicht mehr „Apache 2.0 Handler“ sondern „FPM/FastCGI“ steht. Damit verwendet jetzt der Apache die FPM-Version.
PHP als Server-Modul deaktivieren
Wenn PHP als normales Server-Modul geladen wird, wird immer das Modul „mpm_prefork“ aktiviert und geladen. Wir benötigen aber das zudem performantere Modul „mpm_event“. Außerdem funktioniert HTTP2 nicht mit dem Prefork-Modul, weshalb wir das jetzt wechseln
Dazu lassen wir uns noch einmal alle geladenen Apache-Module ausgeben, um zu sehen, ob „mpm_prefork“ und PHP als Modul geladen sind. Wenn ja, deaktivieren wir diese beiden Module und aktivieren das Modul „mpm_event“.
Zuerst deaktivieren wir PHP8.3 als Servermodul. (Wenn du als Standard eine andere PHP-Version hast, nimmst du natürlich diese.)
sudo a2dismod php8.3
Dann deaktivieren wir das Modul „mpm_prefork“:
sudo a2dismod mpm_prefork
Anschließend aktivieren wir das Modul „mpm_event“:
sudo a2enmod mpm_event
Nun den Apache-Webserver einmal neu starten:
sudo systemctl restart apache2
Und abermals alle aktiven Module ausgeben und kontrollieren, dass jetzt die richtigen Module geladen sind.
apache2ctl -M
Jetzt sollte der Eintrag „mpm_event_module (shared)“ in der Liste auftauchen und die Einträge „mpm_prefork_module (shared)“ und „php_module (shared)“ sollten verschwunden sein.
PHP konfigurieren
Jede PHP-Version hat ihre eigene php.ini-Konfigurationsdatei mit den wichtigen Einstellungen für den Webserver-Betrieb. Damit die meisten PHP-Websysteme korrekt laufen, müssen wir noch ein paar Grundeinstellungen für PHP vornehmen. Das erfolgt über die Datei php.ini.
PHP.ini Datei für die PHP8.3-FPM-Version aufrufen:
sudo nano /etc/php/8.3/fpm/php.ini
Die PHP.ini für eine andere PHP-FPM-Version, findest du, indem du im Verzeichnis-Pfad zur php.ini die PHP Versionsnummer anpasst. Also: /etc/php/8.x/fpm/php.ini
Nur der Vollständigkeit halber, für unser Projekt nicht benötigt: PHP als Apache Modul hat ebenfalls eine eigene php.ini. Diese findest du unter /etc/php/8.3/apache2/php.ini
In der Datei suchst du folgende Parameter und passt diese dann wie folgt an. Anschließend speicherst du die Datei wieder und beendest den Editor.
max_execution_time = 240
max_input_vars = 5000
memory_limit = 256M
post_max_size = 40M
upload_max_filesize = 40M
session.gc_maxlifetime = 86400
Zum Schluss müssen wir den zugehörigen PHP-FPM-Dienst neu starten, damit unsere Einstellungen angewendet werden.
sudo service php8.3-fpm restart
PHP-Einstellungen im Webverzeichnis steuern.
An der Stelle gibt es eine wichtige Funktion der FPM-PHP. Du kannst für jedes Unterverzeichnis die PHP-Einstellungen separat anpassen und das unabhängig von der PHP-Version.
Dazu musst du nur die gewünschten PHP-Werte, die du ändern möchtest, in eine INI-Datei schreiben und diese Datei dann in das gewünschte Verzeichnis legen. Die Datei wirkt auf das Verzeichnis, in dem sie liegt, sowie automatisch auf alle darin enthaltenen Unterverzeichnisse.
Die Datei muss exakt „.user.ini“ heißen, damit das funktioniert. Der Punkt vorn ist dabei nicht zu übersehen. Änderungen werden von PHP nicht sofort eingelesen, daher kann das bis zu 300 Sekunden dauern.
PHP-Version über .htaccess steuern
Kommen wir jetzt dazu, die PHP-Version über die .htaccess auswählbar zu machen. Ich möchte, dass man einfach nachfolgende Anweisung ganz oben in die .htaccess einträgt:
AddType application/x-httpd-php84 .php
Als Erstes legen wir uns dafür eine neue Konfigurationsdatei an.
sudo nano /etc/apache2/conf-available/php-handlers.conf
Das nachfolgende Skript tragen wir in die Datei ein und speichern diese ab.
# PHP-Umschalter konfigurieren
###############################################
# PHP 8.1
AddType application/x-httpd-php81 .php
Action application/x-httpd-php81 /php81-handle
# PHP 8.2
AddType application/x-httpd-php82 .php
Action application/x-httpd-php82 /php82-handler
# PHP 8.3
AddType application/x-httpd-php83 .php
Action application/x-httpd-php83 /php83-handler
# PHP 8.4
AddType application/x-httpd-php84 .php
Action application/x-httpd-php84 /php84-handler
# FPM Mapping
###############################################
ProxyFCGISetEnvIf "true" SCRIPT_FILENAME "%{DOCUMENT_ROOT}%{REQUEST_URI}"
<Location "/php81-handler">
SetHandler "proxy:unix:/run/php/php8.1-fpm.sock|fcgi://localhost/"
</Location>
<Location "/php82-handler">
SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost/"
</Location>
<Location "/php83-handler">
SetHandler "proxy:unix:/run/php/php8.3-fpm.sock|fcgi://localhost/"
</Location>
<Location "/php84-handler">
SetHandler "proxy:unix:/run/php/php8.4-fpm.sock|fcgi://localhost/"
</Location>
Jetzt müssen wir unsere Konfigurationsdatei aktivieren:
sudo a2enconf php-handlers
Ganz wichtig: Damit sich die PHP-Version auch umschalten lässt, müssen wir die Konfigurationsdatei von PHP8.3-FPM, die wir vorhin zum Test geladen haben, wieder deaktivieren.
sudo a2disconf php8.3-fpm
Anschließend müssen wir die Apache-Konfiguration neu laden:
sudo systemctl reload apache2
Standard-PHP-Version festlegen
Natürlich müssen wir jetzt noch die Standard-PHP-Version festlegen. Das machen wir, indem wir die Virtual-Host-Datei, die wir im Teil Apache-Webserver schon bearbeitet haben, bearbeiten.
Default-Konfiguration:
nano /etc/apache2/sites-available/000-default.conf
SSL-Default-Konfiguration:
nano /etc/apache2/sites-available/default-ssl.conf
Dazu müssen wir folgende Anweisung jeweils an das Ende der Datei einfügen:
# Standard PHP-Version für diese Domain
AddType application/x-httpd-php83 .php
Action application/x-httpd-php83 /php83-handler
Zum Abschluss kannst du die korrekte Funktion testen. Dazu legst du einfach ein Verzeichnis bei deinem Webseiten-Verzeichnis an und kopierst dort die info.php hinein. Anschließend erstellst du eine .htaccess-Datei und fügst am Anfang folgende Anweisung ein.
AddType application/x-httpd-php84 .php
Jetzt rufst du die info.php aus diesem Unterverzeichnis im Browser auf und siehe da, in diesem Verzeichnis wird PHP 8.4 geladen. Damit funktioniert alles.
Abschluss mehrerer PHP-Versionen
An dieser Stelle sind wir mit der Konfiguration mehrerer PHP-Versionen fertig. Wir haben die PHP-Version und wichtige Module installiert, PHP-FPM konfiguriert und die Action für den Wechsel der PHP-Version angelegt und aktiviert.
Im nächsten Teil werden wir dann phpMyAdmin installieren und einrichten. Damit wir auch über den Browser auf unsere Datenbanken zugreifen können.
Weiter geht's mit Teil 5 – Installation PHPMyAdmin und HeidiSQL.


0 Kommentare