NGINX vs. Apache
Ezek a postok és még számos más oldal jelenleg a Slicehost -nál egy virtuális gépben (Ubuntu 9.04) honolnak. A virtuális gépek havidíját általában a felhasználható memória és sávszélesség határozza meg, az én VPS -emnek momentán 500 MB RAM jut. Ez a mennyiség általában elegendő szokott lenni (Apache+PHP, Mysql, Postgres, SVN), de hetente 1x – 2x előfordul, hogy elfogy a memória, és nem válaszol a szerver. Virtuális újraindítás után már megint szép és jó, de hát akkor is. Akárhogy is figyeltem, a legéhesebb mindegyik daemon közül az apache2…
Kerestem beállításokat kevés RAM esetére, kicsit javult is a helyzet, de a Apachenak nem nagyon akar elég lenni ez a kevéske memória. Legjobb esetben is 25 – 50MB -ot eszik egy egy forkja, és hát fut 2-4 fork folyamatosan. A második helyezett Mysql összesen eszik 25 MB -ot. A megoldás keresése közben egyre gyakrabban merültek fel az alternatív webkiszolgálók nevei, leggyakrabban az nginx illetve a lighthttpd. E kettőt megversenyeztetve, úgy tűnt megabiztosan az nginxet támogatom, és neki is álltam feltelepíteni.
A poént lelövöm előre, az nginx egy egy forkja 2M RAM -ot eszik csak… Igaz PHP -t fastCGI módban futtat, de így is jóval gyorsabb mint az Apache. A fastCGI forkok megesznek még 20M -t.
A telepítést a sok fellelhető leírás közül én ezzel kezdtem: Howtoforge
Először csomagból felraktam a következőket:
apt-get install php5-cli php5-cgi php5-xcache build-essential nginx
A CGI -s PHP -nek van külön ini -je a /etc/php5/cgi/php.ini
Ebbe a következők kerültek:
[xcache-common] extension = xcache.so [xcache.admin] xcache.admin.user = "mOo" xcache.admin.pass = "" [xcache] xcache.shm_scheme = "mmap" xcache.size = 64M xcache.count = 1 xcache.slots = 8K xcache.ttl = 0 xcache.gc_interval = 0 xcache.var_size = 64M xcache.var_count = 1 xcache.var_slots = 8K xcache.var_ttl = 0 xcache.var_maxttl = 0 xcache.var_gc_interval = 300 xcache.test = Off xcache.readonly_protection = Off xcache.mmap_path = "/dev/zero" xcache.coredump_directory = "" xcache.cacher = On xcache.stat = On xcache.optimizer = On [xcache.coverager] xcache_coverager_start/stop/get/clean() functions (will hurt executing performance) xcache.coverager = Off xcache.coveragedump_directory = ""
Miután ez megvolt, megadtam az nginxnek, hogy hol találja a fastCGI php -t. Az alábbiakat a /etc/nginx/sites-available/default fileban kell megadni:
location ~ \.php$ { include /etc/nginx/fastcgi_params; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/nginx-default$fastcgi_script_name; }
A fenti sorokkal azt értem el, hogy az nginx a 9000 -es porton szólítgassa a PHP -t. Ezek után el kell indítani a PHP -t ott ahol várják 🙂
A PHP forkok futtatására a spawn-fcgi egész jó, ez viszont csak a lighthttp -ben található meg, szedjük le, majd fordítsuk le (újabb verziókban nincs már benne):
wget http://www.lighttpd.net/download/lighttpd-1.4.18.tar.bz2 tar -xvjf lighttpd-1.4.18.tar.bz2 cd lighttpd-1.4.18 ./configure make cp src/spawn-fcgi /usr/bin/spawn-fcgi
A make install nem kell, mivel nincs szükségünk egyébre a lightyból! Ezek után hozzunk létre egy filet a vi /usr/bin/php-fastcgi -ba, a következő tartalommal:
#!/bin/sh /usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -f /usr/bin/php5-cgi
Készítsük el az init scriptjét is
vi /etc/init.d/init-fastcgi
Az alábbi tartalommal:
#!/bin/bash PHP_SCRIPT=/usr/bin/php-fastcgi RETVAL=0 case "$1" in start) $PHP_SCRIPT RETVAL=$? ;; stop) killall -9 php RETVAL=$? ;; restart) killall -9 php $PHP_SCRIPT RETVAL=$? ;; *) echo "Usage: php-fastcgi {start|stop|restart}" exit 1 ;; esac exit $RETVAL
Egy kis jogosultság beállítás:
chmod 755 /etc/init.d/init-fastcgi
Ezek után el is indíthatjuk a fastcgi -t:
/etc/init.d/init-fastcgi start
Hogy fusson a dolog újraindítás után is:
update-rc.d init-fastcgi defaults
Ha a fentieken túl vagyunk az nginx fut és kiszolgálja php -ket is. A virtualhost és rewrite kalandok ezután következtek, de ez már egy másik cikk lesz 🙂
mTlp
12 dec, 2009
Köszi a postot! Pont most kezdtem el kutakodni apache alternatívák közt. Lighty vs nginx vetélkedőt mivel nyerte meg a ruszki versenyző?
esz
12 dec, 2009
Lighty -nek voltak rejtélyes memory leakjei, amiket tapasztalataink szerint nem sikerült elhárítani teljesen. Vagyis kb. heti újraindítást igényel. Teljesítményben kb egyformáknak tűnnek, az Nginx viszont még a Lightynál is kevesebb ramot eszik. Ezen felül több izgalmas plugint találtam Nginxre (valószínüleg soha nem használom majd őket), szóval úgy tűnt nincs nagy különbség, de én ezt az utat jártam be 🙂
valaki
3 jún, 2010
Koszi a postot.
Annyit hozzatennek meg hogy a killall -9 php az nagyon csunya.
Ha igy nezne ki a php-fastcgi fajl tartalma:
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -f /usr/bin/php5-cgi
Akkor egy korrekt kill `cat /var/run/fastcgi-php.pid` -el meg lehetne oldani a dolgot.
valaki
3 jún, 2010
Szoval php-fastcgi:
/usr/bin/spawn-fcgi -C 50 -a 127.0.0.1 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi -P /var/run/fastcgi-php.pid
TSS
17 jan, 2012
A lighty spawn-fcgi helyett ma már sokkal jobb megoldás a php-fpm használata: http://php-fpm.org/ Rádaásul ez már az újabb verzióju PHP csomagokban megtalálható alapból. Itt van egy használható guide a telepítéshez:
http://www.howtoforge.com/installing-php-5.3-nginx-and-php-fpm-on-ubuntu-debian