NGINX vs. Apache

deviantart.com

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 🙂

  • 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ő?

  • 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 🙂

  • 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.

  • 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

  • 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

RSS -en követheted a hozzászólásokat.

Trackbacks / Pingbacks