A 2. oldal tartalma
Folytatás
Az első oldalon feltelepítettük a PHP-FPM-et és megnéztük, hogyan használhatjuk globális beállításokkal az egész szerveren. Ezen az oldalon pedig megismerjük a pool-ok használatát, melyek segítségével minden weboldalt külön felhasználóként futtathatunk, valamint külön php.ini beállításokat is alkalmazhatunk rajtuk.
PHP-FPM beállítása
Weboldalfüggő beállítás (többfelhasználós mód)
Ha egy éles webszervert szeretnénk kialakítani és ki szeretnénk használni a PHP-FPM igazi erejét, akkor beállíthatjuk hogy minden weboldal PHP kódja különböző Linux felhasználóként fusson, valamint mindegyik weboldal számára egyedi php beállításokat használhatunk. Ezáltal a weboldalak elszigetelten működhetnek egymástól, és az ügyfelek jogosultságai sem keverednek. Ennek megvalósításához a PHP-FPM a pool-okat használja, ahol részletesen megadhatunk minden egyedi beállítást.
Linux felhasználó és a webtárhely létrehozása
Első körben hozzunk létre egy Linux felhasználót, amivel futtatni szeretnénk majd az új weboldalt.
Lépjünk be root-ként, majd hozzuk létre a felhasználót az adduser paranccsal:
adduser weboldal1
A parancs bekéri a felhasználó jelszavát és megerősítését, valamint még néhány adatot, majd létrehozza a felhasználót.
A felhasználó home könyvtára a következő lett: /home/weboldal1/.
Ezután hozzunk létre egy könyvtárat a weboldalnak. Ez lesz a webgyökér könyvtár.
Belépve az új felhasználóval, a home könyvtárában hozzuk létre a webgyökér könyvtárat:
mkdir public_html
PHP-FPM pool beállítása
Ahogy fentebb is említettem, a PHP-FPM a pool-ok által tudja külön kezelni az egyes weboldalakhoz tartozó PHP beállításokat. A leírás első oldalán is érintettük már a dolgot a globális beállításoknál, amikor a /etc/php5/fpm/pool.d/www.conf fájlt szerkesztettük, ugyanis a PHP-FPM telepítésekor egyetlen pool kerül létrehozásra, ami egyben az alapértelmezett is, ez pedig a www.conf. Ebben a fájlban a www-data felhasználó van beállítva alapértelmezett PHP-t futtató felhasználónak és be volt még állítva egy alapértelmezett TCP socket is, ami a 9000-es porton figyelte a kéréseket. Ezt módosítottuk az UNIX socket-re, hogy többféleképpen is kipróbáljuk a működését. Így tulajdonképpen ezt az alapértelmezett pool-t állítottuk be globális használatra. Ahhoz viszont, hogy egy adott weboldalt egy külön pool-al tudjunk működtetni, le kell másolnunk ezt az alapértelmezett fájlt, majd ebben kell elvégeznünk a szükséges módosításokat.
Először tehát root-ként másoljuk le az alapértelmezett pool fájlt:
cp /etc/php5/fpm/pool.d/www.conf /etc/php5/fpm/pool.d/weboldal1.conf
Nyissuk meg szerkesztésre:
nano /etc/php5/fpm/pool.d/weboldal1.conf
és haladjunk végig sorban a szükséges beállításokon:
[www]
Rögtön a fájl legelején állítsuk be a pool nevét a szögletes zárójelek között. Itt is célszerű ugyanazt a nevet használni, tehát nálam például: [weboldal1] lesz a beállítás. A rendszer a log fájlokban és a statisztikákban jeleníti meg ezt a nevet. Így később mi is ez alapján fogjuk tudni könnyen beazonosítani ezt a pool-t, ha bármi dolgunk lesz vele.
user és group
Itt állítsuk be a fentebb létrehozott Linux felhasználó nevét mindkettőnél. Ez a két beállítás határozza meg, hogy a PHP-FPM mely felhasználó és csoport nevében futtassa az al-folyamatokat.
listen
Itt most is kétféleképpen állíthatjuk be a PHP-FPM-et: unix socket vagy TCP socket alapján. A működési elv ugyanaz, ezért már nem részletezem a különbségeket további alcímek alatt, hanem csak a beállításokat.
Ha unix socket-et szeretnénk használni (egy gépen ez ajánlott), akkor egy új socket fájlt kell beállítanunk, ami még nem létezik a rendszerünkben. Itt a domain nevet is szokták kombinálni az alap socket fájl nevével, hogy egyértelműek legyenek az elnevezések (melyik PHP verziójú PHP-FPM futtatja melyik weboldalt), így tehát a beállításunk sora:
listen = /var/run/php5-fpm-weboldal1.local.sock
A socket fájl majd a PHP-FPM újraindítását követően jön létre a megadott könyvtárban.
Ha pedig TCP socket-et szeretnénk használni, akkor a portszámra kell figyelni. Itt is az a lényeg, hogy ha több weboldalunk/pool-unk van, ami TCP socket-el működik, akkor mindegyik külön portra legyen állítva. Például:
listen = 127.0.0.1:8999
Az alapértelmezett www pool-nál a 9000-es portszámot szokták beállítani "gyárilag", így mindig csökkentsük a portszámot, amikor újabb TCP működésű pool-t állítunk be. A portszámoknak az egész szerverre vonatkozóan kell egyedieknek lenniük, tehát ha a szerveren több különböző verziójú PHP-FPM rendszer fut, akkor sem fordulhat elő két egyforma portszám.
listen.owner és listen.group
Ezek a unix socket-re vonatkoznak, hogy milyen felhasználó és csoport legyen a socket fájl gazdája, tehát aki csatlakozni tud a PHP-FPM-hez. Mivel az Apache-ot a www-data felhasználó futtatja, ezeket a beállításokat állítsuk a www-data -ra. Illetve vegyük ki a sorok elől a kommenteket, amik alapból ott vannak.
security.limit_extensions
Itt pedig azokat a fájlkiterjesztéseket adjuk meg, amelyekben engedni szeretnénk, hogy lefussanak a PHP kódok. Ugyanúgy, mint a leírás első részében a globális beállításoknál. A felsorolt kiterjesztéseket ponttal kezdjük és szóközökkel válasszuk el, például:
security.limit_extensions = .php .html
Alapszinten ennyi beállítás elegendő a működéshez. Persze még rengeteg beállítási lehetőség van, de ezekről majd egy másik leírásban tájékozódhatunk.
Ha ezzel megvagyunk, mentsük le a fájlt, és indítsuk újra a PHP-FPM-et a systemctl paranccsal:
systemctl restart php5-fpm.service
Ezután ellenőrizhetjük a pool-ok működését:
systemctl status php5-fpm.service
Erre ilyesmi kimenetet kell hogy kapjunk:
● php5-fpm.service - The PHP FastCGI Process Manager
Loaded: loaded (/lib/systemd/system/php5-fpm.service; enabled)
Active: active (running) since p 2019-03-22 22:55:50 CET; 2min 16s ago
Process: 4030 ExecStartPre=/usr/lib/php5/php5-fpm-checkconf (code=exited, status=0/SUCCESS)
Main PID: 4035 (php5-fpm)
Status: "Processes active: 0, idle: 4, Requests: 0, slow: 0, Traffic: 0req/sec"
CGroup: /system.slice/php5-fpm.service
├─4035 php-fpm: master process (/etc/php5/fpm/php-fpm.conf)
├─4037 php-fpm: pool weboldal1
├─4038 php-fpm: pool weboldal1
├─4039 php-fpm: pool www
└─4040 php-fpm: pool www
márc 22 22:55:50 szerver1 systemd[1]: Started The PHP FastCGI Process Manager.
Itt látható, hogy elindult az alap www pool és a weboldal1 pool, mindegyik 2-2 processz-el, amik várják a PHP kéréseket. A PHP-FPM tehát már készen áll a használatra.
Virtualhoszt beállítása
Ahhoz, hogy működésre bírjuk az egészet, még az Apache oldalról is el kell végeznünk a megfelelő beállításokat. Létre kell hoznunk a weboldal számára a virtualhoszt konfigurációt, ami a weboldallal kapcsolatos Apache működési beállításait tartalmazza.
Root-ként maradva lépjünk be az Apache rendelkezésre álló weboldal konfigurációit tartalmazó könyvtárába:
cd /etc/apache2/sites-available
Majd hozzunk létre egy új fájlt a weboldal1.local nevű oldalunk számára:
nano weboldal1.local.conf
Ebbe tegyük bele a következő tartalmat:
<VirtualHost *:80> ServerName weboldal1.local ServerAlias www.weboldal1.local ServerAdmin webmaster@localhost DocumentRoot /home/weboldal1/public_html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined # PHP-FPM Helyi beállítása (proxy_fcgi modul függő SetHandler beállítás): <IfModule mod_proxy_fcgi.c> <Directory /home/weboldal1/public_html> <FilesMatch "\.(php|html)$"> # Unix socket alapú beállítás: SetHandler "proxy:unix:/var/run/php5-fpm-weboldal1.local.sock|fcgi://localhost" # TCP alapú beállítás: # SetHandler "proxy:fcgi://localhost:8999/" </FilesMatch> </Directory> </IfModule> </VirtualHost>
A konfiguráció az alábbiakat tartalmazza:
- <VirtualHost *:80> : A szabványos 80-as HTTP porton figyeli a beérkező kéréseket.
- ServerName: A weboldal domain neve
- ServerAlias: A weboldalhoz használt további aldomain, jelen esetben a www.
- DocumentRoot: Webgyökér könyvtár. Innen fut az oldal
- ErrorLog és CustomLog: Ide menti a hibanaplót és a lekéréseket tartalmazó naplófájlt.
- IfModule: Ellenőrzi a mod_proxy_fcgi modul jelenlétét a webszerveren, és csak ennek megléte esetén hajtja végre a blokkban lévő részeket.
- Directory: Csak a megadott könyvtárban érvényesíti a blokkban lévő részeket. Jelen esetben a weboldal gyökérkönyvtárában hajtja végre.
- FilesMatch: Csak a megadott fájlkiterjesztésekre alkalmazza a továbbiakat
- SetHandler: Ezzel adjuk meg, hogy az Apache hova továbbítsa az előző feltételeknek megfelelő kéréseket (adott könyvtárban a megadott fájltípusokra érkező kéréseket).
Itt betettem az Unix socket beállítást, és a TCP alapút is. Így a számunkra megfelelőt használjuk, a másik sorát törölhetjük, vagy kommentezhetjük.
Ez egy nagyon alap virtualhoszt beállítás, de elegendő ahhoz, hogy működjön vele egy weboldal. Mentsük le a fájlt, majd engedélyezzük a virtualhosztot:
a2ensite weboldal1.local
Ekkor a rendszer létrehoz egy szimbolikus linket az engedélyezett weboldalak konfigurációinak könyvtárában és felhívja a figyelmünket, hogy a változtatások érvénybe léptetéséhez indítsuk újra az Apache-ot.
Előtte még engedélyezzük a szükséges Apache modult:
a2enmod proxy_fcgi
És jöhet az Apache újraindítása:
systemctl restart apache2.service
Hosts fájl beállítása a kliens rendszerben
Ahhoz, hogy a böngészőnkből elérhessük a LAMP szerveren futó weboldalt, amihez nincs igazi domain név, a kliens oldalon még be kell állítani a hosts fájlban a megfelelő IP-cím - domain név társítást. A szerverre érkező kérésnél az Apache innen fogja tudni, hogy melyik virtualhost-ot kell feldolgoznia (névalapú virtualhost).
Ha Linux rendszerről szeretnénk elérni a LAMP szerveren lévő weboldalt, akkor a kliens rendszerről root-ként nyissuk meg a /etc/hosts fájlt, majd adjuk hozzá az alábbi két sort:
192.168.1.120 weboldal1.local 192.168.1.120 www.weboldal1.local
Az IP-cím nálam erre van beállítva az itt készülő virtuális gépekhez, természetesen állítsuk át a megfelelő IP-címre. A domain neveket pedig szintén állítsuk a saját megfelelő címünkre, amivel elvégeztük az eddigi beállításokat.
Ezzel a két sorral tehát www-vel és anélkül is elérhetővé tesszük az idáig létrehozott webtárhelyet.
Windows kliens rendszereknél pedig a c:\Windows\System32\drivers\etc\hosts fájlt kell szerkesztenünk rendszergazdaként, amibe ugyanígy beletehetjük a fentebbi két sort.
Ennek annyi hátránya van, hogy minden egyes gépen be kell állítani a hosts fájlt, ahonnan el szeretnénk érni az oldalt. Persze szükséges hozzá az is, hogy maga a szerver is elérhető legyen az IP-címe alapján a többi gépről. Tehát vagy ugyanabban a hálózatban kell lennie a szervernek is, vagy egy nyilvános IP-címmel kell rendelkeznie, ami bárhonnan elérhető. De egy otthoni fejlesztői környezetben kiváló megoldás, mert az oldalak működtetéséhez nem kell domain neveket vásárolgatni.
Tesztelés
Minden készen áll a PHP-FPM működtetésére az újonnan létrehozott tárhelyen, így már csak a tesztelés maradt hátra.
Lépjünk be az új felhasználónkkal a webgyökér könyvtárába:
cd ~/public_html/
És hozzunk létre egy php fájlt, amiben lekérdezzük a php információkat:
nano phpinfo.php
És tegyük bele ezt a pár sort:
<?PHP
phpinfo();
?>
Ha betöltjük a böngészőbe a domain névvel ezt a php fájlt és mindent jól csináltunk, akkor hasonló kimenetet kapunk, mint a leírás elején a globális beállításoknál:
Itt is láthatjuk a Server API sorában a FPM/FastCGI értéket, tehát működik a rendszer. Ha pedig lejjebb görgetünk, majdnem a legaljáig, akkor pedig a felhasználót is láthatjuk, aki futtatja ezen a webtárhelyen a PHP-t:
Itt pedig a frissen létrehozott felhasználónkat láthatjuk, valamint lejjebb a hozzá kapcsolódó megfelelő útvonalakat.
Íme tehát az egyedi weboldalra beállított PHP-FPM működése.
Extra
Ha már fentebb megemlítettem a felhasználói webkönyvtárak külső elérését, akkor extraként átfutjuk ennek is a PHP-FPM-el történő kivitelezését. Ezzel csak akkor foglalkozzunk, ha a szerveren beállítottuk az imént belinkelt beállítást és használni is kívánjuk.
Ez akkor lehet hasznos, ha például egy fejlesztői környezetben nem szeretnénk bíbelődni a virtualhost és a kliens oldali hosts fájl beállításával, vagy egy éles szerveren elérhetővé szeretnénk tenni a webtárhelyet, mielőtt még a domain nevet ráirányítanánk. Ehhez másoljuk ki a fenti virtualhost konfigurációból az alábbi részt (root-ként):
<IfModule mod_proxy_fcgi.c> <Directory /home/weboldal1/public_html> <FilesMatch "\.(php|html)$"> # Unix socket alapú beállítás: SetHandler "proxy:unix:/var/run/php5-fpm-weboldal1.local.sock|fcgi://localhost" # TCP alapú beállítás: # SetHandler "proxy:fcgi://localhost:8999/" </FilesMatch> </Directory> </IfModule>
Itt is az általunk preferált SetHandler beállítást használjuk (Unix socket / TCP port alapú beállítás).
Majd nyissuk meg az userdir konfigját:
nano /etc/apache2/mods-available/userdir.conf
És helyezzük el a kimásolt részt ebben a konfigurációban, hogy a következőképpen nézzen ki:
<IfModule mod_userdir.c>
UserDir public_html
UserDir disabled root
<Directory /home/*/public_html>
#AllowOverride FileInfo AuthConfig Limit Indexes
AllowOverride ALL
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
<Limit GET POST OPTIONS>
Require all granted
</Limit>
<LimitExcept GET POST OPTIONS>
Require all denied
</LimitExcept>
</Directory>
<IfModule mod_proxy_fcgi.c>
<Directory /home/weboldal1/public_html>
<FilesMatch "\.(php|html)$">
# Unix socket alapú beállítás:
SetHandler "proxy:unix:/var/run/php5-fpm-weboldal1.local.sock|fcgi://localhost"
# TCP alapú beállítás:
# SetHandler "proxy:fcgi://localhost:8999/"
</FilesMatch>
</Directory>
</IfModule>
</IfModule>
Ezután indítsuk újra az Apache-ot:
systemctl restart apache2.service
Innentől már elérhető ugyanez a PHP-FPM-el és külön felhasználóval működő webtárhely a következő formában:
http://<szerver IP-címe>/~weboldal1/
A PHPinfo kimenete pedig:
http://<szerver IP-címe>/~weboldal1/phpinfo.php
Természetesen így is csak akkor tudjuk elérni a weboldalt, ha a kliens gépről látható a szerver IP-címe. Viszont itt nem kell a kliens gépeken is beállítgatni a hosts fájlokat.
Konklúzió
Elsőre kicsit macerásnak tűnhet a PHP-FPM életre keltése, de ha egyszer ráérzünk az ízére, akkor nem fogjuk megbánni a befektetett munkát, hiszen az így futtatott weboldalak teljesítménye és stabilitása önmagáért fog beszélni. Pláne, egy mai, modern CMS rendszer esetén, ahol ki vannak hegyezve a dolgok a PHP környezetre.
Természetesen még rengeteg beállítási lehetőség van mind a PHP-FPM pool-jában, mind az Apache virtualhost konfigurációjában, de kiindulásnak kiválóak ezek a beállítások amikkel aztán még eljátszadozgathatunk, hogy hosszú távon is tökéletesen működtethessük a PHP-FPM segítségével a weboldalainkat. Egy másik leírásban részletesen átnézzük ezeket az extra beállításokat is.
- Enciklopédia - PHP-FPM
- Debian 8 (Jessie) LAMP szerver v1.0 telepítése
- Hogyan telepíthetünk újabb PHP verziókat Debian 9 (Stretch) LAMP szerverünkre PHP-FPM módban
- Hogyan állítsuk át manuálisan egy PHP-FPM pool-ban futó weboldalunk vagy webalkalmazásunk PHP verzióját?
- Enciklopédia - Apache HTTP Server
- apache.org - mod_proxy_fcgi
- wiki.apache.org - PHP-FPM
- A PHP 8 újdonságai és változásai
- Hogyan telepíthetjük fel a PHP 8-at Debian vagy Ubuntu rendszerű szerverünkre
Lapozó
- A hozzászóláshoz regisztráció és bejelentkezés szükséges
- 403 megtekintés