A mai digitális világban egyre több cégnek és magánszemélynek van szüksége online jelenlétre. Gyakori kihívás azonban, hogy több weboldalt – legyen szó céges portfólióról, blogról vagy webshopról – kell üzemeltetni, miközben az erőforrások optimalizálására és a költségek alacsonyan tartására törekszünk. Szerencsére az Apache web szerver és a PHP-FPM kombinációja kiváló megoldást kínál erre a feladatra, lehetővé téve, hogy több domaint és weboldalt futtassunk egyetlen fizikai vagy virtuális szerveren. Ez a cikk részletesen bemutatja, hogyan valósítható meg ez a beállítás, fókuszálva a hatékonyságra, biztonságra és a modern gyakorlatokra.
Miért érdemes több weboldalt futtatni egy szerveren?
Először is, tegyük fel a kérdést: miért akarnánk több weboldalt egyetlen szerveren futtatni, amikor külön-külön is hosztolhatnánk őket? Számos előnye van ennek a megközelítésnek:
- Költséghatékonyság: Egy szerver fenntartása jelentősen olcsóbb, mint több különállóé. Ez magában foglalja a szerver bérleti díját, az IP-címek költségét és az esetleges szoftverlicenceket.
- Erőforrás-kihasználtság: A modern szerverek hatalmas számítási kapacitással rendelkeznek, amit egyetlen weboldal gyakran nem használ ki teljesen. Több weboldal futtatásával jobban kihasználhatók a szerver CPU, RAM és tárhely erőforrásai, különösen, ha az oldalak forgalma eltérő időpontokban éri el a csúcsot.
- Egyszerűsített felügyelet: Egyetlen szerver karbantartása, frissítése és biztonsági mentése egyszerűbb, mint több különböző rendszeré. Ez kevesebb időt és erőfeszítést igényel a rendszergazdától.
- Egységes környezet: Lehetővé teszi, hogy minden weboldal hasonló szoftverkörnyezetben fusson, ami egyszerűsíti a fejlesztést és a hibaelhárítást.
Természetesen vannak hátrányai is, mint például az „egyetlen hibapont” (single point of failure) kockázata, vagy az erőforrás-verseny, ha az egyik oldal váratlanul nagyon nagy forgalmat generál. Azonban megfelelő konfigurációval és optimalizálással ezek a kockázatok minimalizálhatók.
Apache Virtual Hostok alapjai
Az Apache a világ egyik legnépszerűbb és legelterjedtebb web szervere, amelynek alapvető képessége a Virtual Host (virtuális hoszt) funkcionalitás. Ez teszi lehetővé, hogy egyetlen fizikai szerver több, különböző domain név alatt elérhető weboldalt szolgáljon ki, mindössze egyetlen IP-címmel. Két fő típusa van a virtuális hosztoknak:
- IP-alapú virtuális hosztok: Ezekhez minden weboldalnak külön IP-címre van szüksége. Ma már ritkán használják, mivel az IPv4 címek korlátozottak.
- Név-alapú virtuális hosztok: Ez a modern és elterjedt módszer. Egyetlen IP-címen több domain nevet is kiszolgálhatunk. Az Apache a bejövő HTTP kérésben szereplő
Host
fejléc alapján dönti el, melyik virtuális hoszt konfigurációt kell használnia.
Minden virtuális hoszt egy külön konfigurációs blokkban (általában egy fájlban) van definiálva az Apache beállításaiban. A legfontosabb direktívák egy virtuális hoszt beállításában:
<VirtualHost *:80>
vagy<VirtualHost *:443>
: Ez határozza meg a virtuális hosztot, és azt, hogy mely portokon figyel. A*
jelentése „minden IP-címen”.ServerName [domain.hu]
: Ez a weboldal elsődleges domain neve.ServerAlias [www.domain.hu] [domain2.hu]
: További domain nevek, amelyeken keresztül ugyanaz a weboldal elérhető.DocumentRoot /var/www/[domain_nev]/public_html
: Ez a könyvtár tartalmazza a weboldal fájljait, innen szolgálja ki az Apache a tartalmat.ErrorLog ${APACHE_LOG_DIR}/[domain_nev]-error.log
: Ide írja az Apache a hibákat.CustomLog ${APACHE_LOG_DIR}/[domain_nev]-access.log combined
: Ide írja az Apache a látogatók hozzáférését.
A <Directory>
blokkokkal további beállításokat adhatunk meg a DocumentRoot
könyvtáron belülre, például engedélyezhetjük a .htaccess
fájlok használatát (AllowOverride All
), vagy beállíthatjuk az index fájlok sorrendjét.
PHP integrálása az Apache-hoz: A hagyományos módszertől a modern megoldásokig
A PHP egy szerveroldali szkriptnyelv, amely elengedhetetlen a legtöbb dinamikus weboldalhoz (pl. WordPress, Joomla, Drupal). Az Apache-alapú PHP futtatására többféle módszer létezik:
1. Mod_php (DSO – Dynamic Shared Object)
Ez volt a PHP integrációjának hagyományos módja. A mod_php
modult közvetlenül az Apache-ba töltik be. Ez a legegyszerűbben beállítható megoldás:
- Előnyök: Nagyon egyszerű beállítani, jó teljesítményt nyújtott régebben.
- Hátrányok:
- Biztonság: Minden PHP folyamat az Apache felhasználójának (általában
www-data
) jogaival fut. Ez azt jelenti, hogy ha az egyik weboldalt feltörik, az könnyedén hozzáférhet más oldalak fájljaihoz is a szerveren. Ez komoly biztonsági kockázatot jelent egy több weboldalt tartalmazó környezetben. - Erőforrás-felhasználás: Minden Apache worker process betölti a PHP értelmezőt, függetlenül attól, hogy PHP fájlt szolgál-e ki. Ez növeli a RAM fogyasztást.
- Verziókezelés: Nehézkes különböző PHP verziókat futtatni a különböző weboldalakhoz.
- Biztonság: Minden PHP folyamat az Apache felhasználójának (általában
A mod_php
használata több weboldal egy szerveren való futtatásakor nem ajánlott a komoly biztonsági hiányosságok miatt.
2. CGI / FastCGI
Ezek a módszerek lehetővé teszik, hogy a PHP külső folyamatként fusson az Apache-tól függetlenül. A FastCGI a CGI egy továbbfejlesztett változata, amely hatékonyabb, mivel a PHP folyamatok a kérések között is aktívak maradnak, csökkentve a „bootolási” időt.
- Előnyök: Jobb biztonság (külön felhasználóként futtathatók a PHP szkriptek), nagyobb rugalmasság (különböző PHP verziók is kezelhetők).
- Hátrányok: Lehet lassabb, mint a
mod_php
, ha nem optimális a konfiguráció.
3. PHP-FPM (FastCGI Process Manager)
Ez a modern, preferált és ajánlott megoldás Apache és PHP több weboldalas környezetekben. A PHP-FPM egy dedikált démon, amely kezeli a PHP FastCGI folyamatokat. Az Apache a mod_proxy_fcgi
modulon keresztül kommunikál a PHP-FPM-mel, jellemzően Unix socketen keresztül.
- Előnyök:
- Kiemelkedő biztonság: Minden weboldalhoz dedikált PHP-FPM poolt hozhatunk létre, amely egyedi felhasználó és csoport (pl.
webuser1:webgroup1
) jogosultságaival fut. Ezáltal egy feltört weboldal nem férhet hozzá a többi oldal fájljaihoz. - Kiváló teljesítmény: A PHP-FPM hatékonyan kezeli a PHP folyamatokat, optimalizálja az erőforrás-felhasználást és gyors válaszidőt biztosít.
- Verziókezelés: Különböző PHP-FPM poolokat hozhatunk létre különböző PHP verziókhoz (pl. PHP 7.4-es pool az egyik oldalhoz, PHP 8.1-es a másikhoz), és a virtuális hosztokban kijelölhetjük, melyik poolt használja az adott oldal.
- Stabilitás: Egyetlen hibás szkript vagy túlterhelés nem borítja fel az összes weboldalt.
- Kiemelkedő biztonság: Minden weboldalhoz dedikált PHP-FPM poolt hozhatunk létre, amely egyedi felhasználó és csoport (pl.
A továbbiakban a PHP-FPM-mel történő beállítást részletezzük, mivel ez a legprofibb és legbiztonságosabb megközelítés.
Részletes beállítási útmutató PHP-FPM-mel
Ez az útmutató Ubuntu/Debian alapú rendszerekre fókuszál. Más disztribúciókon a csomagkezelők és a fájl elérési útvonalak eltérhetnek.
1. Előkészületek és csomagok telepítése
Először frissítsük a rendszerünket, majd telepítsük az Apache2-t, a PHP-t és a PHP-FPM-et. Tegyük fel, hogy PHP 8.1-et szeretnénk használni.
sudo apt update
sudo apt upgrade
sudo apt install apache2 php8.1 php8.1-fpm libapache2-mod-fcgid php8.1-mysql php8.1-curl php8.1-gd php8.1-mbstring php8.1-xml php8.1-zip
Engedélyezzük az Apache számára szükséges modulokat:
sudo a2enmod proxy_fcgi setenvif rewrite dir mpm_event
sudo a2dismod mpm_prefork # Kikapcsoljuk, mert az mpm_event modullal ütközik
sudo systemctl restart apache2
Engedélyezzük a FastCGI modult is, ami a libapache2-mod-fcgid
csomaggal jön:
sudo a2enconf php8.1-fpm # Vagy a2enmod fcgid, ha nem php-fpm konf fájlból hívja
sudo systemctl restart apache2
sudo systemctl enable php8.1-fpm
sudo systemctl start php8.1-fpm
2. Fájlstruktúra kialakítása
Hozzuk létre a weboldalak számára dedikált könyvtárakat a /var/www/
alatt. Minden weboldalnak saját gyökérkönyvtára legyen, pl. /var/www/domain1.hu/public_html
és /var/www/domain2.hu/public_html
.
sudo mkdir -p /var/www/domain1.hu/public_html
sudo mkdir -p /var/www/domain2.hu/public_html
Hozzuk létre a teszt fájlokat, pl. /var/www/domain1.hu/public_html/index.php
tartalommal:
<?php phpinfo(); ?>
A legfontosabb lépés a megfelelő jogosultságok beállítása! Minden weboldalnak saját, dedikált felhasználója legyen, és a PHP-FPM pool is ezzel a felhasználóval fusson.
sudo adduser domain1user --gecos "First Last,RoomNumber,WorkPhone,HomePhone" --disabled-password
sudo adduser domain2user --gecos "First Last,RoomNumber,WorkPhone,HomePhone" --disabled-password
sudo chown -R domain1user:domain1user /var/www/domain1.hu
sudo chown -R domain2user:domain2user /var/www/domain2.hu
# A webkiszolgáló (www-data) számára adjunk olvasási jogosultságot
sudo chmod -R 755 /var/www/domain1.hu
sudo chmod -R 755 /var/www/domain2.hu
3. PHP-FPM pool konfigurációk
Hozzuk létre a dedikált PHP-FPM pool konfigurációs fájlokat minden weboldalhoz. Ezeket a /etc/php/8.1/fpm/pool.d/
könyvtárban tároljuk.
Példa /etc/php/8.1/fpm/pool.d/domain1.hu.conf
:
[domain1.hu]
user = domain1user
group = domain1user
listen = /var/run/php/php8.1-domain1.hu.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 30
chdir = /
php_admin_value[open_basedir] = /var/www/domain1.hu/public_html:/tmp:/usr/share/phpmyadmin # Védett könyvtárak
php_admin_value[upload_tmp_dir] = /var/www/domain1.hu/tmp
php_admin_value[session.save_path] = /var/www/domain1.hu/sessions
php_admin_value[error_log] = /var/log/php-fpm/domain1.hu_error.log
php_admin_flag[display_errors] = off
php_admin_flag[log_errors] = on
Ismételjük meg a fenti konfigurációt a domain2.hu.conf
fájlhoz is, módosítva a user
, group
, listen
és open_basedir
értékeket a domain2user
és domain2.hu
-nak megfelelően.
Hozzuk létre a tmp és sessions könyvtárakat, valamint a log fájlt és adjuk meg a megfelelő jogosultságokat:
sudo mkdir /var/www/domain1.hu/tmp /var/www/domain1.hu/sessions
sudo chown -R domain1user:domain1user /var/www/domain1.hu/tmp /var/www/domain1.hu/sessions
sudo mkdir -p /var/log/php-fpm
sudo touch /var/log/php-fpm/domain1.hu_error.log
sudo chown domain1user:domain1user /var/log/php-fpm/domain1.hu_error.log
Miután elkészültünk a pool fájlokkal, indítsuk újra a PHP-FPM szolgáltatást:
sudo systemctl restart php8.1-fpm
4. Apache Virtual Host konfigurációk
Most hozzuk létre az Apache virtuális hoszt fájlokat a /etc/apache2/sites-available/
könyvtárban.
Példa /etc/apache2/sites-available/domain1.hu.conf
:
<VirtualHost *:80>
ServerName domain1.hu
ServerAlias www.domain1.hu
DocumentRoot /var/www/domain1.hu/public_html
<Directory /var/www/domain1.hu/public_html>
Options -Indexes +FollowSymLinks +MultiViews
AllowOverride All
Require all granted
</Directory>
# PHP-FPM integráció
<FilesMatch .php$>
SetHandler "proxy:unix:/var/run/php/php8.1-domain1.hu.sock|fcgi://localhost/"
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/domain1.hu-error.log
CustomLog ${APACHE_LOG_DIR}/domain1.hu-access.log combined
</VirtualHost>
# Optional: Redirect HTTP to HTTPS
<VirtualHost *:443>
ServerName domain1.hu
ServerAlias www.domain1.hu
DocumentRoot /var/www/domain1.hu/public_html
<Directory /var/www/domain1.hu/public_html>
Options -Indexes +FollowSymLinks +MultiViews
AllowOverride All
Require all granted
</Directory>
<FilesMatch .php$>
SetHandler "proxy:unix:/var/run/php/php8.1-domain1.hu.sock|fcgi://localhost/"
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/domain1.hu-ssl-error.log
CustomLog ${APACHE_LOG_DIR}/domain1.hu-ssl-access.log combined
# SSL beállítások (példa, be kell szerezni SSL tanúsítványt)
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/domain1.hu/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/domain1.hu/privkey.pem
</VirtualHost>
Az <FilesMatch .php$>
blokk kulcsfontosságú. A SetHandler "proxy:unix:/var/run/php/php8.1-domain1.hu.sock|fcgi://localhost/"
direktíva mondja meg az Apache-nak, hogy a PHP fájlokat a php8.1-domain1.hu.sock
nevű Unix socketen keresztül küldje el a PHP-FPM poolnak feldolgozásra.
Ismételjük meg a fenti konfigurációt a domain2.hu.conf
fájlhoz is, módosítva a domain neveket, DocumentRoot
és socket elérési utat.
5. Engedélyezés és újraindítás
Engedélyezzük az új virtuális hosztokat az Apache-ban:
sudo a2ensite domain1.hu.conf
sudo a2ensite domain2.hu.conf
Ellenőrizzük az Apache konfiguráció szintaktikai helyességét:
sudo apachectl configtest
Ha minden rendben van (Syntax OK
), indítsuk újra az Apache-ot:
sudo systemctl restart apache2
6. Host fájl módosítása (helyi teszteléshez)
Ha még nincs DNS bejegyzésed a domainekhez, helyi géped hosts
fájlját módosítva tesztelheted a beállítást. Linuxon/macOS-en ez a /etc/hosts
, Windowson a C:WindowsSystem32driversetchosts
. Add hozzá a következő sorokat (a szerver IP-címét cseréld le a sajátodra):
192.168.1.100 domain1.hu www.domain1.hu
192.168.1.100 domain2.hu www.domain2.hu
Most már böngészőből elérhetőknek kell lenniük a weboldalaknak a megadott domain neveken.
Optimalizálás és biztonság
A több weboldalas környezet üzemeltetése során a biztonság és a teljesítmény kiemelt fontosságú. Íme néhány tipp:
- PHP-FPM pool beállítások: Finomhangoljuk a
pm.max_children
,pm.start_servers
stb. értékeket a szerver erőforrásainak és a weboldalak forgalmának megfelelően. A túl sok folyamat memóriahiányt okozhat, a túl kevés lassú válaszidőhöz vezethet. Kezdjük konzervatív értékekkel, és monitorozzuk a memóriahasználatot. - Apache MPM modulok: Győződjünk meg róla, hogy az
mpm_event
modult használjuk, mert ez jobban kezeli az egyidejű kapcsolatokat, mint azmpm_prefork
. - Erőforrás-monitoring: Használjunk eszközöket, mint a
htop
,top
,iostat
,dstat
, vagy fejlettebb monitoring rendszereket (pl. Prometheus, Grafana), hogy figyelemmel kísérjük a szerver erőforrás-felhasználását. - Rendszeres frissítések: Tartsuk naprakészen az Apache-ot, a PHP-t, a PHP-FPM-et és az operációs rendszert. A biztonsági javítások kritikusak.
- Tűzfal (Firewall): Konfiguráljunk egy tűzfalat (pl. UFW vagy iptables), hogy csak a szükséges portok legyenek nyitva (80, 443, 22).
- SSL/TLS (HTTPS): Mindig használjunk HTTPS-t a weboldalainkhoz. A Let’s Encrypt ingyenes SSL tanúsítványokat biztosít, és könnyen automatizálható a telepítése és megújítása.
- PHP biztonsági beállítások: A PHP-FPM pool konfigurációkban használjuk az
open_basedir
direktívát, hogy korlátozzuk, mely könyvtárakból érhetők el a fájlok. Tiltsunk le minden veszélyes PHP függvényt (pl.exec
,shell_exec
,passthru
,system
) azdisable_functions
direktívával, hacsak nem feltétlenül szükségesek. - Naplózás: Konfiguráljuk az Apache-ot és a PHP-FPM-et, hogy külön naplófájlokat hozzanak létre minden weboldalhoz. Ez megkönnyíti a hibaelhárítást és a biztonsági incidensek nyomon követését.
- DDoS védelem: Fontoljuk meg egy Reverse Proxy (pl. Nginx) vagy egy CDN (Content Delivery Network, pl. Cloudflare) beállítását, ami nemcsak a tartalom gyorsabb kiszolgálását segíti, de DDoS támadások elleni védelmet is nyújt.
Gyakori hibák és hibaelhárítás
Bármilyen komplex beállításnál előfordulhatnak problémák. Íme néhány gyakori hiba és tipp a hibaelhárításhoz:
- Jogosultsági hibák: A leggyakoribb problémák forrása. Ellenőrizd a fájlok és könyvtárak tulajdonosát (
chown
) és jogosultságait (chmod
). Győződj meg róla, hogy a PHP-FPM pool a megfelelő felhasználóval fut, és az Apachewww-data
felhasználója hozzáfér a weboldal fájljaihoz. - Apache vagy PHP-FPM nem fut: Ellenőrizd a szolgáltatások állapotát:
sudo systemctl status apache2
éssudo systemctl status php8.1-fpm
. Nézd meg a logokat is! - „Service Unavailable” vagy üres oldal: Ez gyakran PHP-FPM kapcsolati problémára utal. Ellenőrizd, hogy a PHP-FPM socket elérési útja (pl.
/var/run/php/php8.1-domain1.hu.sock
) pontosan megegyezik-e az Apache Virtual Host konfigurációban megadottal. Ellenőrizd a PHP-FPM logokat. - 403 Forbidden hiba: Valószínűleg a
<Directory>
blokk beállításai (pl.Require all granted
) vagy a fájlrendszer jogosultságai okozzák. - 500 Internal Server Error: Ez általában PHP szintaktikai hibára, hiányzó PHP modulra, vagy hibás
.htaccess
fájlra utal. Ellenőrizd az Apacheerror.log
fájlt és a PHP-FPM pool logjait. - DNS vagy hosts fájl probléma: Ha a böngésző nem találja a domaint, ellenőrizd a DNS bejegyzéseket, vagy a helyi
hosts
fájl beállításait. - Hiányzó Apache modul: Győződj meg róla, hogy minden szükséges Apache modul (pl.
mod_proxy_fcgi
,mod_rewrite
) engedélyezve van (a2enmod [modulnév]
).
Mindig használd a log fájlokat (/var/log/apache2/
és /var/log/php-fpm/
) a hibaelhárítás első lépéseként! Ezek a fájlok a leggyakrabban tartalmazzák a problémák okát.
Konklúzió
Az Apache web szerver és a PHP-FPM kombinációja robusztus, biztonságos és rugalmas megoldást kínál több weboldal üzemeltetésére egyetlen szerveren. Bár a kezdeti beállítás igényel némi technikai ismeretet, a hosszú távú előnyei – a költséghatékonyság, az optimalizált erőforrás-felhasználás és a jobb biztonság – messze felülmúlják a befektetett időt. A gondos tervezéssel, a megfelelő konfigurációval és a folyamatos karbantartással egy megbízható és nagy teljesítményű webkiszolgáló környezetet hozhatunk létre, amely képes kezelni a modern weboldalak igényeit, miközben a szerver erőforrásait maximálisan kihasználjuk.
Ez a tudás elengedhetetlen a rendszergazdák és webfejlesztők számára, akik hatékonyan és biztonságosan szeretnének több projektet kezelni. Merülj el a témában, kísérletezz, és hozd ki a legtöbbet a szervered képességeiből!