[[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)