Hogyan telepíthetjük fel a PHP 8-at Debian vagy Ubuntu rendszerű szerverünkre

botond küldte be 2021. 02. 06., szo – 15:49 időpontban

Tartalom

 

Bevezető

PHP az egyik legelterjedtebb szerver oldali szkriptnyelv amivel dinamikus weblapokat építhetünk, így webszerverünk elengedhetetlen kelléke. 2020. november 26-án került kiadásra ennek legfrissebb főverziója a PHP 8. Ebben a leírásban megnézzük, hogyan telepíthetjük fel a PHP 8-at egy Ubuntu 20.04 (Focal Fossa) LAMP szerverre, és egy Debian 10 (Stretch)  tökéletes szerverre, valamint hogyan állíthatjuk be működésre készre mindkét rendszer Apache környezetében. Korábban már készítettem leírásokat arról, hogy hogyan telepíthetünk újabb PHP verziókat Debian 9 (Stretch) LAMP szerverünkre PHP-FPM módban, és hogy hogyan állíthatunk be egyedi PHP verziókat ISPConfig rendszerű szerverünkön, ezért erre az útmutatóra tekinthetünk úgy is, mint ezek kiegészítésére, folytatására.

 

 

A PHP 8 újdonságai

A PHP 8 sok újdonsággal bővült, illetve sok mindent változtattak benne. A változtatásokat itt tekinthetjük meg.

 

A PHP 8 telepítése

A PHP 8 jelenleg nem szerepel sem a Debian, sem az Ubuntu hivatalos csomagtárában, ezért külső csomagtárat kell igénybe vennünk, ha használni szeretnénk. Erre a célra a deb.sury.org csomagtára az ideális.

A sury.org csomagtár használatba vétele

A csomagtárat beállíthatjuk Debian, illetve Ubuntu rendszereken is.

Csomagtár beállítása Debian rendszeren

Korábban már készítettem egy leírást, amiben Debian rendszerre került beállításra a Sury.org, ezért itt most nem részletezem. Ha tehát Debian rendszeren szeretnénk beállítani a csomagtárat, akkor tekintsük meg az alábbi leírást: 

Csomagtár beállítása Ubuntu rendszeren

Ubuntu rendszeren a következő módon állíthatjuk be: lépjünk be root-ként, majd adjuk ki az alábbi parancsot:

sudo add-apt-repository ppa:ondrej/php

Én ezt az Ubuntu 20.04 LTS (Focal Fossa) LAMP szerverre telepítem, nálam ennek a kimenete:

A sury.org csomagtár beállítása Ubuntu rendszeren

Ezután frissítsük a csomagtár adatbázist és a csomagokat is, hogy mindenből a legfrissebb legyen a szerverünkön:

sudo apt-get update
sudo apt-get upgrade

Ezzel be is állítottuk a deb.sury.org csomagtárat Ubuntu rendszerünkön. Innentől már telepíthetjük belőle a csomagokat.

 

PHP csomagok telepítése

A PHP alapcsomagok telepítését most is külön választom, mint a korábbi leírásban. Az áttekinthetőbb telepítés kedvéért először tehát feltelepítjük az alapcsomagokat, amik a PHP működéséhez kellenek.

Alapcsomagok

Ha korábban már használtunk más PHP verziókat, akkor előfordulhat, hogy ezek a csomagok már fent vannak a gépen. Ettől függetlenül futtathatjuk a parancsot, nem lesz gond ilyenkor sem. Azonban ha még friss rendszerre telepítünk, akkor mindenképp tegyük fel ezeket a csomagokat, hogy a PHP környezetünk megfelelően működhessen:

apt-get -y install \
    mcrypt \
    imagemagick \
    memcached \
    php-apcu \
    php-gettext \
    php-imagick \
    php-memcache \
    php-pear \
    php-yaml

Ha ezzel megvagyunk, akkor jöhet a PHP 8 csomagválogatás.

PHP 8 csomagválogatás

Hasonlóan a korábbi leírásban az egyedi PHP változatokhoz, a PHP 8-hoz is összeállítottam egy csomagválogatást, ami elég sok mindent tartalmaz. Itt van két csomag béli eltérés az Ubuntu és a Debian rendszerek között, ezért külön választottam a két rendszerhez a telepítőparancsot. Lejjebb részletezem.

Ubuntu rendszerekhez
apt-get -y install \
    libapache2-mod-php8.0 \
    libphp8.0-embed \
    php8.0 \
    php8.0-apcu \
    php8.0-bcmath \
    php8.0-bz2 \
    php8.0-cgi \
    php8.0-cli \
    php8.0-common \
    php8.0-curl \
    php8.0-fpm \
    php8.0-gd \
    php8.0-http \
    php8.0-imagick \
    php8.0-imap \
    php8.0-intl \
    php8.0-mbstring \
    php8.0-memcache \
    php8.0-mysql \
    php8.0-opcache \
    php8.0-pspell \
    php8.0-raphf \
    php8.0-soap \
    php8.0-tidy \
    php8.0-uuid \
    php8.0-xml \
    php8.0-xmlrpc \
    php8.0-xsl \
    php8.0-yaml \
    php8.0-zip

Természetesen ettől eltérhetünk: kivehetünk belőle csomagokat, vagy hozzá is adhatunk még, ha szükséges.

 

 

Debian rendszerekhez

Debian rendszereknél annyi a különbség, hogy két csomag jelenleg (2021-02-05) nincs benne a Sury.org Debian csomagtárában:

  • php8.0-http (még csak béta állapotban van: 4.0.0beta1)
  • php8.0-xmlrpc (még csak RC állapotban van: 1.0.0RC1)
Frissítés (2022-09-20):
Időközben a korábban hiányzó két csomag (php8.0-http és a php8.0-xmlrpc) már felkerült a Sury.org csomagtárába, így elérhető mindegyik csomag. Ennek megfelelően módosítottam a további részeket.

Ennek fényében tehát akkor a telepítőparancs Debian rendszerekhez:

apt-get -y install \
    libapache2-mod-php8.0 \
    libphp8.0-embed \
    php8.0 \
    php8.0-apcu \
    php8.0-bcmath \
    php8.0-bz2 \
    php8.0-cgi \
    php8.0-cli \
    php8.0-common \
    php8.0-curl \
    php8.0-fpm \
    php8.0-gd \
    php8.0-http \
    php8.0-imagick \
    php8.0-imap \
    php8.0-intl \
    php8.0-mbstring \
    php8.0-memcache \
    php8.0-mysql \
    php8.0-opcache \
    php8.0-pspell \
    php8.0-raphf \
    php8.0-soap \
    php8.0-tidy \
    php8.0-uuid \
    php8.0-xml \
    php8.0-xmlrpc \
    php8.0-xsl \
    php8.0-yaml \
    php8.0-zip

A fenti csomagösszeállítás tehát már tartalmazza a két (korábban) hiányzó csomagot is. Ezzel a válogatással már kényelmesen futtathatunk modern CMS rendszereket is.

Az összes elérhető PHP 8 csomagot a következő paranccsal listázhatjuk ki mindkét rendszeren, tehát ezekből válogathatunk:

apt-cache search php8

PHP 8 parancssori ellenőrzése

Ha feltelepítettük a szükséges csomagokat a PHP 8 számára, akkor ellenőrizhetjük:

php --version

A PHP 8 ellenőrzése parancssorból

Amint láthatjuk, a telepítés után ez is lett az alapértelmezett parancssori PHP verziónk.

 

Alapértelmezett parancssori PHP beállítása (opcionális)

Amennyiben több PHP verziónk is van a szerveren, de mondjuk nem ezt a legutóbb feltelepített példányt szeretnénk használni elsődlegesként a parancssorban, akkor be kell állítanunk az alapértelmezett változatot. Ezt az alábbi paranccsal tehetjük meg szintén root-ként:

update-alternatives --config php

Nálam ezen a LAMP szerveren már fent volt a 7.4-es PHP, így most a bemutató kedvéért átállítom erre:

Alapértelmezett PHP beállítása

Noha a különböző parancssori PHP verziókat direktben is elérhetjük a teljes verziós parancsaikkal (például php7.4, php8.0, stb), amiket például a különböző cron feladatokban is meghívhatunk, ezért nem feltétlenül szükséges átállítani az alapértelmezett változatot. Azonban vannak esetek, amikor olyan parancsokat kell futtatnunk, amelyek a PHP alapértelmezett beállításra támaszkodnak. Ilyenkor természetesen át kell váltani az alapértelmezett változatot, hogy az ilyen parancsok a megfelelő PHP motort használhassák. De ha csak kényelmi szempontból szeretnénk átállítani, akkor is megtehetjük.

 

A következő fejezetben LAMP szerveren fogjuk beállítani a PHP 8-at. Ha át kívánjuk ugrani ezt a részt, kattintsunk a A PHP 8 beállítása ISPConfig 3 rendszerű szerveren fejezetre.

 

 

A PHP 8 beállítása LAMP szerveren

Ehhez a beállításhoz szükség lesz egy LAMP szerverre, amin elvégezzük az itt következő részeket. Erre a célra az alábbi LAMP szerverek kiválóan alkalmasak:

Zárójelben feltüntettem, hogy melyik szerver hányas PHP verzióval készült el. Mind a négy esetben a disztribúció csomagtárában lévő "gyári" alapértelmezett PHP került fel ezekre a szerverekre. Tehát a lényeg, hogy bármelyikre is telepítünk, a most felkerült PHP 8 előtt már mindegyik szerver esetében volt már előtte valamilyen PHP változat, ami mellé most telepítettük fel a PHP 8-at.
Én ezek közül ebben a leírásban a legutolsón, az Ubuntu 20.04 LAMP virtuális gépen készítem el ezt a leírást, tehát nálam már volt egy 7.4-es PHP is.

A PHP-t sokféleképpen be lehet állítani. Ha már fent vannak a csomagjai, akkor szóra lehet bírni "alapszinten", de hogy a mai elvárásoknak is megfeleljen, kell igazítani rajta egy kicsit.

Kiindulási állapot ellenőrzése a phpinfo segítségével

Első körben helyezzünk el egy phpinfo fájlt a szerver webgyökér könyvtárában, és töltsük be a böngészőbe, hogy jobban érthessük mi is történik a PHP körül.

Hozzuk létre a fájlt a /var/www/html könyvtárban, ami az alapértelmezett a webgyökér könyvtár (ha utólag ezt átállítottuk, akkor abban hozzuk létre):

sudo nano /var/www/html/phpinfo.php

És tegyük bele a szokásos néhány sort:

<?php
    phpinfo();
?>

Majd mentsük le, és töltsük be a böngészőbe a szerver IP-címével vagy hosztnevével:

Kiindulási állapot ellenőrzése a phpinfo segítségével

Ahogy a képen is láthatjuk, itt van egy 7.4-es PHP, ami Apache modulként fut (Apache 2.0 Handler). Bár feltelepítettük a PHP 8-at is, most mégsem az működik, mert a telepítő érzékelte, hogy már van egy bekapcsolt Apache modul, így nem aktiválta a frissebb verzióét. Így tehát most az alapértelmezett PHP futtatja a lekért oldalakat (ez nem összetévesztendő a fentebb leírt parancssori alapértelmezett PHP beállításával). Ennek átkapcsolását kézzel kell elvégeznünk.

Átkapcsolás PHP 8-ra

Root-ként kapcsoljuk ki az alapértelmezett PHP Apache modulját (jelen esetben a 7.4-esét), majd kapcsoljuk be a 8.0-áét, és indítsuk újra az Apache-ot. Ezekre használjuk az a2dismoda2enmod és a systemctl parancsokat:

a2dismod php7.4
a2enmod php8.0
systemctl restart apache2

Parancssori átkapcsolás PHP 8-ra

A php8.0 Apache modul bekapcsolása után még kiírt néhány javasolt dolgot. A Multi-Processing Modules (MPMs) témakörével most nem foglalkozunk, ezeket majd egy másik leírásban nézzük át részletesebben.

Ezután frissítsünk rá a phpinfo oldalunkra:

PHP 8 ellenőrzése a phpinfo segítségével

És láthatjuk, hogy át is váltott PHP 8-ra. Azonban még ezzel nem végeztünk, még át kell állítani egy-két dolgot.

Átkapcsolás PHP 8 FPM-re

Most már a PHP 8 futtatja a webgyökérben lévő php fájlokat, azonban még Apache modulként (mod_php) működik, ami már sok éve elavult. Helyette a PHP-FPM-et fogjuk használni, ami jelenleg a legkorszerűbb Szerver API (SAPI) a PHP számára. Ehhez root-ként maradva futtassunk még néhány parancsot:

a2dismod php8.0
a2enmod proxy_fcgi setenvif
a2enconf php8.0-fpm
systemctl restart apache2

Itt annyi történik, hogy az első sorban kikapcsoljuk az imént bekapcsolt php8.0 apache modult, majd bekapcsolunk még pár modult, amik szükségesek a PHP-FPM működtetéséhez, majd utána bekapcsoljuk a php8.0-fpm konfigurációt, ami elindítja a www-pool processzeit, végül újraindítjuk az Apache-ot.

Utána még ellenőrizhetjük a php8.0-fpm szolgáltatást is:

systemctl status php8.0-fpm.service

Parancssori átkapcsolás PHP 8 FPM használatára

Ezután ha ismét ráfrissítünk a phpinfo oldalunkra, akkor láthatjuk a különbséget:

PHP 8 FPM ellenőrzése a phpinfo segítségével

A Server API sorában most már "FPM/FastCGI" érték áll, valamint az útvonalak is már az FPM könyvtárakba mutatnak.

Ezt a két utolsó átkapcsolási lépést természetesen egy lépésben is elvégezhettük volna, most csak a szemléltetés kedvéért bontottam két külön részre.

Ez a PHP-FPM konfiguráció még csak egy alap beállítás, ami az egész szerveren globálisan a PHP 8 FPM-el futtat minden PHP fájlt az alapértelmezett www pool-ban. Így a webgyökérben lévő esetleges weboldalakat is, és az Apache konfigurációkat is (pl. phpMyAdmin).

Ha többet szeretnénk megtudni a PHP-FPM további beállításairól, finomhangolásáról, mint például a weboldalak / Apache konfigurációk külön FPM pool-okban vagy akár külön PHP verziókkal történő egyidejű futtatásáról, akkor az alábbi leírásokból bővebben tájékozódhatunk:

 

 

phpMyAdmin ellenőrzése, beállítása

A phpMyAdmin a LAMP szerverek fontos eleme: ha nincs is a szerveren működő weboldal, a phpMyAdmin eléggé összetett rendszer ahhoz, hogy le tudjuk vele tesztelni a LAMP összetevőinek (Apache, PHP, MySQL/MariaDB) sarkalatos pontjait, amennyiben ezekből újabb verziókat telepítettünk a disztribúció hivatalos csomagtárában kínált változatoknál. Ezért amikor én egy LAMP szervert módosítok, akkor a phpMyAdmin-t mindig kipróbálom, hogy rendesen működik-e. Ezért is van nálam megnyitva egy külön böngészőfülön. Most tehát átnézzük, hogy a phpMyAdmin és a PHP 8 bírják-e egymást.

Elindítva a webes adatbázis kezelőnket:

phpMyAdmin 4.9.5 ellenőrzése a PHP 8-on

első ránézésre minden rendben van, a jobb oldalon látjuk is a PHP 8.0.1 verziót, tehát ezen fut. Azonban ha jobban körülnézünk benne, akkor találunk néhány érdekességet:

phpMyAdmin 4.9.5 - Notice-ok a PHP 8-on

Belépve az egyik adatbázisba dobott egy PHP notice-ot:

Deprecation Notice in ./libraries/classes/Di/ReflectorItem.php#82
 Method ReflectionParameter::getClass() is deprecated

Ami persze nem egy fatális hiba (Fatal error), de egy éles szerverkörnyezetben ez sem túl jó, mert ezen kívül még előfordulhatnak más hibák is, pláne egy PHP főverzió váltás után.

Mindez persze abból is következik, hogy a PHP 8-ban megváltozott az alapértelmezett error_reporting beállítás is, ami azt jelenti, hogy azok a hibák, amik korábban esetleg rejtve maradtak, azok most itt megjelennek. Így normál esetben elég lenne csak a php.ini-ben módosítani az error_reporting értéket, hogy ne jelenítse meg a notice-okat, és így át is ugorhatnánk az itt következő részeket. Azonban ez a gyorsabb megoldás nem biztos, hogy jó döntés lenne, mert jobban utánajárva ennek a hibának, ez konkrétan a PHP 8-ban bekövetkezett változások miatt került elő, tehát nem lenne biztonságos így hagyni.

Persze, ha később kerülünk ide, és újabb phpMyAdmin verziónk van, ami már nem dobál semmilyen hibát, akkor át is ugorhatjuk ezeket a részeket. Minden esetre most még vannak kompatibilitási problémák a phpMyAdminban ezért én elvégzem a megfelelő beállításokat. Aki tehát szintén be szeretné állítani, az folytassa velem a további részeket. Természetesen ha kihagyjuk az itt következő beállításokat, nem fog összedőlni a phpMyAdmin, de ha szeretnénk elkerülni a későbbi meglepetéseket, akkor célszerű elvégezni ezeket.
Elméleti részek következnek. Amennyiben át szeretnénk ugrani ezt a két részt, folytathatjuk egyből a phpMyAdmin beállításával, azonban az utána lévő beállítások könnyebb megértése érdekében érdemes elolvasni.

 

Verziók áttekintése (elméleti rész)

Átfutva a phpMyAdmin hivatalos közleményeit, megnézhetjük, hogy hogy áll a phpMyAdmin projekt a PHP 8 kompatibilitással. Ahogy belenézünk, jelenleg (2021-02-05) még zajlik a PHP 8 hibák elhárítása a mostani legfrissebb verziókban is. Persze ez mondjuk fél év múlva javulhat, vagy akár teljesen kompatibilissé is válhat az egész. Azonban még nem áll 100%-osan készen a PHP 8 használatára. És ha még azt is számításba vesszük, hogy a különböző Linux disztribúciókban nem is a legfrissebb phpMyAdmin csomagok vannak, így a hibalehetőségek száma még nagyobb. Alább összegyűjtöttem az általam eddig elkészített LAMP szerverekben lévő phpMyAdmin verziókat:

Tehát ezeknek megfelelően láthatjuk, hogy – saját LAMP szerverünktől függően – a phpMyAdmin verziónk nem a legfrissebb, kivétel a Debian 10 esetében, ahol korábban nem is tartalmazta a csomagtár, így külön kellett letölteni és telepíteni, de újabban (kb 2020 második félévben) bekerült a Debian 10 backports tárolójába, ahonnan már telepíthető, és most éppen elérhető a mostani legfrissebb változat (5.0.4), ami később lehet hogy nem így lesz.

Ezek tudatában beláthatjuk, hogy jelenleg mindenképpen szükséges lesz valamilyen beállítás, amivel hiba nélkül tudjuk működtetni a phpMyAdmint is és a szerverre kerülő weboldalakat is. Viszont ahogy fentebb is említettem, ha esetleg később akadnánk erre a leírásra, amikor már a phpMyAdmin teljesen kompatibilissé válik a PHP 8-al, akkor az alábbi beállítási részek már nem lesznek szükségesek, azonban még akkor is célszerű lesz egy optimális környezetet kialakítanunk szerverünkön, ahol minden weboldal megfelelően futhat.

Beállítási lehetőségek (elméleti rész)

Mint ahogy fentebb is már említettem, a PHP-FPM sokféle módon beállítható, így magunknak kell eldöntenünk, hogy az építeni kívánt szerveren mik az igények, ennek megfelelően melyik a legoptimálisabb megközelítés. Néhány variációt felsorolok itt ötlet adás gyanánt, de utána csak egyféle beállításnak a kivitelezésével haladunk tovább.

  • Globális PHP 8 FPM beállítás, a phpMyAdmin pedig egy másik PHP (például a disztribúcióban lévő alapértelmezett 7.4) alapértelmezett FPM pooljában fut
  • Globális PHP 8 FPM beállítás, a phpMyAdmin pedig egy másik PHP (például a disztribúcióban lévő alapértelmezett 7.4) külön FPM pooljában fut
  • Globális alapértelmezett PHP FPM (például 7.4), így a phpMyAdmin is ebben fut, a webgyökér a PHP 8 FPM alapértelmezett FPM pooljában fut
  • Globális alapértelmezett PHP FPM (például 7.4), így a phpMyAdmin is ebben fut, a webgyökér a PHP 8 FPM külön FPM pooljában fut

Lehetne ezt még cifrázni, de ezek a főbb irányok. Ezek közül szándékosan kihagytam az Apache modulként (mod_php) történő működtetési formákat, mert ezeket már nem használjuk.

Itt most egy rövid, átfogó elméleti segédletet nyújtok, hogy ezek alapján el tudjuk dönteni, hogy melyik a számunkra a megfelelő beállítási irány.

A globális PHP FPM beállítás annyit jelent, hogy bekapcsoljuk valamelyik PHP fpm Apache konfigurációját, példák:

a2enconf php5.6-fpm
a2enconf php7.0-fpm
a2enconf php7.1-fpm
a2enconf php7.2-fpm
a2enconf php7.3-fpm
a2enconf php7.4-fpm
a2enconf php8.0-fpm

Apache konfigurációk bekapcsolása az a2enconf paranccsal, kikapcsolásuk pedig az a2disconf paranccsal. A konfigurációk kapcsolgatása után pedig újra kell indítani az Apache-ot.

Természetesen egyszerre csak egyet illik bekapcsolni ezek közül. Ha többet kapcsolnánk be, akkor az nem eredményezne ugyan hibát, azonban az Apache a /etc/apache2/conf-enabled könyvtárból névsor alapján tölti be a konfigurációkat, így a sorban a legutolsó bekapcsolt konfiguráció lesz érvényben, mivel ezek átfedik egymást, azaz a legmagasabb verziójú PHP FPM lesz az aktív a bekapcsoltak közül. Ezért nem célszerű többet bekapcsolni, mert később belekeveredhetünk a működésébe.

Ha be van kapcsolva valamelyik php fpm konfiguráció, akkor az annyit csinál, hogy mindent azzal futtat alapból az egész szerveren, például weboldalak, Apache konfigurációk, stb. Ennek működéséhez még ki kell kapcsolni az adott PHP verzió Apache modulját is (például: a2dismod php7.4 ). Erről részletesebben korábban már írtam egy másik leírásban.

Ezalól a globális beállítás alól kivételt tehetünk, ha egy weboldalnak külön beállítjuk a virtualhoszt-ját, vagy egy Apache konfigurációnak a konfigját. Apache konfiguráció lehet például egy phpMyAdmin, vagy például egy Roundcube webmail, vagy akár egy Matomo webanalitikai rendszer is, vagy bármi egyéb webalkalmazás, amit mindegyik weboldal alól elérhetővé szeretnénk tenni egy alkönyvtárból.

Ezeknek tükrében tehát fel kell mérnünk a szerver építésénél, hogy milyen weboldalak fognak futni rajta, azok milyen PHP verzió(ka)t igényelnek többségükben, valamint hogy milyen egyéb webalkalmazásaink lesznek (phpMyAdmin, webmail, stb), és azok is milyen PHP verziókat támogatnak. Majd ezek alapján el kell döntenünk, hogy melyik a legoptimálisabb beállítás, hogy például később egy újabb weboldal beüzemelése során a lehető legkevesebb plusz beállítást, beavatkozást kelljen elvégeznünk. Így például ha tudjuk, hogy a szerveren a legújabb CMS rendszereket szeretnénk futtatni, akkor kapcsoljuk be a legújabb PHP-t, azonban ha lesznek régebbi fejlesztésű weboldalak is, akkor válasszunk inkább egy régebbi PHP-t globális beállításként, hogy mindegyik weboldal számára megfelelő PHP környezetet kínáljunk, stb.

A PHP-FPM pool-okról pedig annyit érdemes tudni, hogy mindegyik PHP verzió esetében van egy alapértelmezett "www" pool. Tehát ha bekapcsoljuk valamelyik PHP-FPM-et, akkor alapból ebben a www poolban futtat mindent. Ettől eltérhetünk, ha egy weboldalnak, vagy Apache konfigurációnak külön FPM pool-t készítünk (akár ugyanabban a PHP verzióban, vagy egy másikban), és abban futtatjuk. Ezzel elszeparálhatjuk a futási környezetüket egymástól, ami optimálisabb működést tesz lehetővé, valamint a biztonságot is növeli, mert ilyenkor minden pool-t futtathatunk akár másik felhasználóval is. Tehát a globális beállításoktól függetlenül célszerűbb inkább minden weboldalt egy külön FPM pool-ban futtatni. Ezekről részletesebben pedig itt olvashatunk.

 

 

phpMyadmin beállítása

A fentebb felsorolt szituációk közül a másodikhoz áll a legközelebb az a beállítás, amit már korábban elvégeztem egy másik leírásban, ezért most is ennek a kivitelezését javaslom, amit most itt el is készítünk:

A szituáció tehát ugyanaz: a phpMyAdmin rendszert egy külön PHP környezetben szeretnénk futtatni a többi weboldaltól, Apache konfigurációtól. Jelen esetben tehát nem a globálisan beállított PHP 8-alatt, hanem a disztribúcióban alapértelmezetten lévő PHP egy külön FPM pool-jában. Ezzel két problémát is kiküszöbölhetünk:

  • A phpMyAdmin egy korábbi, 7.x PHP alatt hiba nélkül működhet, mert még nem 100%-ban kompatibilis a PHP 8-al. Ez persze később érvényét veszíti, mert idővel kompatibilis lesz vele, de jelenleg még nem az.
  • Mivel külön futási környezetet biztosítunk neki, ezáltal finoman be tudunk állítani minden szükséges dolgot a phpMyAdmin számára, amik nem zavarják meg a többi weboldal, stb működését. Már csak emiatt is érdemes elvégezni ezt a beállítást, hogy később se legyen gondunk emiatt.

Itt most kicsit gyorsabb léptekben fogunk haladni, mert a másik leírásban már leírtam minden fontos részletet. Akkor jöjjenek is a beállítások.

Apache beállítása

Itt most először az Apache konfigurálásával kezdjük, mert innen kell majd átvenni a PHP környezet számára szükséges beállításokat, így egyszerűbb, ha ezzel kezdjük. Nyissuk meg root-ként a /etc/apache2/conf-available/phpmyadmin.conf fájlt, ami tartalmazza a phpMyAdmin Apache konfigurációját:

nano /etc/apache2/conf-available/phpmyadmin.conf

És tegyük bele a PHP-FPM részt, ahogy itt látható:

# phpMyAdmin default Apache configuration

Alias /phpmyadmin /usr/share/phpmyadmin

<Directory /usr/share/phpmyadmin>
	Options SymLinksIfOwnerMatch
	DirectoryIndex index.php

	# limit libapache2-mod-php to files and directories necessary by pma
	<IfModule mod_php7.c>
		php_admin_value upload_tmp_dir /var/lib/phpmyadmin/tmp
		php_admin_value open_basedir /usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/:/usr/share/php/php-gettext/:/usr/share/php/php-php-gettext/:/usr/share/javascript/:/usr/share/php/tcpdf/:/usr/share/doc/phpmyadmin/:/usr/share/php/phpseclib/:/usr/share/php/PhpMyAdmin/:/usr/share/php/Symfony/:/usr/share/php/Twig/:/usr/share/php/Twig-Extensions/:/usr/share/php/ReCaptcha/:/usr/share/php/Psr/Container/:/usr/share/php/Psr/Cache/:/usr/share/php/Psr/Log/:/usr/share/php/Psr/SimpleCache/
	</IfModule>

	# PHP-FPM beállítása a saját phpmyadmin pool-hoz
	<IfModule mod_proxy_fcgi.c>
		<FilesMatch "\.(php|html)$">
			SetHandler "proxy:unix:/run/php/php7.4-phpmyadmin-fpm.sock|fcgi://localhost"
		</FilesMatch>		
	</IfModule>
	# PHP-FPM beállítás vége

</Directory>

# Disallow web access to directories that don't need it
<Directory /usr/share/phpmyadmin/templates>
    Require all denied
</Directory>
<Directory /usr/share/phpmyadmin/libraries>
    Require all denied
</Directory>

php7.4-phpmyadmin-fpm.sock fájlnévbe a saját PHP verziónkat tegyük bele. Nálam a 7.4-es van, ezért így neveztem el. Célszerű így elnevezni, hogy utaljon a PHP verzióra is, és hogy mit futtatunk vele, hogy később se keveredjünk bele a működésébe.

Itt még láthatjuk, hogy ebben a példában van 2 PHP beállítás: Az upload_tmp_dir, és az open_basedir. A következő részben ezekre lesz szükségünk, ezért is kezdtük most ezzel a fájlal. Ha más disztribúcióval dolgozunk, ott ezek eltérhetnek ettől, mint ahogyan például a Debian 10 LAMP szerver Apache beállításánál is, ezért fontos, hogy ne ezeket vegyük alapul, hanem amilyen beállítások a saját fájlunkban vannak, mert ezután ezeket kell majd átvennünk.

Most mentsük le a fájlt, és jön a PHP-FPM pool beállítása.

PHP-FPM pool létrehozása

Hozzunk létre egy új fájlt a saját alapértelmezett PHP verziónk alatti FPM könyvtárában, ami nálam a 7.4-es:

nano /etc/php/7.4/fpm/pool.d/phpmyadmin.conf

És tegyük bele az alábbi tartalmat:

; Pool-unk neve
[phpmyadmin]

; Futtató felhasználó
user = www-data
group = www-data

; Socket fájl
listen = /run/php/php7.4-phpmyadmin-fpm.sock

; Socket fájl tulajdonosa és módja
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

; Process management beállítások
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.max_requests = 0

; log fájl
access.log = /var/log/phpmyadmin/php-fpm-access.log
access.format = "Log: %t \"%m %r%Q%q\" %s time:%{mili}dm mem:%{kilo}MKB cpu:%C%%"

; Ezekben a fájltípusokban futhatnak php kódok
security.limit_extensions = .php .html

; Környezeti változók
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /var/lib/phpmyadmin/tmp
env[TMPDIR] = /var/lib/phpmyadmin/tmp
env[TEMP] = /var/lib/phpmyadmin/tmp

; Saját PHP beállítások
php_admin_flag[log_errors] = on
php_flag[display_errors] = off
php_admin_value[session.gc_maxlifetime] = 3600
php_admin_value[error_log] = /var/log/phpmyadmin/php-errors.log
php_admin_value[memory_limit] = 128M
php_admin_value[upload_max_filesize] = 256M


; További PHP beállítások, amiket a 'gyári' phpMyAdmin Apache konfigból vettünk át
php_admin_value[upload_tmp_dir] = /var/lib/phpmyadmin/tmp
php_admin_value[open_basedir] = /usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/:/usr/share/php/php-gettext/:/usr/share/php/php-php-gettext/:/usr/share/javascript/:/usr/share/php/tcpdf/:/usr/share/doc/phpmyadmin/:/usr/share/php/phpseclib/:/usr/share/php/PhpMyAdmin/:/usr/share/php/Symfony/:/usr/share/php/Twig/:/usr/share/php/Twig-Extensions/:/usr/share/php/ReCaptcha/:/usr/share/php/Psr/Container/:/usr/share/php/Psr/Cache/:/usr/share/php/Psr/Log/:/usr/share/php/Psr/SimpleCache/
; Ezeket pontosan másoljuk át az phpMyAdmin Apache konfigja alapján!

Itt ezeknek a részletes leírásába most nem megyünk bele, mert már leírtam a másik leírásban. Amit itt most fontosak, csak azokat emelem ki:

  • listen = /run/php/php7.4-phpmyadmin-fpm.sock fájl neve ugyanaz legyen, mint amit az Apache konfigurációban is megadtunk.
  • Saját PHP beállítások: Például ide tehetjük be a saját környezeti beállításainkat. Én ezeket állítottam itt be. Ezek közül a log fájl útvonala fontos, nemsokára ezzel lesz még dolgunk.
  • További PHP beállítások: Itt pedig pontosan vegyünk át minden Apache beállítást, ami a saját konfig fájl példányunkban volt. Nálam csak ez a kettő volt, amit fentebb is említettem. Ügyeljünk a szintaktikai eltérésekre, tehát hogy itt másképpen kell megadni az értékeket, mint az Apache konfig fájljában ahogy voltak.

Ha megvagyunk, mentsük le.

Log fájlok lekezelése

Ha már az egészet egy külön pool-ba tesszük, akkor célszerű a log fájljait is átirányítani egy külön helyre. Itt is az előző leírás idevonatkozó része alapján haladunk. Hozzuk létre a könyvtárat a log fájloknak, állítsuk be a tulajdonosát:

mkdir /var/log/phpmyadmin
chown -R www-data:www-data /var/log/phpmyadmin

Állítsuk be a naplófájlok forgatását is. Hozzunk létre egy új logrotate fájlt:

nano /etc/logrotate.d/phpmyadmin

És tegyük bele az alábbiakat:

/var/log/phpmyadmin/php-fpm-access.log
/var/log/phpmyadmin/php-errors.log
{
	rotate 7
	daily
	copytruncate
	compress
	delaycompress
	missingok
	notifempty
}
Rendszerek újraindítása

 

 

Végül indítsuk újra a PHP-FPM-et (a saját verziónkét) és az Apache-ot:

systemctl restart php7.4-fpm.service
systemctl restart apache2.service
Tesztelés

Ha mindennel megvagyunk, akkor ellenőrizzük munkánk gyümölcsét.

Frissítsünk rá a phpMyAdmin felületére. Ha közben kiléptetett a munkamenetből, lépjünk vissza:

A phpMyAdmin tesztelése a saját PHP-FPM pool-jában

Itt a jobb oldalon látszik is a 7.4-es PHP verzió.

Ha pedig még gyorsan összedobunk egy phpinfo fájlt is:

nano /usr/share/phpmyadmin/my_phpinfo.php

Aminek a tartalma:

<?php
    phpinfo();
?>

És betöltjük egy új fülön, akkor:

A phpMyAdmin futási környezete

Láthatjuk a futási környezetét is, ahol lejjebb görgetve megtalálhatjuk a saját PHP beállításainkat is, mint például az "upload_max_filesize" értékét is:

A phpMyAdmin futási környezete

És végül ha ránézünk még a webgyökér könyvtárra is, ahol elhelyezhetjük a weboldalakat, akkor pedig:

A webgyökér könyvtár, ahol a PHP 8 futtatja a weboldalakat

Láthatjuk, hogy itt már a PHP 8 várja a felkerülő weboldalakat.

Így tehát egy külön 7.4-es PHP környezetben fut a phpMyAdmin rendszerünk, és külön a globálisan beállított PHP 8.0.1-es környezetben a webgyökérben elhelyezett tartalom. Így mindenképpen megérte átrakni a phpMyAdmin-t, mert biztosak lehetünk benne, hogy nem fogják zavarni egymás beállításait, ha bármikor szükség lesz valamelyiknél módosítani azokat.

 

A PHP 8 beállítása ISPConfig 3 rendszerű szerveren

Ehhez a beállításhoz szükség lesz egy tökéletes szerverre, amin elvégezzük az itt következő részeket. Erre a célra az alábbi szerverek kiválóan alkalmasak:

Ezek közül én a Debian 10-es változattal készítem el ezt a leírást.

Egy ISPConfig 3 rendszerű szerveren már jóval egyszerűbb a helyzet, mivel itt a Web hoszting kezelőpanel már elvégez a háttérben minden szükséges beállítást helyettünk, így nekünk csak néhány alapvető dolgot kell beállítanunk a kezelőfelületén.

Ha feltelepítettük a PHP 8 csomagjait a leírás elején leírtak szerint, akkor még vissza kell állítanunk az alapértelmezett PHP-t.

Alapértelmezett PHP visszaállítása

Miután felkerült a rendszerre a PHP 8, így az alapértelmezett PHP is ez lett most. Az ISPConfig-ban történő beállítás során nálam olyan történt, hogy nem mentette le a beállításokat, tehát nem tűnt el a piros kör. Miután újraindítottam mindent, már a kezelőpanel sem jött be belépés után, csak a fejléce. Mindez azután történt, amikor a legvégén átállítottam a tárhelyet PHP 8 FPM-re. Tehát utána már sem a kezelőpanel nem működött, sem a háttér feladat nem futott le. Ez utóbbi egy csomó PHP hibát is dobált, amikor kézzel próbáltam lefuttatni:

PHP Warning:  Undefined array key "admin_mail" in /usr/local/ispconfig/server/server.php on line 97
PHP Warning:  Undefined array key "php_fpm_incron_reload" in /usr/local/ispconfig/server/plugins-available/z_php_fpm_incron_reload_plugin.inc.php on line 109
PHP Warning:  Undefined array key "CA_path" in /usr/local/ispconfig/server/plugins-available/apache2_plugin.inc.php on line 269
PHP Warning:  Undefined array key "template" in /usr/local/ispconfig/server/lib/classes/tpl_ini.inc.php on line 92
PHP Warning:  Trying to access array offset on value of type null in /usr/local/ispconfig/server/lib/classes/tpl_ini.inc.php on line 92
PHP Warning:  Undefined array key "template" in /usr/local/ispconfig/server/lib/classes/tpl_ini.inc.php on line 92
PHP Warning:  Trying to access array offset on value of type null in /usr/local/ispconfig/server/lib/classes/tpl_ini.inc.php on line 92
PHP Warning:  Undefined array key "csr" in /usr/local/ispconfig/server/plugins-available/apache2_plugin.inc.php on line 1314
PHP Warning:  Undefined array key "website_autoalias" in /usr/local/ispconfig/server/plugins-available/apache2_plugin.inc.php on line 1428
PHP Warning:  Undefined array key "vhost_proxy_protocol_enabled" in /usr/local/ispconfig/server/plugins-available/apache2_plugin.inc.php on line 1815
PHP Warning:  Undefined array key "vhost_proxy_protocol_enabled" in /usr/local/ispconfig/server/plugins-available/apache2_plugin.inc.php on line 1839
PHP Warning:  Undefined array key "template" in /usr/local/ispconfig/server/lib/classes/tpl_ini.inc.php on line 92
PHP Warning:  Trying to access array offset on value of type null in /usr/local/ispconfig/server/lib/classes/tpl_ini.inc.php on line 92
PHP Warning:  Undefined array key "template" in /usr/local/ispconfig/server/lib/classes/tpl_ini.inc.php on line 92
PHP Warning:  Trying to access array offset on value of type null in /usr/local/ispconfig/server/lib/classes/tpl_ini.inc.php on line 92
PHP Fatal error:  Uncaught TypeError: count(): Argument #1 ($var) must be of type Countable|array, bool given in /usr/local/ispconfig/server/lib/classes/tpl.inc.php(1344) : eval()'d code:77
Stack trace:
#0 /usr/local/ispconfig/server/lib/classes/tpl.inc.php(1344): eval()
#1 /usr/local/ispconfig/server/lib/classes/tpl.inc.php(788): tpl->_parse()
#2 /usr/local/ispconfig/server/plugins-available/apache2_plugin.inc.php(3473): tpl->grab()
#3 /usr/local/ispconfig/server/plugins-available/apache2_plugin.inc.php(2007): apache2_plugin->php_fpm_pool_update()
#4 /usr/local/ispconfig/server/lib/classes/plugins.inc.php(120): apache2_plugin->update()
#5 /usr/local/ispconfig/server/mods-available/web_module.inc.php(137): plugins->raiseEvent()
#6 /usr/local/ispconfig/server/lib/classes/modules.inc.php(302): web_module->process()
#7 /usr/local/ispconfig/server/lib/classes/modules.inc.php(235): modules->raiseTableHook()
#8 /usr/local/ispconfig/server/server.php(180): modules->processDatalog()
#9 {main}
  thrown in /usr/local/ispconfig/server/lib/classes/tpl.inc.php(1344) : eval()'d code on line 77

 

 

Hosszas debugolás és keresgélés után kiderült, hogy az ISPConfig-nak még nem minden része kompatibilis a PHP 8-al. Tehát mivel most már a PHP 8 az alapértelmezett PHP, így ez működteti többek között a kezelőpanelt is, amiben most hiba keletkezett. Aztán miután rátaláltam a megoldásra, újra működött.
Forrás: howtoforge.com - Community (nálam is sorról sorra pontosan ezeket a hibákat dobálta kézi futtatásnál).

Ezért a hiba kijavítása után most visszamenőleg betettem ezt a részt, hogy másnál ne fordulhasson elő ugyanez. A megoldás tehát az, hogy vissza kell állítani az alapértelmezett PHP-t a disztribúció alapértelmezett PHP verziójára. Így nálam a Debian 10 esetében a PHP 7.3 -ra. Értelemszerűen más disztribúció vagy kiadás esetén a megfelelő saját verzióra.

Futtassuk tehát az alábbi parancsokat root-ként, és válasszuk ki a saját megfelelő alapértelmezett verziónkat, és utána indítsuk újra az Apache-ot (nálam ezek után áll helyre a rend):

update-alternatives --config php
update-alternatives --config php-cgi
update-alternatives --config php-fpm.sock
systemctl restart apache2.service

Alapértelmezett PHP visszaállítása

Idővel ez a probléma biztosan meg fog szűnni, amikor már az ISPConfig is 100%-osan kompatibilis lesz a PHP 8-al, de jelenleg még vissza kell váltanunk a disztribúció alapértelmezett PHP verziójára.

Miután megvagyunk ezzel, már biztonságosan folytathatjuk a beállításokat.

Új PHP verzió létrehozása

Lépjünk be az ISPConfig 3 panelünkbe adminként.

ISPConfig - Admin kezdőoldal

Lépjünk a jobb felső System főmenüre, majd utána a bal oldalon az Additional PHP Versions menüpontra:

ISPConfig - Rendszer - További PHP verziók

Itt ezen a szerveren már vannak egyedi PHP verziók, a korábbi leírásból eredően. Itt kattintsunk a zöld Add new PHP version gombra. Ekkor előjön az új PHP űrlapja:

Name fül

ISPConfig - Rendszer - További PHP verziók - Név fül

  • Szerver: Válasszuk ki a szerverünk nevét a legördülőből
  • Kliens: Ha használunk ügyfeleket, akkor is célszerű üresen hagyni, így mindegyik ügyfél számára elérhető lesz ez a PHP verzió.
  • PHP neve: PHP 8.0
  • Aktív: pipa

FastCGI Settings fül

ISPConfig - Rendszer - További PHP verziók - FastCGI Settings fül

  • Path to the PHP FastCGI binary: php-cgi8.0
  • Path to the php.ini directory: /etc/php/8.0/cgi

Itt ügyeljünk rá, hogy az első értéknél nem kell abszolút elérési utat használni, mert a php-cgi fájlok a /usr/bin könyvtárban vannak, amik alapból benne vannak az elérési útban.

PHP-FPM Settings fül

ISPConfig - Rendszer - További PHP verziók - PHP-FPM Settings fül

  • Path to the PHP-FPM init script: php8.0-fpm
  • Path to the php.ini directory: /etc/php/8.0/fpm
  • Path to the PHP-FPM pool directory: /etc/php/8.0/fpm/pool.d
  • A Címke nélküli 4. mező: Ez a PHP-FPM socket directory akar lenni, hagyjuk üresen. A korábbi verziókban ez még nem volt benne

Ha lementettük, akkor visszakerülünk az egyedi PHP verziók listájára:

ISPConfig - Beállított PHP 8.0 verzió

Itt láthatjuk is, hogy van egy tárhely, ami a PHP 7.4-et használja. Azon a tárhelyen fogjuk most átkapcsolni a PHP-t a 8-as verzióra.

 

 

PHP 8 bekapcsolása a tárhelyen

Ha felvittük a PHP 8-at a listára, akkor már csak be kell kapcsolni a kívánt tárhelyre. Ezen a szerveren szerencsére van is egy tárhely, amin egy Drupal 9-es weboldal fut, így ezen be is tudom mutatni.

Lépjünk be fent a Sites (Webhelyek) főmenübe:

ISPConfig - Webhelyek listája

Itt válasszuk ki a tárhelyet, amelyikre alkalmazni szeretnénk az újonnan felvitt PHP 8-at:

ISPConfig - Web Domain beállítása

Itt rögtön az első fülön maradva görgessünk le a legaljára, és állítsuk be a PHP 8-at:

ISPConfig - Web Domain beállítása - PHP 8 beállítása

Majd mentsük le az űrlapot.

Mentés után várjuk meg, amíg az oldal tetején eltűnik a piros kör.

ISPConfig - Webfiók mentése

Első nekifutásra nálam itt volt a probléma: nem tűnt el a piros kör hosszú percek után sem. Akkor fordul elő ilyen, ha nem tud rendesen lefutni az ISPConfig cron feladata, mert valami hiba van benne (ez esetben a script nem birkózott meg a PHP 8 követelményeivel). Ha eltűnik a piros kör, akkor biztosak lehetünk benne, hogy a háttér feladat rendesen lefutott, így a beállítások is mentésre kerültek.

 

Tárhely ellenőrzése

Elindítjuk a tárhelyen lévő weboldalt, nálam ez a Drupal 9-es. És abban az állapotjelentés oldal:

Drupal 9 - Állapotjelentés - PHP 8 működik

Itt a PHP verzió résznél láthatjuk a működő PHP-t. (Az elmaradt Drupal alaprendszer frissítéssel most ne foglalkozzunk, azt majd a szerver soron következő verziójának feltöltése előtt pótolom.)

És ha itt rákattintunk a további információk linkre a PHP verziónál, akkor bead egy phpinfo lapot:

Phpinfo oldal

Ez már egy működő PHP 8-as tárhely, amin láthatóan a Drupal 9 is jól érzi magát.

 

 

Konklúzió

Amint láthatjuk, a PHP 8 telepítése kíván némi utólagos beállítgatást, főleg LAMP szervereken, de ha már fent van, akkor gond nélkül használhatjuk. Az ISPConfig 3 szerverkörnyezet esetében pedig elsőre én is meglepődtem azon a hibán, de szerencsére sikerült megtalálni a megoldást, ami után már gond nélkül kapcsolgathatjuk a különböző PHP verziókat a tárhelyeinken.

A PHP 8 még egy nagyon új dolog, ezért nagy eséllyel ezeknek az információknak egy része idővel érvényét veszíti, mivel előbb-utóbb minden aktívan fejlesztett PHP alapú rendszer kompatibilis lesz vele, valamint még maga a PHP 8 is sokat fog csiszolódni az elkövetkező időkben, mire olyan kiforrott lesz, mint elődje, a PHP 7. De ha a telepítéséhez és beállításához szükséges alapokat megismerjük, akkor ez az ismeret később is jól fog jönni, ha már a PHP 8 újabb al-verzióit kell használnunk.

Kicsit hosszabbra sikerült ez a leírás, mint terveztem, de igyekeztem most is a lehető legtöbb plusz információt, elméleti részt is beletenni, hogy ne csak a száraz parancssorok legyenek felsorolva, mint ahogyan a legtöbb más helyen is látható, mert fontosnak tartom, hogy aki elolvassa ne csak elvégezze ezeket a beállításokat, hanem meg is értse a működésüket. Aki persze már tudja ezeket, annak úgy sincs benne sok új, de annak idején például én is örültem volna, ha valaki így egyben tálalta volna nekem a dolgokat, és nem sok másik oldalról kellett volna összeollóznom a beállításokhoz szükséges tudást.

Használjátok egészséggel, remélem sokaknak jól jön egy kis PHP 8 buherálás. :)