Az Apache2 kiszolgálón futó oldalak memóriaigényének kordában tartása

Egy rosszul megírt weboldal könnyen összeomlaszthat egy egyész kiszolgálót, ha mindúntalan, sok példányban hívják meg memóriaigényes műveletekre. Nem ismeretlen a hibajelenség, hogy egy-egy oldal huzamosabb ideig való futása után Linux kiszolgálónk memóriája fogyatkozni kezd, majd végül hozzányúl a swap memóriához is. Ekkor a rendszer lehetetlen módon belassul, megáll az élet és még a monitorozáshoz szükséges parancsok is csak lassan futnak le.

Az ilyen jellegű leállások megelőzhetőek, ha rendszergazda kordában tartja az egyes oldalak folyamatait, memóriahasználatát.
Sajnos nincs bevált recept, irányelvek, ismert limitálási módok léteznek. A megfelelő értékek szerverenként változhatnak. A következőkben néhány lehetséges paramétert ajánlunk föl, az alapértelmezettől való elállításra.

/etc/apache2/apache2.conf

Kezdetnek nézzük meg, mit tehetünk az apache2.conf beállítófájlban. A leírás feltételezi a prefork MPM használatát.

MaxKeepAliveRequests 100


Az életben tartott kérelmek maximális számát adott esetben lejjebb vehetjük.

KeepAliveTimeout 15


Az életben tartott kapcsolatok élettartamát 15mp-ről akár 5mp-re is levehetjük.

MaxClients 150


A maximálisan elindítható kliensek számát (szerver folyamatokról van szó) limitálhatjuk.

/etc/apache2/httpd.conf

Azokat az Apache direktívákat, melyek alapértelmezett telepítés esetén nincsenek meghívva a konfigurációs állományba, egyezményes alapon a httpd.conf fájlba írhatjuk.

RLimitNPROC 25 40


Apache példányonként futtatható processzek számát határozza meg.

RLimitMEM 1500000 2000000 


Az apache példányok által indított processzek memóriáját korlátozza. Az értékek Kb-ban értendőek.

Fontos megjegyezni, hogy ez a direktíva meghívható a httpd.conf-ban globálisan, valamint az egyes vhost fájlokban is, az adott vhost-ra vonatkoztatva!

/etc/php5/cgi/php.ini

memory_limit = 96M


96MB-nál ne adjunk többet egy php folyamatra. Ha lehet, itt minél jobban szorítsuk meg a szíjat.

/etc/securty/limits.conf

Fontos, hogy vhost-jainkat fast-cgi-vel és NE mod_php-val futtassuk. A FastCGI és a suExec lehetővé teszi a különböző weboldalak folyamatainak szétválasztását. Az eljárás lényege nagyon egyszerű: minden weboldal saját felhasználónév alatt futtatja a kódjait. ISPconfig 3 alatt egy-két kattintás az egész, akik azonban nem élnek ezzel a lehetőséggel, letölthetik példa fájlunkat.

Ha minden weboldal külön felhasználónév alatt fut, limitálhatjuk a felhasználó életterét. A limits.conf fájlban a memlock direktíva segít bennünket.  Példa:

web15 soft memlock 500000

web15 hard memlock 700000

www-data hard memlock 1000000

Rengeteg módszer létezik a kiszolgálók teljestímény-optimalizálására és mi most csak néhány lehetőséet érintettünk. Nem receptet, csak tippeket adtunk, merre érdemes elindulni.

Bővebb információt a témában az Apache2 dokumentációja nyújt az itt felsorolt apache2 direktívákról:

http://httpd.apache.org/docs/2.0/mod/core.html

Illetve az Kiskapu Kiadó gondozásában az Apache zsebkönyv és az Apache receptek című könyvek nyújthatnak segítséget.