Es ist mal wieder so weit, die aktuelle PHP-Version läuft aus und eine Aktualisierung von PHP steht an, um die neusten Sicherheitsupdates zu erhalten. Der Beitrag stellt die Vorgehensweise PHP-fpm unter Apache2 zu aktualisieren nur beispielsweise am Upgrade von 7.2 zu 7.4 dar, lässt sich aber für die meisten anderen Versionen durch Abändern der Versionsnummern in den Befehlen und Einstellungen anpassen.
Es wird davon ausgegangen, dass Apache2 und php-fpm wie in
- https://www.lalber.org/2020/02/apache2-auf-mpm-event-und-php-fpm-umstellen/
- https://www.lalber.org/2020/02/apache2-vhosts-mit-mpm-event-unter-einem-eigenen-nutzer-ausfuhren/
eingerichtet sind. In meinem Fall sind die Anzahl der Webseiten noch recht gering, daher führe ich die Einstellungen von Hand durch. Um Fehler zu vermeiden und den Übergang schnell durchzuführen, kann die Vorgehensweise auch in ein Skript überführt werden.
Aktuelle Installation sichern
Konfigurationsdateien
Für regelmäßige Backups sollte ein Skript oder eine Anwendung eingesetzt werden, die auch die Konfigurationen der Anwendungen sichert. Vor dem Upgrade lohnt es sich aber die Konfigurationsdateien nochmal explizit abzuspeichern. Ich werde zusätzlich noch ein Image des Servers erzeugen um im Fall eines fehlgeschlagenen Übergangs schnell die Änderungen rückgängig machen zu können.
# PHP Konfiguration
cp /etc/php /path/to/backup/php
# Apache2 Konfiguration
cp /etc/apache2 /path/to/backup/apache2
Aktuelle PHP-Module
PHP Anwendungen benötigen diverse Module, um Korrekt zu funktionieren. Einige davon müssen getrennt von PHP installiert werden. Um die Module der aktuellen PHP Installation abzufragen, können folgende Befehle verwendet werden:
php -m # Aktuell aktivierte Module
apt list --installed php7.2* # Alle installierte Pakete, deren Namen mit php7.2 beginnt.
Das ist in meinem Fall:
user@server:~$ sudo apt list --installed php7.2*
Auflistung... Fertig
php7.2/bionic-updates,bionic-updates,bionic-security,bionic-security,now 7.2.24-0ubuntu0.18.04.7 all [Installiert,automatisch]
php7.2-bz2/bionic-updates,bionic-security,now 7.2.24-0ubuntu0.18.04.7 amd64 [Installiert,automatisch]
php7.2-cli/bionic-updates,bionic-security,now 7.2.24-0ubuntu0.18.04.7 amd64 [Installiert,automatisch]
php7.2-common/bionic-updates,bionic-security,now 7.2.24-0ubuntu0.18.04.7 amd64 [installiert]
php7.2-curl/bionic-updates,bionic-security,now 7.2.24-0ubuntu0.18.04.7 amd64 [Installiert,automatisch]
php7.2-fpm/bionic-updates,bionic-security,now 7.2.24-0ubuntu0.18.04.7 amd64 [Installiert,automatisch]
php7.2-gd/bionic-updates,bionic-security,now 7.2.24-0ubuntu0.18.04.7 amd64 [Installiert,automatisch]
php7.2-json/bionic-updates,bionic-security,now 7.2.24-0ubuntu0.18.04.7 amd64 [Installiert,automatisch]
php7.2-mbstring/bionic-updates,bionic-security,now 7.2.24-0ubuntu0.18.04.7 amd64 [Installiert,automatisch]
php7.2-mysql/bionic-updates,bionic-security,now 7.2.24-0ubuntu0.18.04.7 amd64 [Installiert,automatisch]
php7.2-opcache/bionic-updates,bionic-security,now 7.2.24-0ubuntu0.18.04.7 amd64 [Installiert,automatisch]
php7.2-readline/bionic-updates,bionic-security,now 7.2.24-0ubuntu0.18.04.7 amd64 [Installiert,automatisch]
php7.2-sqlite3/bionic-updates,bionic-security,now 7.2.24-0ubuntu0.18.04.7 amd64 [Installiert,automatisch]
php7.2-xml/bionic-updates,bionic-security,now 7.2.24-0ubuntu0.18.04.7 amd64 [installiert]
php7.2-xmlrpc/bionic-updates,bionic-security,now 7.2.24-0ubuntu0.18.04.7 amd64 [Installiert,automatisch]
php7.2-zip/bionic-updates,bionic-security,now 7.2.24-0ubuntu0.18.04.7 amd64 [Installiert,automatisch]
Diese Liste sollten für die Validation der neuen Installation gespeichert werden.
Neue Version installieren
Die neue Version wird installiert, indem man folgenden Befehl ausführt.
apt install paketnamen
paketnamen
ersetzt man dabei durch die Pakete, die durch den Befehl apt list --installed php7.2*
ausgegeben wurden, in denen man die Versionsnummer angepasst hat. Das wäre in meinem Fall:
apt install php7.4-bz2 php7.4-cli php7.4-common php7.4-curl php7.4-fpm php7.4-gd php7.4-json php7.4-mbstring php7.4-mysql php7.4-opcache php7.4-readline php7.4-sqlite3 php7.4-xml php7.4-xmlrpc php7.4-zip
Konfiguration anpassen
Die neue PHP Version wird vorerst zusätzlich zur bestehenden Version installiert. Dabei werden ausschließlich Standardkonfigurationsdateien erzeugt, diese müssen jetzt auf das bestehende System angepasst werden.
PHP Konfiguration
php.ini
PHP wird mittels einer Reihe von .ini Dateien konfiguriert. Hat man Änderungen an der Datei /etc/php/7.2/fpm/php.ini
vorgenommen, so muss man diese entsprechen in die Datei im 7.4/fpm
Verzeichnis übernehmen. Ich empfehle allerdings, die Änderungen nicht direkt vorzunehmen, sondern in einer Datei 99-custom.ini
im Verzeichnis 7.4/fpm/conf.d
, das macht in so einem Fall die Übernahme einfacher, indem einfach die 99-custom.ini
an in das entsprechende Verzeichnis der neuen PHP Version kopiert wird.
pool.d
Jetzt müssen noch die Pool-Konfigurationen kopiert und angepasst werden.
# Bestehende Konfigurationen kopieren
sudo cp -a /etc/php/7.2/fpm/pool.d/. /etc/php/7.4/fpm/pool.d/
# Pfade zu Sockets ändern
sudo find . -type f -exec sed -i.bak "s/php7.2-fpm/php7.4-fpm/g" {} \;
Apache2 Konfiguration
Um die globale Apache2 Konfiguration auf die neue Version zu bringen genügt ausführen von:
sudo a2disconf php7.2-fpm
sudo a2enconf php7.4-fpm
Zusätzlich müssen nun noch die Pfade in den Seitenkonfigurationen zu den Sockets geändert werden.
# Zu Apache Seitenkonfigurationsverzeichnis wechseln
cd /etc/apache2/sites-available
# Die Pfade automatisch ändern und Sicherungskopien anlegen
sudo find . -type f -exec sed -i.bak "s/php7.2-fpm/php7.4-fpm/g" {} \;
Dienste neu starten
Um die Änderungen zu übernehmen, muss nun PHP und Apache neugestartet werden.
sudo service php7.4-fpm restart
sudo service apache2 restart
Alte Version deinstallieren
Wenn keine Webanwendung mehr auf die alte PHP-Version angewiesen ist, so kann diese deinstalliert werden. Der Befehl sollte nur ausgeführt werden, wenn man sich wirklich sicher ist!
sudo apt purge php7.2*