Tartalomjegyzék
PHP-FPM
- Szerző: Sallai András
- Copyright © 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
<VirtualHost *:80> ... Alias /kek /srv/www/kek/htdocs <Directory /srv/www/kek/htdocs> Require all granted <FilesMatch "\.php$"> SetHandler "proxy:fcgi://127.0.0.1:9000" </FilesMatch> </Directory> </VirtualHost>
Teszteléshez hozzunk létre egy egyszerű PHP weblapot:
# mkdir /srv/www/kek/htdocs/ # nano /srv/www/kek/htdocs/index.php
Tartalma:
<?php phpinfo();
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.