Hogyan telepítsük fel a PHP-FPM-et egy Debian 8 (Jessie) LAMP szerverre

botond küldte be 2019. 03. 24., v - 12:50 időpontban

Az 1. oldal tartalma

 

Bevezető

Többfelhasználós szerverkörnyezetben elengedhetetlen a nagyobb fokú biztonság és a felhasználók webkönyvtárainak egymástól való függetlensége. A PHP telepítésekor alapból a mod_php szerver API-t használja a futtatott weboldalaknál, ami fejlesztői környezetként megfelelő, de egy többfelhasználós, több weboldalt futtató éles szervernél már nem ajánlott. Hátrányai között szerepel például, hogy a futtatott weboldalak mindegyikénél ugyanazzal a felhasználóval hajtja végre az oldalakon lévő szerver oldali PHP scripteket, ami nem biztonságos. Továbbá a statikus weboldalaknál is betöltődik az Apache PHP modulja, ami többlet erőforrást igényel.

Vannak azonban ennél fejlettebb, biztonságosabb és hatékonyabb megoldások, mint például a FastCGI, vagy ennek a továbbfejlesztett változata – a CGI vonal jelenlegi legmodernebb PHP futtatási módja – a PHP FastCGI Process Manager, elterjedtebb nevén PHP-FPM. A PHP-FPM főbb előnyei a mod_php-hez képest:

  • A PHP-t nem az Apache futtatja, hanem egy az Apache-től különálló FastCGI szerver, az FPM. Így a statikus weboldalak lekérésénél nem kerül betöltésre.
  • A weboldalak PHP fájljait nem csak az Apache felhasználója (www-data) futtathatja, hanem lehetőség van minden weboldal számára a hozzárendelt linux felhasználóját beállítani erre. Így például a felhasználók nem férhetnek hozzá a másik felhasználó weboldalának dolgaihoz.
  • Az előzőből eredően a tárhely feltöltéséhez használt FTP programok is futtathatók ugyanennek a felhasználónak a nevében, ezáltal az FTP-n keresztül feltöltött és a weboldal űrlapjaival feltöltött fájloknak ugyanaz lesz a tulajdonosa, így nem kell folyamatosan állítgatni a jogosultságokat.
  • Lehetőség van minden weboldal számára, hogy külön php.ini fájlt használjon, ezáltal minden weboldal PHP környezete egyedileg is finomhangolható.
  • Adaptív folyamat menedzsment az optimális szerver erőforrás kihasználás érdekében. Ez azt jelenti, hogy a PHP-FPM akkor és annyi folyamatot indít el a szerveren, amennyi éppen szükséges a szerverre beérkező pillanatnyi Apache kérelmek alapján.

És még rengeteg előnye van, ami inkább a háttérben működő dolgokkal kapcsolatosak.

 

 

Előfeltételek

Ebben a leírásban egy alap Debian 8 (Jessie) LAMP szerverre fogjuk feltelepíteni és bekonfigurálni a már fent lévő alapértelmezett PHP 5.6-os mod_php mellé a PHP-FPM-et. Tehát itt a PHP verziója nem változik, csak annak a futtatási módja.
Az ettől eltérő szerverkörnyezetre illetve disztribúcióra történő telepítés esetén nincs garancia, hogy működni fog.

 

Csomagok frissítése és telepítése

Frissítsük a csomagtárakat és a csomagjainkat az apt-get parancsokkal:

apt-get update
apt-get upgrade

Ezután telepítsük a php5-fpm csomagot:

apt-get -y install php5-fpm

A csomag a PHP motorhoz és annak számos bővítményéhez biztosítja az FPM támogatást. Telepítésekor engedélyezi a PHP bővítményeket az FPM SAPI számára:

A php5-fpm csomag telepítésekor engedélyezi a bővítményeket a PHP-FPM SAPI számára

 

PHP-FPM ellenőrzése

A csomagok feltelepítése után ellenőrizhetjük is a PHP-FPM működését. Először indítsuk el:

service php5-fpm start

Majd az alábbi systemctl paranccsal kérdezzük le az állapotát:

systemctl status php5-fpm.service

Erre hasonló kimenetet kell adnia:

 php5-fpm.service - The PHP FastCGI Process Manager
   Loaded: loaded (/lib/systemd/system/php5-fpm.service; enabled)
   Active: active (running) since sze 2019-03-13 14:33:46 CET; 3h 3min ago
 Main PID: 25865 (php5-fpm)
   Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec"
   CGroup: /system.slice/php5-fpm.service
           ├─25865 php-fpm: master process (/etc/php5/fpm/php-fpm.conf)
           ├─25866 php-fpm: pool www
           └─25867 php-fpm: pool www

márc 13 17:36:38 szerver1 systemd[1]: Started The PHP FastCGI Process Manager.

 

PHP-FPM beállítása

A PHP-FPM beállítása sokféleképpen lehetséges. Ebben a leírásban a mod_proxy_fcgi Apache modul által kínált jelenlegi legújabb módszert tekintjük át, ami a Debian 8 (Jessie) rendszerben lévő Apache 2.4.10-es verziójától használható. A módszer a webkiszolgáló fordított proxy-ként történő használatának elvén alapul, ami röviden annyit jelent, hogy a kiszolgálóhoz beérkező PHP kéréseket az Apache Handler segítségével átirányítja egy FastCGI szervernek, ami jelen esetben a PHP-FPM.

Valamint megismerkedünk ennek a módszernek többféle felhasználási módjával is.

Először engedélyezni kell a mod_proxy_fcgi Apache modult:

a2enmod proxy_fcgi

Globális beállítás (egyfelhasználós mód)

A legegyszerűbb beállítási mód, amikor globálisan az egész szerveren egyszerre engedélyezzük a PHP-FPM-et, amit ugyanazzal a linux felhasználóval futtatunk. Erre akkor lehet szükség, amikor a szervert csak fejlesztői környezetként használjuk, és nincs szükségünk a többfelhasználós webkörnyezetre, mivel csak mi magunk használjuk az egészet. Ekkor nem kell minden weboldalt külön felhasználóként futtatni, ezáltal egy felhasználóként tudjuk őket fejleszteni, karbantartani a fájlok tulajdonosainak keveredése nélkül, ami sokkal kényelmesebb munkakörnyezetet teremt. Mindemellett ugyanúgy kihasználhatjuk a PHP-FPM többi előnyét. Ez a beállítási forma tehát opcionális, ha így kívánjuk használni a PHP-FPM-et, csak akkor hajtsuk végre a globális beállításhoz tartozó részeket.

 

 

Beállítás Unix domain socket (UDS) használatával

A Unix domain socket (UDS) egy viszonylag új dolog az Apache történetében, mindössze csak a 2.4.9-es verziójától tudja kezelni. Használata akkor jön jól, ha az Apache webkiszolgáló és az általa hívott FastCGI szerver (jelen esetben ez a PHP-FPM) egy fizikai szerveren vannak, ilyenkor a rendszer helyi socket-jein keresztül kommunikálnak egymással. Ennek előnye, hogy a webkiszolgálóhoz beérkező PHP kéréseknek nem kell áthaladniuk a különböző hálózati protokollokon, hanem csak a helyi fájlrendszerben történik írás/olvasás. Tehát ez a beállítási mód valamennyivel jobb kiszolgálói teljesítményt nyújt.

Nyissuk meg a www.conf fájlt:

nano /etc/php5/fpm/pool.d/www.conf

Majd keressük meg az alábbi részeket, és állítsuk be ennek megfelelően:

[...]
user = www-data
group = www-data
[...]
listen = /var/run/php5-fpm.sock
[...]
listen.owner = www-data
listen.group = www-data
[...]
security.limit_extensions = .php .html
[...]

Itt az alapbeállítás szerint is a www-data van beállítva mindenhol, de azért betettem, ha esetleg mégse így lenne valahol.

A legutolsó beállítás gondoskodik arról, hogy a html fájlokban beágyazott módon lévő PHP kódokat is végrehajtsa a PHP-FPM ugyanúgy, mint magukat a php fájlokat. Szükség esetén még bővíthető a kívánt fájlkiterjesztésekkel, amikben php kódokat szeretnénk futtatni.

Indítsuk újra a PHP-FPM-et:

systemctl restart php5-fpm.service

Ekkor a PHP-FPM létrehozza a beállított helyen a socket fájlt.

Ezután jön az Apache rész. Nyissuk meg (vagy hozzuk létre, amennyiben nincs) a /etc/apache2/mods-available/proxy_fcgi.conf fájlt:

nano /etc/apache2/mods-available/proxy_fcgi.conf

És tegyük bele a következő részt:

<IfModule mod_proxy_fcgi.c>
	<FilesMatch "\.(php|html)$">
		SetHandler "proxy:unix:/var/run/php5-fpm.sock|fcgi://localhost"
	</FilesMatch>
</IfModule>
Itt szintén meghatározzuk a FilesMatch direktíva segítségével, hogy az Apache mely fájlkiterjesztéseket továbbítsa a blokkban megadott FastCGI feldolgozónak. Ennek szinkronban kell lennie a fentebb már felsorolt fájlkiterjesztésekkel, hogy gond nélkül működjön.

Mentsük le, majd indítsuk újra az Apache-ot:

systemctl restart apache2.service

És készen is vagyunk.

Beállítás TCP socket használatával

A TCP socket-ek segítségével lehetőség van a PHP-FPM-et egy másik szerveren futtatni, így a távoli gép IP-címével és portszámával is hivatkozhatunk rá.

Beállítása majdnem ugyanúgy történik, mint a Unix socket-ek esetén, kivéve a beállítások 1-1 sorát.

nano /etc/php5/fpm/pool.d/www.conf
[...]
user = www-data
group = www-data
[...]
listen = 127.0.0.1:9000
[...]
listen.owner = www-data
listen.group = www-data
[...]
security.limit_extensions = .php .html
[...]

Majd a PHP-FPM újraindítása:

systemctl restart php5-fpm.service

Apache beállítás:

nano /etc/apache2/mods-available/proxy_fcgi.conf
<IfModule mod_proxy_fcgi.c>
	<FilesMatch "\.(php|html)$">
			SetHandler "proxy:fcgi://localhost:9000/"
	</FilesMatch>
</IfModule>

Végül Apache újraindítás:

systemctl restart apache2.service

 

 

Tesztelés

Teszteléséhez hozzunk létre a szerveren a document root könyvtárban egy php fájlt, amibe tegyük bele a következőt:

1
2
3
<?php
phpinfo();
?>

Majd a böngészőből betöltve a következőt kell látnunk:

PHP-FPM ellenőrzése a phpinfo-val

Itt ahova a zöld pöttyöt is tettem, a Server API sorában a "FPM/FastCGI" értéknek kell lennie. Majd lejjebb görgetve pedig ellenőrizhetjük a PHP-t futtató felhasználót, és a felhasználói, illetve dokumentum gyökér könyvtárakat:

PHP-FPM ellenőrzése a phpinfo-val

 

A következő oldalon folytatjuk a PHP-FPM weboldal-specifikus beállításával...

 

 

Lapozó

Ez a leírás több oldalból áll: