Képzeljünk el egy fejlesztőt, aki több izgalmas projektet kezel egyszerre: az egyik egy régebbi CakePHP alkalmazás, amit még tartani kell, a másik egy vadonatúj Laravel mikro-szolgáltatás, a harmadik pedig egy egyedi üzleti logika köré épülő, szintén Laravel alapú vállalatirányítási rendszer. Mindez egyetlen LAMP szerveren? Elsőre talán riasztóan hangzik, de higgyék el, nem lehetetlen! Valójában egy jól konfigurált környezetben ez egy hatékony és költséghatékony megoldás lehet, ha tudjuk, mire figyeljünk.
A LAMP (Linux, Apache, MySQL/MariaDB, PHP) stack régóta a webfejlesztés egyik alappillére, de a modern igények, mint például a különböző PHP verziók vagy a projektek közötti szigorú izoláció, új kihívásokat támasztanak. Cikkünkben részletesen bemutatjuk, hogyan oldhatja meg ezeket a feladatokat, és hogyan üzemeltethet több CakePHP vagy Laravel projektet egyetlen szerveren, anélkül, hogy az egyik a másik rovására menne.
A kezdeti nehézségek: Miért okoz fejfájást a több projekt?
A leggyakoribb probléma, amivel szembesülünk, amikor több PHP alapú rendszert szeretnénk futtatni egy gépen, az a PHP verziók eltérése. Egy régebbi CakePHP 3 projekt esetleg PHP 7.4-et igényel, míg egy friss Laravel 10 alkalmazás már PHP 8.2-t vagy újabbat. Ezt az Apache alapértelmezett PHP modulja (mod_php
) nem tudja kezelni. Emellett ott van az adatbázisok elkülönítése, a fájlrendszer biztonsága és a teljesítmény optimalizálása is, ami mind-mind kulcsfontosságú a zökkenőmentes működéshez.
De ne aggódjon! A megfelelő eszközökkel és beállításokkal ezek a gondok könnyedén orvosolhatók. Vágjunk is bele a megoldásokba!
1. Virtuális Hosztok – A LAMP alapja és az ajtó a több projekthez 🌐
Az Apache webkiszolgáló virtuális hosztok segítségével teszi lehetővé, hogy egyetlen IP-címen és porton több különböző webhelyet üzemeltessünk. Ez az első és legfontosabb lépés. Minden egyes CakePHP vagy Laravel alkalmazásnak szüksége van egy saját virtuális hoszt konfigurációra.
A koncepció egyszerű: az Apache a beérkező kérések Host
fejlécét vizsgálva dönti el, melyik konfigurációt, azaz melyik virtuális hosztot használja. Így a projekt1.hu
kérés a /var/www/projekt1/public
könyvtárba, míg a projekt2.hu
kérés a /var/www/projekt2/public
mappába irányítható.
Alapvető konfiguráció (példa):
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName projekt1.hu
DocumentRoot /var/www/projekt1/public
<Directory /var/www/projekt1/public>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/projekt1_error.log
CustomLog ${APACHE_LOG_DIR}/projekt1_access.log combined
</VirtualHost>
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName projekt2.hu
DocumentRoot /var/www/projekt2/public
<Directory /var/www/projekt2/public>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/projekt2_error.log
CustomLog ${APACHE_LOG_DIR}/projekt2_access.log combined
</VirtualHost>
Ne felejtsük el bekapcsolni a konfigurációkat (pl. sudo a2ensite projekt1.conf
) és újraindítani az Apache-ot (sudo systemctl restart apache2
)! Fejlesztői környezetben a /etc/hosts
fájl szerkesztésével is elirányíthatjuk a domain neveket a localhostra (127.0.0.1 projekt1.hu projekt2.hu
).
2. PHP Verziók Kezelése – A legnagyobb fejtörő és a megoldás: PHP-FPM 🤯
Ez a pont az, ami a legtöbb kihívást okozza, de szerencsére van rá elegáns megoldás: a PHP-FPM (FastCGI Process Manager). A mod_php
-val ellentétben, ami csak egy PHP verziót engedélyez globálisan, a PHP-FPM lehetővé teszi, hogy különböző PHP verziókat futtassunk elkülönített folyamatként, és ezeket az Apache-ból hívjuk meg.
A folyamat a következő:
- Telepítsük a szükséges PHP verziókat (pl.
sudo apt install php7.4-fpm php8.2-fpm
). - Engedélyezzük az Apache
proxy_fcgi
modulját (sudo a2enmod proxy_fcgi
). - Konfiguráljunk minden PHP-FPM verzióhoz egy saját FPM poolt. Ezeket általában a
/etc/php/[verzió]/fpm/pool.d/www.conf
fájlokban találjuk, de másolhatjuk és módosíthatjuk őket (pl.projekt1.conf
,projekt2.conf
néven), hogy saját felhasználóval és csoporttal fussanak, növelve a biztonságot. - Módosítsuk a virtuális hoszt konfigurációkat, hogy az Apache ne a
mod_php
-t, hanem a megfelelő PHP-FPM poolt használja.
PHP-FPM virtuális hoszt konfiguráció (példa):
<VirtualHost *:80>
# ... egyéb beállítások ...
ServerName projekt1.hu
DocumentRoot /var/www/projekt1/public
<FilesMatch .php$>
SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost/"
</FilesMatch>
# ... egyéb beállítások ...
</VirtualHost>
<VirtualHost *:80>
# ... egyéb beállítások ...
ServerName projekt2.hu
DocumentRoot /var/www/projekt2/public
<FilesMatch .php$>
SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost/"
</FilesMatch>
# ... egyéb beállítások ...
</VirtualHost>
Ez a megoldás forradalmasítja a több PHP projekt egyidejű futtatását. Teljesen izolálja a PHP futtatókörnyezeteket, így egyik projekt sem befolyásolja a másikat, és mindegyik a számára optimalizált PHP verziót kapja. Ahogy a valós gyakorlatban tapasztaltam, ez az egyik legfontosabb lépés a stabil és karbantartható környezet eléréséhez.
A PHP-FPM bevezetése egy LAMP szerveren nem csupán technikai lépés, hanem filozófiai váltás is: a „minden egy kalap alá” szemléletről áttérünk a „minden projektnek megvan a saját, elkülönített környezete” elvre, ami hosszú távon óriási előnyöket jelent.
3. Adatbázis Kezelés – A MySQL/MariaDB alapjai és a biztonság 💾
Minden CakePHP és Laravel projektnek szüksége van egy adatbázisra. A legjobb gyakorlat az, ha minden alkalmazáshoz különálló adatbázist hozunk létre, és ami még fontosabb, külön adatbázis felhasználót is. Ez növeli a biztonságot, hiszen ha egy projekt biztonsága valamilyen okból kompromittálódik, az nem befolyásolja a többi rendszer adatbázisait.
Lépések:
- Lépjünk be a MySQL/MariaDB konzolba (
sudo mysql -u root -p
). - Hozzuk létre az adatbázisokat:
CREATE DATABASE projekt1_db;
,CREATE DATABASE projekt2_db;
. - Hozzuk létre a felhasználókat és állítsunk be erős jelszavakat:
CREATE USER 'projekt1_user'@'localhost' IDENTIFIED BY 'erős_jelszó1';
,CREATE USER 'projekt2_user'@'localhost' IDENTIFIED BY 'erős_jelszó2';
. - Adjuk meg a megfelelő jogosultságokat:
GRANT ALL PRIVILEGES ON projekt1_db.* TO 'projekt1_user'@'localhost';
,GRANT ALL PRIVILEGES ON projekt2_db.* TO 'projekt2_user'@'localhost';
. - Ne felejtsük el
FLUSH PRIVILEGES;
paranccsal frissíteni a jogosultságokat.
Mindig törekedjünk a legkevesebb privilégium elvére: csak annyi jogosultságot adjunk, amennyi feltétlenül szükséges az alkalmazás működéséhez.
4. Fájlrendszer Struktúra és Jogosultságok – A rendezett munkavégzés kulcsa 📁
A rendszerezett fájlstruktúra elengedhetetlen a könnyű kezelhetőség és a biztonság szempontjából. Javasolt egy egységes struktúra, például:
/var/www/projekt1/
(itt lesznek a CakePHP/Laravel fájljai)/var/www/projekt2/
(itt lesznek a másik projekt fájljai)
Fontos, hogy minden projekt a saját gyökérkönyvtárában legyen, és az Apache DocumentRoot
beállítása a public
mappára mutasson (/var/www/projekt1/public
).
Fájl jogosultságok:
A jogosultságok helyes beállítása létfontosságú. Általában a www-data
(Apache felhasználó) és a fejlesztő felhasználó közötti megosztás a cél.
- A fájlok tulajdonosa legyen a fejlesztő felhasználó, a csoport pedig a
www-data
. (pl.sudo chown -R user:www-data /var/www/projekt1
) - A könyvtárak jogosultsága legyen
775
, a fájloké664
. (pl.sudo find /var/www/projekt1 -type d -exec chmod 775 {} ;
,sudo find /var/www/projekt1 -type f -exec chmod 664 {} ;
) - A
storage
(Laravel) éstmp
(CakePHP) mappáknak írhatóaknak kell lenniük az Apache számára, ezért ezeknek775
vagy extrém esetben777
jogosultságra lehet szükségük. Az utóbbi azonban biztonsági kockázatot jelenthet. Sokszor elegendő, ha awww-data
csoport írási joggal rendelkezik. (pl.sudo chmod -R g+w /var/www/projekt1/storage
)
5. Függőségek Kezelése Composerrel – A modern PHP projekt alapja 📦
A Composer a PHP függőségkezelője, és kulcsfontosságú a modern CakePHP és Laravel projektek esetében. Minden projektnek a saját gyökérkönyvtárában kell futtatnia a composer install
és composer update
parancsokat, hogy a saját vendor
könyvtárában kezelje a függőségeket. Soha ne próbáljunk meg globális Composer függőségeket megosztani a projektek között! Ez csak konfliktusokhoz és fejfájáshoz vezet.
A Composer biztosítja, hogy minden alkalmazás a saját, pontosan meghatározott könyvtárait és verzióit használja, anélkül, hogy az ütközne más projektek igényeivel. Ez a modularitás garantálja a stabilitást.
6. Biztonság – A megelőzés ereje 🔒
Amikor több alkalmazás osztozik egy szerveren, a biztonság kiemelten fontossá válik. Az alábbiakban néhány alapvető lépés:
- Projekt izoláció: Ahogy fentebb említettük, a virtuális hosztok és a PHP-FPM poolok már önmagukban is jelentős izolációt biztosítanak.
- Fájlrendszer jogosultságok: A helyes
chown
éschmod
beállítások elengedhetetlenek, hogy az egyik alkalmazás ne férhessen hozzá vagy ne írhasson a másik alkalmazás fájljaihoz. - SSL/TLS (HTTPS): Használjunk Let’s Encrypt tanúsítványokat minden domainhez. Ez ingyenes, könnyen beállítható és alapvető fontosságú a modern web biztonságában. A titkosított kommunikáció megvédi a felhasználói adatokat.
- Tűzfal: Konfiguráljunk egy tűzfalat (pl. UFW Linuxon), és csak a szükséges portokat (80, 443, 22) nyissuk meg.
- Rendszeres frissítések: Tartsuk naprakészen az operációs rendszert, az Apache-ot, a PHP-t, a MySQL-t és az összes Composer függőséget. A biztonsági rések gyakran a régebbi szoftververziókban találhatók.
- Mod_security: Apache esetén fontoljuk meg a
mod_security
bekapcsolását egy webalkalmazás tűzfal (WAF) védelméért.
Ne feledjük, a biztonság folyamatos odafigyelést igényel. Egy feltört projekt komoly kockázatot jelenthet a szerveren lévő összes többi alkalmazásra nézve.
7. Teljesítmény optimalizálás és monitorozás ⚡
Egyetlen szerveren futó több projekt esetén kulcsfontosságú a teljesítmény optimalizálása és a rendszererőforrások monitorozása.
- OPcache: Engedélyezzük a PHP OPcache-t minden PHP-FPM poolhoz. Ez óriási mértékben gyorsítja a PHP kód végrehajtását a fordított fájlok gyorsítótárazásával.
- PHP-FPM pool beállítások: Finomhangoljuk a PHP-FPM poolok beállításait (pl.
pm.max_children
,pm.start_servers
,pm.min_spare_servers
,pm.max_spare_servers
) az adott projekt várható terhelésének megfelelően. Ne adjunk túl sokat, de túl keveset sem. - Apache MPM: Az Apache esetében az
event
vagyworker
MPM (Multi-processing Module) sokkal hatékonyabb a több projekt kezelésében, mint a régebbiprefork
modul, különösen a PHP-FPM-mel kombinálva. - Logolás: Konfiguráljuk az Apache-ot, hogy minden virtuális hoszthoz külön
access.log
éserror.log
fájlt használjon. Ez nagyban megkönnyíti a hibakeresést és a teljesítményelemzést. - Adatbázis optimalizálás: Rendszeresen ellenőrizzük a MySQL/MariaDB logokat, optimalizáljuk az adatbázis lekérdezéseket és indexeket, és fontoljuk meg a gyorsítótárazást (pl. Redis vagy Memcached) a Laravel és CakePHP alkalmazásokban.
- Monitoring eszközök: Használjunk eszközöket, mint például
htop
,sar
,glances
, hogy figyelemmel kísérjük a szerver CPU, memória és I/O használatát. Ezekből láthatjuk, melyik projekt fogyasztja a legtöbb erőforrást.
Emlékszem, egyszer egy kollégám nem értette, miért lassul le a szerver délutánonként. Kiderült, hogy egy régebbi CakePHP alkalmazásban volt egy rosszul megírt cron job, ami minden órában elindult és túlterhelte a MySQL-t. A külön logfájlok és a rendszeres monitorozás segítségével gyorsan megtaláltuk és orvosoltuk a problémát, mielőtt az komolyabb fennakadást okozott volna. Ez is mutatja, mennyire fontos a proaktív hibakeresés és a folyamatos odafigyelés.
Összefoglalás és véleményem
Ahogy láthatjuk, több CakePHP és Laravel projekt egyidejű, gondtalan futtatása egyetlen LAMP szerveren abszolút lehetséges. Ehhez azonban nem elég csak feltölteni a fájlokat és elindítani az Apache-ot. Szükséges egy átgondolt stratégia, alapos konfiguráció és folyamatos karbantartás.
A kulcs a PHP-FPM használatában, a virtuális hosztok helyes beállításában, az adatbázisok és felhasználók elkülönítésében, a szigorú fájlrendszer jogosultságok alkalmazásában és a biztonsági protokollok betartásában rejlik. Ha ezeket a pontokat betartjuk, nemcsak stabil és biztonságos, hanem hatékony és könnyen karbantartható környezetet teremthetünk, ahol a különböző PHP alapú rendszerek harmóniában élnek egymás mellett.
Ne riasszon el a kezdeti beállítási görbe! A befektetett idő és energia sokszorosan megtérül a jövőben, elkerülve a konfliktusokat, a teljesítménybeli problémákat és a biztonsági kockázatokat. Egy jól konfigurált LAMP szerver valóságos erőművé válhat, ami bármilyen fejlesztői vagy üzleti igényt kiszolgálhat. Vágjon bele bátran, és tegye LAMP szerverét a tökéletes otthonná minden CakePHP és Laravel projektje számára!