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>