PHP FPM használata

PHP kódok szerveroldali futtatásának legegyszerűbb módja a mod_php api használata. Azonban ez a megoldás éles-, többfelhasználós környezetben számos biztonsági kockázatot rejt. A leírásból megtudhatod, hogy milyen alternatív megoldás létezik ennek a problémának a kezelésére.

Rövid ismertető

A leírás az Apache2 webszerre vonatkozik. Amennyiben szerveroldali php kódot szeretnénk futtatni, a legegyszerűbben ezt úgy tudjuk megtenni, hogy telepítjük a libapache2-mod-php csomagot. Így az Apache webszerver egy hozzá érkező kérés esetén php kóddal találkozva, átadja azt feldolgozásra a rendszerre telepített aktuális verziójú php motornak, mely feldolgozást követően vissza adja az eredményt az Apache webszervernek. Mi a probléma ezzel?

  • Minden weboldal, amit az Apache kiszolgál, azonos felhasználói jogosultsággal fut. Egy biztonság szempontjából gyenge-, támadható weboldal, az összes többi-, a kiszolgáló által működtetett site-ot magával rántja.
  • Bizonyos weboldalak más-más verziójú php támogatást igényelhetnek. Például a cikk irásakor a nextcloud, wordpress leginkább a php7.3 támogatását igényeli, míg az ISPConfig3 a régebbi php7.0-al szeret együttműködni

A megoldás 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.

Telepítés

Első körben telepítsük a szükséges csomagokat. Azt, hogy a rendszerünk milyen környezetet támogat, az apt-cache search php paranccsal tudjuk ellenőrízni. Amennyiben valamely php verziót modulként használtuk, tiltsuk azt le, persze az aktuális verziónkat adjuk meg, ez esetben a php7.0

a2dismod php7.0

Telepítsük a használni kívánt php-fpm verziót

apt install libapache2-mod-fcgid && apt install php7.3-fpm

Engedélyezzük a szükséges modult

a2enmod proxy_fcgi setenvif
service php7.3-fpm start
service apache2 restart

Néhány beállítást érdemes lehet átállítani

nano /etc/php/7.3/fpm/php.ini
memory_limit = 256M
upload_max_filesize = 100M
max_execution_time = 360

Az Apache webszervert több módon is rábírhatjuk, hogy használja a php-fpm szolgáltatást. Egyik mód az, hogy engedélyezzük a konfiguráció használatát

a2enconf /etc/apache2/conf-available/php7.3-fpm.conf
service apache2 restart

A másik megoldás, hogy az adott weboldal konfigurációs állományában adjuk meg, az aktuális php-fpm beállításokat. Tulajdonképpen a php7.3-fpm.conf elérését include-oljuk a virtualhost szekcióban.

nano /etc/apache2/site-available/000-default.conf
Include conf-available/php7.3-fpm.conf

Az Apache webszerver szolgáltatás újraindítása után már a 7.3 php verzió lesz használatban. A konfiguráció az /etc/php/7.3/fpm/php-fpm.conf elérési útvonalon érhető el. Tulajdonképpen ennyi, egy alap környezet kiépítése.

Beállítás UDS Unix Domain Socket 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/php7.3/fpm/pool.d/www.conf

Majd módosítsuk az alábbi szekciókat

[...]
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
[...]

Szolgáltatás újraindítása után elérhető a socket. Apache beállítása:

<IfModule mod_proxy_fcgi.c>
	<FilesMatch "\.(php|html)$">
		SetHandler "proxy:unix:/var/run/php5-fpm.sock|fcgi://localhost"
	</FilesMatch>
</IfModule>

TCP Socket használata

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/php7.3/fpm/pool.d/www.conf

Majd módosítsuk az alábbi szekciókat

[...]
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
[...]

Szolgáltatás újraindítása

service php7.3-fpm.service restart

Apache beállítáta:

<IfModule mod_proxy_fcgi.c>
	<FilesMatch "\.(php|html)$">
			SetHandler "proxy:fcgi://localhost:9000/"
	</FilesMatch>
</IfModule>