[[oktatas:linux:webszerver|< Webszerver]]
====== PHP-FPM ======
* **Szerző:** Sallai András
* Copyright (c) Sallai András, 2018
* Licenc: GNU Free Documentation License 1.3
* Web: http://szit.hu
===== A PHP-FPM =====
Az FPM a **FastCGI Process Manager** rövidítése. Segítségével egyes könyvtárakon
a PHP scriptek különböző felhasználók nevében futtathatók.
Ezt szeretjük, mert nagyban növeli a weboldalak biztonságát.
Ugyanakkor a gyorsabb futást is eredményez, mivel a PHP
értelmező a memóriában marad, nincs újra és újra betöltés,
mint egy szimpla CGI esetén.
A PHP-FPM segítségével önálló medencéket hozunk létre, amelyeket
egy adott könyvtárhoz, és egy adott felhasználóhoz köthetünk.
Minden újabb könyvtárhoz egy új medencét (pool) kell létrehoznunk.
A mi döntésünk, hogy egy könyvtárhoz, vagy egy külön virtuális webhelyhez (VirtualHosthoz) hozunk létre medencét.
A parancsok elején a "#" jel, annyit jelent, hogy rendszergazdaként (rootként) kell futtatni.
Az alábbi leírásban egy Debian 9-en mutatjuk be a beállításokat, a 000-default webhelyen.
A beállítás természetesen bármely virtuális webhely, bármely könyvtára is beállítható.
Az itt beállított könyvtár egy "kek" alkönyvtár, és egy 9000-es portot foglalunk le számára.
A példában feltételezzük, hogy a szerver IPv4 címe:
* 192.168.10.2
===== Telepítés =====
Szükségünk van az Apache2 és a PHP-FPM csomagra. Telepítés Debian 9 alatt:
# apt install apache2 php-fpm
Ilyenkor a php7.0 csomag nem szükséges.
===== Beállítások =====
A PHP-FPM alapértelmezetten egy www-data nevű felhasználóhoz tartalmaz egy medencét, de
ezt mi most nem használjuk. Helyette egy "kek" nevű felhasználóhoz egy "kek" nevű medencét fogunk használni.
Fel kell vennünk a felhasználót:
# mkdir /srv/www
# groupadd kek
# useradd -d /srv/www/kek -c "PHP user" -m -s /bin/false -g kek kek
Medence létrehozása:
# nano /etc/php/7.0/fpm/pool.d/kek.conf
A fájl tartalma:
[kek]
listen = 127.0.0.1:9000
user = kek
group = kek
pm = dynamic
pm.max_children = 5
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.start_servers = 2
A fenti medence példa egy minimális beállítást tartalmaz. Az /etc/php/7.0/fpm/pool.d/www.conf ennél
több mintával és magyarázattal szolgálhat számunka.
Másoljuk a VirtualHost direktíva végére az Alias és a Directory bejegyzéseket, a kívánt virtuális webhelyen (VirtualHost). Mi ehhez most a 000-default.conf-ot használjuk.
# nano /etc/apache2/sites-available/000-default.conf
...
Alias /kek /srv/www/kek/htdocs
Require all granted
SetHandler "proxy:fcgi://127.0.0.1:9000"
Teszteléshez hozzunk létre egy egyszerű PHP weblapot:
# mkdir /srv/www/kek/htdocs/
# nano /srv/www/kek/htdocs/index.php
Tartalma:
Engedélyezzük a proxy_fcgi apache modult:
# a2enmod proxy_fcgi
Indítsuk újra a PHP-FPM-et és az Apache-ot:
# systemctl restart apache2 php7.0-fpm
===== Hiba esetén =====
Gyakran előfordul a konfigurációs fájlban elírás, ami az újraindításkor azonnal jelentkezik. A naplóállományok segítenek a probléma megtalálásában.
Hiba esetén kövessük a /var/log/syslog utolsó sorait:
# tail /var/log/syslog
Esetleg így:
# tail -f /var/log/syslog
===== Ellenőrzés =====
Ellenőrzéshez, nézzük meg milyen folyamatok futnak:
# ps axf
A kimenet ehhez hasonló lesz:
8366 ? Ss 0:00 php-fpm: master process (/etc/php/7.0/fpm/php-fpm.co
8369 ? S 0:00 \_ php-fpm: pool kek
8370 ? S 0:00 \_ php-fpm: pool kek
8371 ? S 0:00 \_ php-fpm: pool www
8372 ? S 0:00 \_ php-fpm: pool www
8381 ? Ss 0:00 /usr/sbin/apache2 -k start
8382 ? Sl 0:00 \_ /usr/sbin/apache2 -k start
8383 ? Sl 0:00 \_ /usr/sbin/apache2 -k start
Esetleg a felhasználókat is lekérdezhetjük:
# ps axfu
root 7185 0.1 2.5 222580 26164 ? Ss 17:26 0:00 php-fpm: maste
kek 7194 0.0 0.6 222572 6240 ? S 17:26 0:00 \_ php-fpm: p
kek 7195 0.0 0.6 222572 6240 ? S 17:26 0:00 \_ php-fpm: p
www-data 7196 0.0 0.6 222572 6240 ? S 17:26 0:00 \_ php-fpm: p
www-data 7197 0.0 0.6 222572 6240 ? S 17:26 0:00 \_ php-fpm: p
root 7198 0.0 0.4 75608 4360 ? Ss 17:26 0:00 /usr/sbin/apac
www-data 7199 0.0 0.3 364768 4052 ? Sl 17:26 0:00 \_ /usr/sbin/
www-data 7200 0.0 0.3 364768 4052 ? Sl 17:26 0:00 \_ /usr/sbin/
A kimenetben láthatjuk, hogy az FPM egy két medencét futtat. Az egyik a www, a másik kek.
A www medence a www-data nevében, fut a kek medence a kek felhasználó nevében.
A "kek" név helyére helyettesítsük be saját domain nevünket, vagy könyvtárnevünket.
Vizsgáljuk meg, hogy a 9000-es porotn figyel-e a PHP-FTPM:
# ss -lt4
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:ssh *:*
LISTEN 0 128 127.0.0.1:9000 *:*
LISTEN 0 128 *:http *:*
A Debian 9.4 hibája miatt lásd még a következő fejezetet.
Egy böngészőben írjuk be a szerverünk IP címét (pl. 192.168.10.2), majd a "kek" nevű könyvtárat:
http://192.168.10.2/kek/
A weboldal kimenet ehhez hasonló kell legyen:
| ... ||
| Server API | FPM/FastCGI |
| Virtual Directory Support | disabled |
| Configuration File (php.ini) Path | /etc/php/7.0/fpm |
| Loaded Configuration File | /etc/php/7.0/fpm/php.ini |
| Scan this dir for additional .ini files | /etc/php/7.0/fpm/conf.d |
| ... ||
A kimeneteben jól látszik, hogy a FPM/FastCGI módban fut a könyvtár.
A weboldalon keressünk még rá a "user" szóra, hogy megtudjuk milyen
felhasználó nevében fut a weboldal. Esetünkben ott is a "kek" felhasználó
kell szerepeljen.
===== Megjegyzés a Debian 9.4-hez =====
A Debian 9.4 verzióban az apache nem hallgatózik IPv4-en csak IPv6-on.
Ha ez a hiba fenn áll, szerkesszük a ports.conf állományt:
# nano /etc/apache2/ports.conf
A Listen *:80 sort javítsuk így:
Listen 0.0.0.0:80
Indítsuk újra az apache-ot:
systemctl restart apache2
Ellenőrzés:
# ss -lt4
Ha szükségünk van IPv6-ra is, akkor két sort vegyünk fel:
Listen 0.0.0.0:80
Listen [::]:80
===== Megjegyzés =====
A PHP-FPM mellett állítólag nem használható a .htaccess. Ezt egyelőre nem ellenőriztem.
===== Források =====
* https://www.server-world.info/en/note?os=Debian_9&p=httpd&f=13 (2018)
* https://tarhelywiki.hu/?p=688 (2018)