PHP 7.4 und PHP 8.0 zeitgleich auf einem Debian 10 mit Apache und PHP-FPM installieren

Schritt 1 – PHP 7.4, 8.0 und PHP-FPM installieren

Zunächst installieren wir einige benötigte Pakete wie curl

sudo apt-get -y install apt-transport-https lsb-release ca-certificates curl


Um sicher mit dem sury PHP Repository kommunizieren zu können, müssen wir zunächst die Schlüssel herunterladen und installieren diese

sudo curl -sSL -o /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg


Jetzt fügen wir noch das sury PHP Repository unserer Source-List hinzu

sudo sh -c 'echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'


Jetzt können wir unsere Paketlisten neu einlesen und aktualisieren.

sudo apt-get update


Die Vorbereitungen haben wir jetzt abgeschlossen. Endlich dürfen wir PHP und die benötigten Pakete installieren.
Die benötigten Pakete variieren von Anwender zu Anwender, daher macht es evtl. Sinn, diese Liste für euch etwas anzupassen.

Wir installieren erst einmal PHP 7.4

sudo apt install php7.4 php7.4-bcmath php7.4-cli php7.4-common php7.4-curl php7.4-dev php7.4-fpm php7.4-gd php7.4-imap php7.4-intl php7.4-json php7.4-mbstring php7.4-mysql php7.4-opcache php7.4-readline php7.4-soap php7.4-sqlite3 php7.4-tidy php7.4-xsl php7.4-zip


nun installieren wir PHP 8.0

sudo apt install php8.0 php8.0-bcmath php8.0-cli php8.0-common php8.0-curl php8.0-dev php8.0-fpm php8.0-gd php8.0-imap php8.0-intl php8.0-mbstring php8.0-mysql php8.0-opcache php8.0-readline php8.0-soap php8.0-sqlite3 php8.0-tidy php8.0-xml php8.0-xsl php8.0-zip 

Ob unsere beiden PHP-Versionen erfolgreich installiert wurden und unsere PHP-FPM Dienste laufen, können wir hier sehen

Prozessstatus PHP 7.4
sudo systemctl status php7.4-fpm.service
Prozessstatus PHP 8.0
sudo systemctl status php8.0-fpm.service

Jetzt benötigen wir noch ein paar Module für unseren Apache, damit er auch mit unseren PHP-FPM Installationen umgehen kann.

sudo a2enmod actions alias fcgid proxy_fcgi


anschließend den Apache-Dienst neu starten, um die Änderungen zu übernehmen.

sudo systemctl restart apache2


Schritt 2 – CLI Version Alternative auswählen

Abhängig davon, welche PHP-Version man als Default auf seinem Server nutzen möchchte, verwendet man Eines dieser beiden Befehle:

Für PHP 7.4

sudo update-alternatives --set php /usr/bin/php7.4


und für PHP 8.0

sudo update-alternatives --set php /usr/bin/php8.0


Wir können PHP ganz einfach fragen, welche Version gerade aktiv ist

php -v


Alternativ kann man auch update-alternatives –config php nutzen, um die gewünschte PHP-Version auswählen zu können.

update-alternatives --config php


Die Ausgabe sollte dann so aussehen:

update-alternatives –config php


Schritt 3 – php-fpm.sock Alternative auswählen (optional)

Das Gleiche kann man auch noch für php-fpm.sock machen. Somit wird der Default-PHP-FPM Socket auf eine bestimmte Version gestellt.

Für PHP 7.4

sudo update-alternatives --set php-fpm.sock /run/php/php7.4-fpm.sock


und für PHP 8.0

sudo update-alternatives --set php-fpm.sock /run/php/php8.0-fpm.sock


Alternativ kann man auch hier update-alternatives –config php-fpm.sock nutzen, um die gewünschte PHP-Version auswählen zu können.

sudo update-alternatives --config php-fpm.sock


Die Ausgabe sollte dann so aussehen:

update-alternatives –config php-fpm.sock

Hiermit wird Symlink namens php-fpm.sock auf die entsprechende Alternative angelegt.


Schritt 3 – Verzeichnisstruktur für unsere Webseiten erstellen

Für dieses Beispiel erstellen wir zwei Webseiten, wovon eine mit PHP 7.4 und die Andere mit PHP 8.0 laufen wird.
In meinem Fall für die Domains php7.codinghood.de und php8.codinghood.de.

Erste einmal erstellen wir die Ordner für unsere Webseiten:

sudo mkdir /var/www/php7.codinghood.de
sudo mkdir /var/www/php8.codinghood.de


nun verpassen wir den Ordnern noch die passenden Rechte:

sudo chown -R www-data:www-data /var/www/php7.codinghood.de
sudo chown -R www-data:www-data /var/www/php8.codinghood.de
sudo chmod -R 755 /var/www/php7.codinghood.de
sudo chmod -R 755 /var/www/php8.codinghood.de


Als nächstes erstellen wir in jedem Webseiten-Ordner eine info.php Daten, welche uns dann die entsprechenden PHP-Informationen ausgeben wird.

sudo echo "<?php phpinfo();" > /var/www/php7.codinghood.de/info.php
sudo echo "<?php phpinfo();" > /var/www/php8.codinghood.de/info.php


Schritt 4 – Apache für PHP-FPM Konfigurieren

Bei den Installationen unserer beiden PHP-Versionen wurden unter /etc/apache2/conf-available zwei Config-Files angelegt.
Die Config-Dateien heissen php7.4-fpm.conf und php8.0-fpm.conf.


php7.4-fpm.conf


php8.0-fpm.conf


Diese beiden Dateien benötigen wir, um dem Webserver zu sagen, was er mit unseren PHP-Dateien machen soll. In unserem Fall entweder an PHP 7.4 oder an PHP 8.0 schicken. Defaultmäßig möchte ich PHP 7.4 verwenden und nur für ausgewählte Webseiten PHP 8.0 verwenden, da noch nicht jede meiner Seiten mit PHP 8.0 umgehen kann. Mit a2enconf aktivieren wir unsere php7.4-fpm Config und laden dann unseren Apache neu.

sudo a2enconf php7.4-fpm.conf
sudo systemctl reload apache2

anschließend müssen wir unserem Apache noch sage dass er die Configs neu einlesen soll.


Schritt 5 – Apache für unsere beiden Webseiten Konfigurieren

Zunächst legen. wir unsere Konfiguration für php7.codinghood.de an.

sudo nano /etc/apache2/sites-available/php7.codinghood.de
<VirtualHost *:80>
     ServerName php7.codinghood.de
     DocumentRoot /var/www/php7.codinghood.de
     DirectoryIndex info.php

     ServerAdmin [email protected]
     
     <Directory /var/www/php7.codinghood.de>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
     </Directory>
    
    # Benötigen wir hier nicht, PHP 7.4 ist unser Default
    # Include /etc/apache2/conf-available/php7.4-fpm.conf

    ErrorLog ${APACHE_LOG_DIR}/php7.codinghood.de_error.log
    CustomLog ${APACHE_LOG_DIR}/php7.codinghood.de_access.log combined
</VirtualHost>

jetzt benötigen wir noch die Konfiguration für unseren PHP 8 Host php8.codinghood.de.

sudo nano /etc/apache2/sites-available/php8.codinghood.de
<VirtualHost *:80>
     ServerName php8.codinghood.de
     DocumentRoot /var/www/php8.codinghood.de
     DirectoryIndex info.php

     ServerAdmin [email protected]

     <Directory /var/www/php8.codinghood.de>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
     </Directory>

    Include /etc/apache2/conf-available/php8.0-fpm.conf

    ErrorLog ${APACHE_LOG_DIR}/php7.codinghood.de_error.log
    CustomLog ${APACHE_LOG_DIR}/php7.codinghood.de_access.log combined
</VirtualHost>


um sicherzugehen dass wir keine Fehler in unseren Config-Files haben, können wir apachectl configtest nutzen, um Apache unsere Konfiguration testen zu lassen.

sudo apachectl configtest


wenn der der Check in Ordnung war, aktivieren wir unsere beiden neuen Seiten und starten unseren Apache neu:

sudo a2ensite php7.codinghood.de
sudo a2ensite php8.codinghood.de
sudo systemctl restart apache2

Wenn wir nun unsere beiden Webseiten aufrufen, sollten wir diese beiden Seiten erhalten:

PHP Info unsere PHP 7.4 Installation

PHP Info unsere PHP 8 Installation