Hogyan telepítsük fel a PHP-FPM-et egy Debian 8 (Jessie) LAMP szerverre (2. oldal)

botond küldte be 2019. 03. 24., v – 12:54 időpontban

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.

Én ebben a példában a "weboldal1" nevet fogom használni mindenhol, hogy áttekinthető maradjon az egész folyamat. Természetesen ehelyett bármilyen név használható.

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.

Korábban én ezen a LAMP szerveren beállítottam a felhasználói webkönyvtárak külső elérését, ahol a webkönyvtárak a /home/<felhasználó>/public_html/ könyvtárakban vannak. Hogy következetes legyek, ezt a sémát folytatom itt is, de választható ettől eltérő webkönyvtár is.

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
Itt természetesen bármilyen fájlnév megadható, de célszerű a weboldal nevével azonos, vagy azt tartalmazó nevet választani, hogy később több weboldalnál se legyen összekeverhető.

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
Itt fontos hogy .conf-ra végződjön a létrehozott fájl, különben a lentebb lévő weboldal konfigurációt engedélyező a2ensite parancs hibát fog dobni. Ha mégis más fájlnév végződést szeretnénk használni, akkor kézzel kell létrehozni a symlinket az Apache mods-enabled alkönyvtárában.

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:

PHP-FPM tesztelése

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:

PHP-FPM - PHP-t futtató felhasználó ellenőrzése

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

PHP-FPM a külső elérésű felhasználói webkönyvtárban

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.

 

 

Lapozó

Ez a leírás több oldalból áll: