Hogyan állítsuk át manuálisan egy PHP-FPM pool-ban futó weboldalunk vagy webalkalmazásunk PHP verzióját?

botond küldte be 2024. 02. 17., szo – 01:33 időpontban

Tartalom

 

Bevezető

A PHP-FPM (FastCGI Process Manager) használata a weboldalak és webalkalmazások futtatásához számos előnnyel jár, különösen ha azt a régebbi technikákkal, mint például az Apache modulként futtatott PHP-val hasonlítjuk össze. Az egyik legfontosabb előny, hogy a PHP-FPM jelentősen javítja a teljesítményt és a skálázhatóságot, mivel lehetővé teszi a PHP folyamatok finomabb kezelését és optimalizálását. Ezáltal a szerver erőforrásait hatékonyabban használhatjuk ki, csökkenthetjük a válaszidőt, és nagyobb forgalom esetén is stabil maradhat a rendszerünk. Ezen felül a PHP-FPM dinamikusan kezeli a gyermekfolyamatokat, így alkalmazkodik a terhelés változásaihoz, ami rugalmasabbá teszi a weboldalak, illetve webalkalmazások működését. Az Apache modulként futtatott PHP-vel ellentétben - ahol a PHP a webszerver folyamatán belül fut -, a PHP-FPM egy önálló FastCGI szerverként működik, ami izolálja a PHP folyamatokat az Apache-tól, ezáltal növelve a biztonságot és a stabilitást. Összességében a PHP-FPM használata modern, hatékony és rugalmas megoldást kínál weboldalak és webalkalmazások futtatására, jelentős előnyöket biztosítva a régebbi technikákhoz képest.

Korábban már foglalkoztunk a PHP-FPM pool-ok működésével, és a PHP-FPM használatával, például a phpMyAdmin webes adatbáziskezelő panelünket állítottuk be PHP-FPM működésűre, amelyet az alábbi leírás alapján készítettünk el:

A fenti leírásban a Debian 10 LAMP szerver telepítésének kiegészítő részeként állítottunk be PHP-FPM-et a phpMyAdmin számára, ami óta a PHP rendszer már sok frissítésen esett át, így illendő beállítani a weboldalainkat, webalkalmazásainkat az újabb PHP ág használatára, így a phpMyAdmin felületünket is.

Ebben a leírásban tehát megnézzük néhány lépésben, hogy hogyan tudjuk egyszerűen kézi beállításainkat módosítani ahhoz, hogy a weboldalaink, illetve webalkalmazásaink is a megfelelő PHP verzióval működjenek. Bár itt most nem a korábbi VirtualBox-os LAMP szerveren fogom frissíteni, hanem a másik éles szerveremen mutatom be ezt, de az illusztráció szempontjából ez nem lényeges.

A továbbiakban két forgatókönyvet fogunk átnézni:

Mindkét forgatókönyv esetén a phpMyAdmin lesz a példa webalkalmazásunk, amivel elvégezzük a beállítást, de bármilyen weboldal esetén is ugyanígy vagy hasonlóan alkalmazhatjuk.

A forgatókönyvek közül a másodikat tekinthetjük a fentebb belinkelt (LAMP szerveres) leírás "folytatásának", de az első forgatókönyvet szükséges előbb átnézni, hogy jobban megérthessük ennek a működését.

 

 

Alapfeltételek

A leírás alapfeltétele, hogy a szerveren telepítve kell lennie egyszerre több PHP verziónak. Értelemszerűen ez az útmutató csak ebben az esetben használható. A többféle PHP verziók telepítésével már néhány korábbi leírásban foglalkoztunk:

 

Alapértelmezett PHP-FPM pool-ban futó weboldal vagy webalkalmazás PHP verziójának átállítása

Az első forgatókönyvben azt nézzük át, amikor nincs beállítva külön PHP-FPM pool-ba a weboldalunk vagy webalkalmazásunk, hanem az alapértelmezett pool-ban fut a webes felület. De mi is az alapértelmezett pool?

Itt hosszabb elméleti rész következik. Amennyiben szeretnénk ezeket kihagyni, ugorjunk át ennek a forgatókönyvnek a PHP verzió beállítási részére.

PHP-FPM Apache konfiguráció áttekintése

Korábban már értekeztünk arról, hogy hogyan variálhatjuk a különböző PHP-FPM pool-okat igényeinknek megfelelően, ebben tekintettük át a php-fpm Apache konfigurációkat, amelyekben van az erre vonatkozó lényeg. De mivel az imént linkelt leírás már nagyon régi, ezért inkább bemásolom az ezen a szerveren lévő php7.4-fpm Apache konfigurációt, hogy egy frissebb példán keresztül nézzük meg a részleteket. Bár ez sem a legújabb (2023 januári) változat, de a példa szemléltetéséhez ez is kiváló.

# Redirect to local php-fpm if mod_php is not available
<IfModule !mod_php7.c>
<IfModule proxy_fcgi_module>
    # Enable http authorization headers
    <IfModule setenvif_module>
    SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
    </IfModule>

    <FilesMatch ".+\.ph(ar|p|tml)$">
        SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost"
    </FilesMatch>
# The default configuration works for most of the installation, however it could
# be improved in various ways. One simple improvement is to not pass files that
# doesn't exist to the handler as shown below, for more configuration examples
# see https://wiki.apache.org/httpd/PHP-FPM
#    <FilesMatch ".+\.ph(ar|p|tml)$">
#        <If "-f %{REQUEST_FILENAME}">
#            SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost"
#        </If>
#    </FilesMatch>
    <FilesMatch ".+\.phps$">
        # Deny access to raw php sources by default
        # To re-enable it's recommended to enable access to the files
        # only in specific virtual host or directory
        Require all denied
    </FilesMatch>
    # Deny access to files without filename (e.g. '.php')
    <FilesMatch "^\.ph(ar|p|ps|tml)$">
        Require all denied
    </FilesMatch>
</IfModule>
</IfModule>

Apró változás van a régihez képest, de a lényeg ugyanaz. Tehát mi is történik itt?

  • Mod_php Ellenőrzés: Az első sorban (<IfModule !mod_php7.c>) az Apache ellenőrzi, hogy a mod_php7 modul (a PHP integrált Apache modulja) nem aktív-e. Ha ez a modul nem aktív, akkor az alábbi konfigurációs szabályokat alkalmazza. Ez biztosítja, hogy ha a mod_php elérhető, akkor az legyen a preferált a PHP fájlok feldolgozására; ha nem, akkor áttér a PHP-FPM használatára.
  • Proxy FastCGI Modul: A "<IfModule proxy_fcgi_module>" direktíva ellenőrzi, hogy a proxy_fcgi modul (a FastCGI protokollt használó proxy modul) elérhető és be is van-e töltve. Ez a modul szükséges ahhoz, hogy az Apache át tudja irányítani a PHP fájlok feldolgozását a PHP-FPM szolgáltatáshoz.
  • A SetEnvIfNoCase direktíva sora: A sor az Authorization HTTP fejlécek átadását teszi lehetővé az Apache-tól a PHP-FPM-ig. Ez különösen fontos az API hívások és webalkalmazások esetében, ahol a hitelesítési adatokat gyakran HTTP fejléceken keresztül adják át.
  • A <FilesMatch ".+\.ph(ar|p|tml)$"> direktíva azokat a fájlokat célozza, amelyek .php, .phar, vagy .phtml kiterjesztéssel rendelkeznek, és beállítja a kezelőjüket a proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost értékre. Ez azt jelenti, hogy ezeket a kéréseket egy Unix socketen keresztül továbbítja a helyi PHP-FPM folyamathoz.
    Az Unix domain socket-ekről és a TCP socket-ekről már korábban volt szó ebben a leírásban.
  • A kikommentezett rész (<FilesMatch ".+\.ph(ar|p|tml)$"> <If "-f %{REQUEST_FILENAME}">...) egy opcionális optimalizálási lehetőséget mutat be. Ez a feltétel azt ellenőrzi, hogy a kért PHP fájl létezik-e a fájlrendszerben, mielőtt átirányítaná a kérést a PHP-FPM-hez. Ezzel a módszerrel elkerülhető, hogy nem létező fájlok esetében feleslegesen terheljük a PHP-FPM szolgáltatást.
  • A .phps fájlokhoz (<FilesMatch ".+\.phps$">) való hozzáférés alapértelmezés szerint tiltott (Require all denied). Ezek a fájlok nyers PHP forráskódot tartalmaznak, amelyeket biztonsági okokból nem szabad közvetlenül elérhetővé tenni.
  • Fájlnév nélküli PHP fájlok: Hasonlóan, a fájlnév nélküli PHP fájlokhoz való hozzáférés is tiltott (<FilesMatch "^\.ph(ar|p|ps|tml)$">), ami további biztonsági intézkedés a nem kívánt hozzáférések ellen.

Az itteni leírás szempontjából ezek közül az első pont, azaz az átirányítási rész a lényeges nekünk, hogy megértsük ennek az alapértelmezett pool-nak a kiválasztási logikáját.

Az Apache webkiszolgáló és a PHP-FPM közötti integráció esetében, amikor nincs explicit módon meghatározva egyedi pool konfiguráció egy adott weboldal vagy webalkalmazás virtualhost fájljában, akkor az alapértelmezett www-data PHP-FPM poolt használja a rendszer. Ez a pool az alapértelmezett konfigurációs fájlban van definiálva, amely a PHP-FPM telepítés része, általában a /etc/php/<verzió>/fpm/pool.d/www.conf útvonalon található, ahol <verzió> a telepített PHP verzióját jelöli.

Az www.conf fájl tartalmazza az alapértelmezett pool beállításait, mint például a felhasználói és csoport azonosítókat (user és group), a folyamatkezelési stratégiát (process management [pm] ), a gyermekfolyamatok számát (pm.max_children, pm.start_servers, pm.min_spare_servers, pm.max_spare_servers stb.), és egyéb fontos konfigurációs paramétereket, amelyek befolyásolják a PHP folyamatok működését és kezelését.

Amikor egy weboldal vagy webalkalmazás PHP kérést generál, és nincs hozzá explicit pool konfiguráció meghatározva, akkor az Apache által a PHP-FPM felé irányított kérések az alapértelmezett www-data poolon keresztül kerülnek feldolgozásra. Ez biztosítja, hogy a PHP kérések kezelése központilag konfigurálható és kezelhető legyen, még akkor is, ha nincs specifikus szükséglet vagy követelmény az egyedi pool konfigurációra.

Fontos megjegyezni, hogy az alapértelmezett pool konfiguráció is igény szerint testreszabható, hogy jobban megfeleljen a kiszolgáló környezetünknek vagy az alkalmazásaink specifikus teljesítményi és biztonsági követelményeinek. Ezen kívül, a nagyobb teljesítményű vagy biztonságkritikus környezetekben érdemes több, egyedi konfigurációjú pool-t definiálni különböző weboldalak vagy alkalmazások számára, hogy optimalizálják a rendszer erőforrásainak felhasználását és növeljék az alkalmazások izolációját. Ezekről majd a leírás második felében értekezünk.

PHP környezet ellenőrzése az átállítás előtt

Mielőtt bármit is átállítanánk, érdemes ellenőrizni a módosításra kiszemelt weboldal vagy webalkalmazás PHP környezetét.

Jelen példában tehát először megnézzük a phpMyAdmin panel kezdőoldalát:

PHP környezet ellenőrzése - phpMyAdmin kezdőoldal

Itt láthatjuk a jobb oldali középső panelen hogy ez a panel a 7.4.x PHP verziós ágon működik. Persze ebből még csak a verziót látjuk, de azt, hogy milyen környezetben fut, azt csak egy részletesebb adatokat is kínáló phpinfo segítségével ellenőrizhetjük, amelyet a webes felület webkönyvtárában helyeztünk el:

PHP környezet ellenőrzése - phpinfo 1. kép

Itt láthatjuk hogy valóban a 7.4-es PHP-FPM-el fut a webalkalmazás. Valamint kicsit lejjebb görgetve láthatjuk a rendszert futtató UNIX felhasználót is:

PHP környezet ellenőrzése - phpinfo 2. kép

Itt pedig azt is láthatjuk, hogy valóban a www-data nevű felhasználó futtatja ezt a webes rendszert, tehát az alapértelmezett pool-ban fut.

Most, hogy már megbizonyosodtunk róla, hogy milyen környezetben fut a webalkalmazásunk, elvégezhetjük a beállítást.

 

 

PHP verzió átállítása

Ha az alapértelmezett PHP-FPM pool-t kell átállítanunk, akkor nem kell módosítanunk semmilyen konfigurációs fájlt, csak futtatni néhány beállító parancsot:

PHP-FPM Apache konfigurációk átállítása/cseréje

A PHP-FPM Apache konfigurációk "kicseréléséhez" először kapcsoljuk ki az aktív FPM konfigurációt, majd kapcsoljuk be a beállítani kívánt újabb vagy éppen régebbi PHP verziót, amelyikre éppen szükségünk van. Ehhez a művelethez az a2disconf és az a2enconf parancsokat használjuk. Előtte még ellenőrizhetjük a rendelkezésre álló és az ezek közül bekapcsolt fpm konfigurációt:

find /etc/apache2 -type l -name '*fpm.conf'
find /etc/apache2 -type f -name '*fpm.conf'

Apache fpm konfigurációk keresése

Az első paranccsal megkeressük a a /etc/apache2 könyvtárban a megadott végződésű szimbolikus linkeket, utána pedig ugyanebben a könyvtárstruktúrában megkeressük az ugyanilyen végződésű fájlokat, Így előttünk van, hogy mit kell kikapcsolnunk, és hogy utána milyen bekapcsolható konfigurációk közül választhatunk. Nálam éppen ezek a verziók vannak ezen a szerveren. 

A "*fpm.conf" fájlok tehát az alapértelmezett www pool-ba történő átirányítások Apache konfigurációit tartalmazzák, amik a különböző PHP-FPM csomagok telepítésekor jönnek létre. Ez az alapértelmezett pool szolgál ki minden olyan kérést, aminek nincs egyedi fpm pool beállítva az adott weboldal vagy webalkalmazás virtualhost konfigurációjában. Az egyedi fpm pool-ok átállítását/cseréjét a leírás második fejezetében tekintjük át.

Ha tehát megvan, hogy melyik verzióról melyikre szeretnénk váltani, akkor hajtsuk végre a cserét és indítsuk újra az érintett szolgáltatásokat. Mindezt természetesen root-ként:

a2disconf php7.4-fpm
a2enconf php8.2-fpm
systemctl restart apache2
systemctl restart php7.4-fpm
systemctl restart php8.2-fpm

Aktív PHP-FPM konfiguráció átállítása

Ebben a példában itt a 7.4-ről váltottam a 8.2-re.

Itt majd még lesz egy beállítás, de ezt direkt a végére hagytam. Ezután ellenőrizhetjük a webes felületeket.

PHP környezet ellenőrzése az átállítás után

Nézzünk rá a phpMyAdminra:

phpMyAdmin kezdőoldal ellenőrzése

Itt már láthatjuk, hogy a PHP 8.2.x ágat jeleníti meg a kezelőfelület. Ezután megnézhetjük a phpinfo oldalt is:

phpinfo oldal ellenőrzése

Itt is mutatja az újonnan beállított PHP verzió részleteit.

Az előbb említettem, hogy még van egy beállítás, ezt még hajtsuk végre.

Az update-alternatives beállítása

Hogy teljesen precízen beállítsunk mindent, még az update-alternatives paranccsal is állítsuk át az alapértemezett fpm-et:

update-alternatives --config php-fpm.sock

És itt igazítsuk hozzá az fpm verziót a fentebb beállítotthoz:

Az update-alternatives beállítása

Ez a parancs nem befolyásolja közvetlenül a legtöbb virtualhost működését, mivel csak a megfelelő szimbolikus linket állítja át a /run/php könyvárban:

A php-fpm.sock fájl alapértelmezett útvonala

Itt tehát a parancs hatására átállításra került a link kapcsolat, így most az alábbi link láncolás van érvényben:

/run/php/php-fpm.sock -> /etc/alternatives/php-fpm.sock -> /run/php/php8.2-fpm.sock

Ez tehát közvetlenül nem befolyásolja a legtöbb virtualhost vagy Apache konfig működését, mivel a legtöbb helyen explicit módon kerülnek beállításra a php-fpm socket fájljai, elég ha csak a leírás elején lévő konfiguráció megfelelő sorát megnézzük:

        SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost"

Így tehát a verzió átváltása enélkül is megtörténik a legtöbb esetben, mint ahogy a phpMyAdmin esetében is láthattuk. Azonban előfordulhatnak olyan Apache konfigurációk vagy virtualhostok, amik az általános (php-fpm.sock) socket fájlra hivatkoznak. Ilyenkor ezeknél szükséges az update-alternatives beállítása is, hogy a megfelelő socket fájlra mutasson a beállítás.

Ez a megközelítés hasznos lehet fejlesztési vagy tesztelési környezetekben, ahol szükség lehet gyakori váltásra a PHP verziók között, vagy olyan egyéb környezetekben, ahol több projekt fut különböző PHP verziókövetelményekkel. Így a web szerver konfigurációja általános maradhat, és a PHP-FPM verzióváltás egyszerűen, parancssori utasítással kezelhető, minimalizálva a konfigurációban szükséges manuális módosításokat és az ezekből adódó hibalehetőségeket.

Fontos azonban szem előtt tartani, hogy bár ez a megközelítés kényelmes és rugalmas, gondoskodni kell arról, hogy minden webes alkalmazás vagy projekt, weboldal ami a szerveren fut, saját FPM pool-ban működjön, hogy egyedi beállításokkal maximalizálhassuk az erőforrások kihasználhatóságát és a kompatibilitást a kiválasztott PHP verzióval.

Végül az update-alternatives beállítása után is indítsuk újra az érintett szolgáltatásokat:

systemctl restart apache2
systemctl restart php7.4-fpm
systemctl restart php8.2-fpm

Mivel az update-alternatives csak a link struktúrát változtatja, de a szolgáltatásokat nem.

A következő fejezetben megnézzük az egyedig PHP-FPM pool-ban futó weboldal vagy webalkalmazás PHP verziójának átállítását.

 

 

Egyedi PHP-FPM pool-ban futó weboldal vagy webalkalmazás PHP verziójának átállítása

A másik forgatókönyvben pedig az egyedi PHP-FPM pool-ok átállítását nézzük át, amikor a weboldal vagy webalkalmazás számára külön pool-van beállítva, ezáltal nem az alapértelmezett PHP-FPM beállításokkal működik a webes felület.

Az egyedi PHP-FPM pool-ok létrehozását itt most nem tárgyaljuk, mivel ezt már több másik leírásban is átnéztük korábban, így itt csak a PHP verzió átállítását nézzük át.

Ebben a részben ugyanezen a szerveren hajtjuk végre a verzió átállítását, amin én közben előkészítettem a példa kedvéért a szükséges környezetet, tehát előzőleg beállítottam a phpMyAdmin számára egy egyedi PHP-FPM pool-t, ami a PHP7.4 verzióját használja, így ebben a példában is a 7.4-es PHP-ről fogunk a 8.2-re váltani.

Itt hosszabb elméleti rész következik. Amennyiben szeretnénk ezeket kihagyni, ugorjunk át ennek a forgatókönyvnek a PHP verzió beállítási részére.

A phpMyAdmin Apache konfiguráció áttekintése

Az első forgatókönyvben betekintettünk az  aktív PHP-FPM Apache konfigurációjába, amiben átnéztük az alapértelmezett FPM beállításokra történő átirányítás működését, itt pedig megnézzük a phpMyAdmin saját Apache konfigurációját, ahol explicit módon van beállítva a saját pool-ja.

# phpMyAdmin default Apache configuration
Alias /788f9c47f61c4eeb /usr/share/phpmyadmin

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

	<IfModule mod_php7.c>
		AddType application/x-httpd-php .php

		php_flag magic_quotes_gpc Off
		php_flag track_vars On
		php_flag register_globals Off
		php_value include_path .
	</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>

# Authorize for setup
<Directory /usr/share/phpmyadmin/setup>
	<IfModule mod_authn_file.c>
		AuthType Basic
		AuthName "phpMyAdmin Setup"
		AuthUserFile /etc/phpmyadmin/htpasswd.setup
	</IfModule>
	Require valid-user
</Directory>

# Disallow web access to directories that don't need it
<Directory /usr/share/phpmyadmin/libraries>
	Order Deny,Allow
	Deny from All
</Directory>
<Directory /usr/share/phpmyadmin/setup/lib>
	Order Deny,Allow
	Deny from All
</Directory>

Itt most ez a rész az érdekes:

	# 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

Ebben a részben van beállítva, hogy a phpMyAdmin explicit a php7.4-phpmyadmin-fpm.sock fájlra hivatkozik. Természetesen itt bármilyen fájlnév lehet, az a lényeg, hogy egyedi, tehát eltér a leírás első fejezetében mutatott "phpX.Y-fpm.sock" mintáktól, amik a meglévő alapértemezett pool-ok socket fájljai.

FPM konfiguráció áttekintése

A fenti socket fájlunk pedig ebben a konkrét példában a /etc/php/7.4/fpm/pool.d/phpmyadmin.conf fájlban van meghatározva, ami a pool konfigurációját tartalmazza:

phpMyAdmin FPM pool konfiguráció

Itt van a legelején beállítva magának a pool-nak a neve, a futtató felhasználó és csoport, majd maga a socket fájl. Ez a fájl jön létre, amikor elindítjuk/újraindítjuk az adott PHP-FPM szolgáltatást, és erre "kapcsolódik" rá az Apache konfiguráció, amin keresztül az Apache kommunikál a PHP-FPM rendszerrel. Így tehát bármilyen nevet is választunk a socket fájlunknak, a két helyen meg kell egyezniük ezeknek. Minden esetre törekedjünk következetes fájlnevek beállítására.

Itt a további beállítások a mostani leírás szempontjából nem lényegesek, így csak az elejét listáztam ki.

Ha tehát hasonlóan van beállítva a weboldalunk vagy webalkalmazásunk PHP-FPM poolja, aminek kézi beállítással meg szeretnénk változtatni a PHP verzióját, akkor folytathatjuk az itt következő részeket.

 

 

PHP környezet ellenőrzése az átállítás előtt

Itt is átnézhetjük a PHP környezetet, ahol látszólag ugyanazt fogjuk kapni, mint az első forgatókönyv esetén:

phpMyAdmin kezdőoldal ellenőrzése

phpinfo ellenőrzése

Viszont itt most benézhetünk a php7.4-fpm működésébe is:

systemctl status php7.4-fpm.service

php7.4 FPM - Pool-ok ellenőrzése

Itt láthatjuk a lényeget: van 3 futó phpmyadmin process-ünk is - az alapértelmezett www pool process-ei mellett -, aminek a neve tehát megegyezik a fentebb mutatott pool konfigurációban beállított névvel. 

Ha következetesen állítjuk be pool-jaink illetve a socket fájljaink neveit, akkor hosszú távon sem keverjük össze a különböző webalkalmazásaink beállításait. Normál weboldalak esetében ritka, hogy kézzel kelljen ezeket állítgatni, mert általában valamilyen kontroll panel végzi el ezeket helyettünk, mint például az ISPConfig is, ahol a webfiókok beállításaiban ezt kényelmesen el lehet végezni. De a különböző webes alkalmazásokról, mint például a phpMyAdmin vagy webmail, stb, célszerű magunk gondoskodnunk, hogy az adott webes felület is biztosan a megfelelő PHP verzióval, környezettel és jogosultságokkal futhasson.
Továbbá egy jól megtervezett névstruktúra nagyban megkönnyítheti a hibakeresést és a rendszeradminisztrációt, különösen nagyobb rendszerek vagy több kiszolgáló esetén. Egyértelmű nevek segíthetnek gyorsan azonosítani, hogy melyik alkalmazás melyik pool-t használja, ami időt takarít meg az esetleges problémák diagnosztizálásakor.

PHP verzió átállítása

Ha egy egyedileg beállított PHP-FPM pool-t kell átállítanunk, akkor módosítanunk kell néhány konfigurációs fájlt, majd újraindítani az érintett szolgáltatásokat:

FPM konfiguráció áthelyezése a másik PHP verzió alá

Hogy jobban átláthassuk az egészet, először egy tree és grep parancs kombinációval kilistázzuk a PHP7.4, PHP8.0 és PHP8.2 könyvtárait, ahonnan kiszűrjük a felesleges ini fájlokat (a PHP bővítmények ini fájljait) tartalmazó conf.d és mods-available könyvtárakat, valamint az átmeneti ini fájlokat (~<időbélyeg>.ini), és csak a példa szempontjából fontos .conf és php.ini fájlokat jelenítjük meg.

A parancsot a /etc/php könyvtárból futtathatjuk:

tree -a 7.4/ 8.0/ 8.2/ -I "conf.d|mods-available" | grep -v "~"

A PHP könyvtárstruktúra áttekintése

Itt ami most kell nekünk a példa szemléltetésére az a két PHP verzió (7.4 és 8.2), és azon belül is az "fpm" alkönyvtárak tartalma. A PHP8.0-át szintén csak a példa kedvéért vettem fel a felsorolásba.

Itt láthatjuk, hogy a phpmyadmin.conf fájlunk a PHP7.4 alatti FPM pool-ban található.

Első lépésként ezt a fájlt kell átmozgatnunk a kívánt cél PHP verzió alatti párhuzamos könyvtárba, ami az én példámban a 8.2-es PHP. Ehhez futtassuk az alábbi parancsot, persze a saját verzióinkkal behelyettesítve:

mv 7.4/fpm/pool.d/phpmyadmin.conf 8.2/fpm/pool.d/

Persze ügyeljünk a relatív könyvtárak használatánál, hogy a megfelelő könyvtárból indítsuk a parancsot, vagy használjunk abszolút eléréseket.

A parancs után nálam így néz ki a struktúra:

A PHP könyvtárstruktúra ismételt áttekintése

A fájl tehát átkerült a másik PHP ág alá. Ezután folytatjuk a következő lépéssel.

 

 

FPM konfiguráció módosítása

Ebben a lépésben módosítjuk az imént áthelyezett PHP-FPM konfigurációs fájlt:

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

Természetesen itt is a saját fájlunkat helyettesítsük be.

És itt keressük meg a "listen = /run/php/..." kezdetű sort, és módosítsuk a beállítani kívánt PHP verziónknak megfelelően:

; Pool-unk neve
[phpmyadmin]

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

; Socket fájl
listen = /run/php/php7.4-phpmyadmin-fpm.sock
listen = /run/php/php8.2-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

[...]

Apache konfiguráció módosítása

A következő lépésben módosítsuk hasonlóképpen a phpMyAdmin vagy a saját egyéb webalkalmazásunk Apache konfigurációját. Ebben a példában az alábbi paranccsal:

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

És itt a már korábban is említett és kiemelt részben is módosítsuk a socket fájlunk nevét a beállítani kívánt PHP verzióéra:

[...]
	# 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"
			SetHandler "proxy:unix:/run/php/php8.2-phpmyadmin-fpm.sock|fcgi://localhost"	
		</FilesMatch>
	</IfModule>
	# PHP-FPM beállítás vége
[...]

Természetesen bármilyen nevet adhatunk a fájlunknak, a lényeg, hogy az Apache konfigurációban és az FPM konfigurációban egyező nevek legyenek, valamint a korábban említett következetesség elvét is kövessük, hogy később is átlátható maradjon a rendszerünk.

Szolgáltatások újraindítása

Végül indítsuk újra az érintett szolgáltatásokat:

  • Apache
  • Forrás PHP-FPM (ahonnan átállítottuk a pool-unkat)
  • Cél PHP-FPM (ahová átállítottuk a pool-unkat)
systemctl restart apache2
systemctl restart php7.4-fpm.service
systemctl restart php8.2-fpm.service

Itt fontos, hogy mindkét FPM-et indítsuk újra, hogy egyrészt frissüljenek a pool-ok mindegyikben, és hogy ne jöhessen létre ütközés például azáltal, hogy két FPM-ben is létezik ugyanaz a pool, mivel a korábbi mondjuk nem frissült, stb.

 

Ellenőrzés

Végül ellenőrizzünk mindent. Nézzük meg a webes részeket:

phpMyAdmin ellenőrzése a beállítások után

phpinfo ellenőrzése a beállítások után

Ezeknél minden rendben, a PHP 8.2 ágon fut a webes felület.

Még nézzük meg a PHP-FPM-eket is:

systemctl status php7.4-fpm.service
systemctl status php8.2-fpm.service

PHP-FPM ellenőrzése a beállítások után

Amint láthatjuk, itt is átkerült a 7.4-es FPM kezeléséből a 8.2-esbe a "phpmyadmin" nevű pool-unk.

Ezzel tehát a webes felületünk - jelen esetben a phpMyAdmin - egy külön pool-ban marad az újabb verzió beállítása után is, így továbbra is elszigetelten működtethetjük az alapértelmezett PHP-FPM beállításaitól és a többi weboldal PHP környezetétől is egyaránt. Így ha például szükségünk van valamilyen php.ini érték beállításra, akkor ezt már megtehetjük külön az adott webalkalmazás pool-jának konfigurációjában. Erről is ejtettünk néhány szót már korábban, itt nézhetjük át az ilyen beállításoknak a menetét:

 

 

Konklúzió

A PHP-FPM (FastCGI Process Manager) egy rendkívül erőteljes és rugalmas eszköz a PHP webalkalmazások dinamikus és hatékony kiszolgálására. fő képessége, hogy finomhangolja a folyamatkezelést, optimalizálja a erőforrás-használatot, és javítja a válaszidőket, elengedhetetlenné teszi a modern webes alkalmazások kiszolgálásában. Az egyedi pool konfigurációkkal való munka, a moduláris conf.d könyvtárstruktúra használata, és a PHP verziók közötti rugalmas váltások lehetővé teszik a fejlesztők és rendszeradminisztrátorok számára, hogy pontosan szabályozzák és testreszabhassák a szerver környezetet, hogy az a lehető legjobban megfeleljen a különböző alkalmazások és forgatókönyvek igényeinek.

Az itt bemutatott verzió váltó beállítások használhatók minden olyan helyen, ahol kézzel állítottuk be korábban a PHP-FPM-et, így ezek a weboldalak vagy webalkalmazások is naprakész PHP környezetben futhatnak.

Ezek a beállítások mindkét forgatókönyv esetén rendkívül egyszerűek, de igyekeztem sok elméleti résszel is szolgálni, hogy könnyebb legyen megérteni a működési elvet azoknak, akik most ismerkednek ezekkel a részekkel.