Tartalom
- Bevezető
- A PHP 8 újdonságai
- A PHP 8 telepítése
- Alapértelmezett parancssori PHP beállítása
- A PHP 8 beállítása LAMP szerveren
- A PHP 8 beállítása ISPConfig 3 rendszerű szerveren
- Konklúzió
Bevezető
A 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:
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)
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
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:
A PHP 8 beállítása LAMP szerveren
- Debian 9 (Stretch) LAMP szerver v1.0 (PHP 7.0)
- Debian 10 (Buster) LAMP szerver v1.0 (PHP 7.3)
- Ubuntu 18.04 LTS (Bionic Beaver) LAMP szerver v1.0 (PHP 7.2)
- Ubuntu 20.04 LTS (Focal Fossa) LAMP szerver v1.0 (PHP 7.4)
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:
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 a2dismod, a2enmod és a systemctl parancsokat:
a2dismod php7.4
a2enmod php8.0
systemctl restart apache2
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:
É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
Ezután ha ismét ráfrissítünk a phpinfo oldalunkra, akkor láthatjuk a különbséget:
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:
- Különböző PHP-FPM verziók kombinált használata egy szerveren
- Hogyan telepítsük fel a PHP-FPM-et egy Debian 8 (Jessie) LAMP szerverre
- PHP-FPM pool létrehozása és beállítása a phpMyAdmin számára
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:
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:
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.
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:
- Debian 8 (Jessie) LAMP szerver v1.0 (phpMyAdmin 4.2.12) (ezt csak érdekességképpen tettem be, Debian 8-at már ne használjunk, nagyon régi)
- Debian 9 (Stretch) LAMP szerver v1.0 (phpMyAdmin 4.6.6)
- Debian 10 (Buster) LAMP szerver v1.0 (phpMyAdmin 5.0.4) - itt jelenleg csak a backports tárolóban érhető el, korábban ebben sem volt, külön kellett letölteni és telepíteni
- Ubuntu 18.04 LTS (Bionic Beaver) LAMP szerver v1.0 (phpMyAdmin 4.6.6)
- Ubuntu 20.04 LTS (Focal Fossa) LAMP szerver v1.0 (phpMyAdmin 4.9.5)
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.
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>
A 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:
- A 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:
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:
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:
É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:
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
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
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.
Lépjünk a jobb felső System főmenüre, majd utána a bal oldalon az Additional PHP Versions menüpontra:
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
- 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
- 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
- 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:
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:
Itt válasszuk ki a tárhelyet, amelyikre alkalmazni szeretnénk az újonnan felvitt PHP 8-at:
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:
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.
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:
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:
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. :)
- A PHP 8 újdonságai és változásai
- Hogyan telepíthetünk újabb PHP verziókat Debian 9 (Stretch) LAMP szerverünkre PHP-FPM módban
- Hogyan állíthatunk be egyedi PHP verziókat ISPConfig rendszerű szerverünkön
- Hogyan telepítsük fel a PHP-FPM-et egy Debian 8 (Jessie) LAMP szerverre
- PHP-FPM pool létrehozása és beállítása a phpMyAdmin számára
- Hogyan állítsuk át manuálisan egy PHP-FPM pool-ban futó weboldalunk vagy webalkalmazásunk PHP verzióját?
- Ubuntu 20.04 LTS (Focal Fossa) LAMP szerver v1.0 telepítése
- Tökéletes szerver: Debian 10 (Buster) V1.0
- Enciklopédia - Apache HTTP Server
- Enciklopédia - PHP
- Enciklopédia - PHP-FPM
- Enciklopédia - LAMP rendszerek
- Enciklopédia - ISPConfig
- Tökéletes szerver letöltése: Debian 10 (Buster) v1.1
- deb.sury.org
- A hozzászóláshoz regisztráció és bejelentkezés szükséges
- 774 megtekintés