Настройка связки nginx + php (через FastCGI)

Я люблю nginx за его быстроту, однако он не дружит с php. Но есть решение. Если подружить nginx с модулем FastCGI, то можно заметно ускорить загрузку сайта, по сравнению со связкой nginx+Apache. Перейдём в режим суперюзера: sudo su Обновим список репозиториев и установим обновления системы: aptitude update && aptitude upgrade Устанавливаем php5 aptitude install php5 php5-cgi После установки: nano /etc/php5/cgi/php.ini находим строчку ;cgi.fix_pathinfo=1 и убираем ; в начале строки Установим lighttpd и отключим его автозапуск — нам потребуется только один модуль из этого пакета

aptitude install lighttpd service lighttpd stop update-rc.d -f lighttpd remove

Устанавливаем nginx aptitude install nginx запускаем FastCGI и добавим в автозагрузку

/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 \ -u www-data -g www-data \ -f /usr/bin/php5-cgi \ -P /var/run/fastcgi-php.pid

Откроем для редактирования /etc/rc.local nano /etc/rc.local и добавим в конец, перед exit 0:

/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi -P /var/run/fastcgi-php.pid

Теперь отпредактируем дефолтный хост: nano /etc/nginx/sites-available/default Добавим в блок server следующий текст:

location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/nginx-default$fastcgi_script_name; include fastcgi_params; }

и теперь перезагрузим конфигурацию nginx: service nginx reload Создадим скрипт для запуска/остановки/перезапуска и автозагрузки FCGI nano /etc/init.d/spawn-fcgi

#! /bin/sh # # spawn-fcgi Startup script for the nginx HTTP Server # # chkconfig: - 84 15 # description: Loading php-cgi using spawn-cgi # HTML files and CGI. # ### BEGIN INIT INFO # Provides: spawn-fcgi # Required-Start: $all # Required-Stop: $all # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start and stop php-cgi using spawn-fcgi # Description: Start and stop php-cgi using spawn-fcgi ### END INIT INFO # Author: Ryan Norbauer # Modified: Geoffrey Grosenbach http://topfunky.com # Modified: David Krmpotic http://davidhq.com # Modified: Kun Xi http://kunxi.org # Modified: http://drumcoder.co.uk/ # Modified: http://olezhek.net/ SCRIPTNAME=$(basename $0) DAEMON=/usr/bin/spawn-fcgi FCGIHOST=127.0.0.1 FCGIPORT=9000 FCGIUSER=www-data FCGIGROUP=www-data FCGIAPP=/usr/bin/php-cgi FCGICHILDREN=7 PIDFILE=/var/run/$SCRIPTNAME.pid DESC="Spawn-FCGI" # You can change settings for this script by editing /etc/default/$SCRIPTNAME [ -r /etc/default/$SCRIPTNAME ] && . /etc/default/$SCRIPTNAME # Gracefully exit if the package has been removed. test -x $DAEMON || exit 0 test -x $FCGIAPP || exit 0 start() { # $DAEMON -a $FCGIHOST -p $FCGIPORT -u $FCGIUSER -g $FCGIGROUP -f $FCGIAPP -P $PIDFILE -C $FCGICHILDREN 2> /dev/null || echo -en "\n already running" $DAEMON -a $FCGIHOST -p $FCGIPORT -u $FCGIUSER -g $FCGIGROUP -P $PIDFILE -C $FCGICHILDREN -- $FCGIAPP 2> /dev/null || echo -en "\n already running" } stop() { kill -QUIT `cat $PIDFILE` || echo -en "\n not running" } restart() { kill -HUP `cat $PIDFILE` || echo -en "\n can't reload" } case "$1" in start) echo -n "Starting $DESC: " start ;; stop) echo -n "Stopping $DESC: " stop ;; restart|reload) echo -n "Restarting $DESC: " stop # One second might not be time enough for a daemon to stop, # if this happens, d_start will fail (and dpkg will break if # the package is being upgraded). Change the timeout if needed # be, or change d_stop to have start-stop-daemon use --retry. # Notice that using --retry slows down the shutdown process somewhat. sleep 1 start ;; *) echo "Usage: $SCRIPTNAME {start|stop|restart|reload}" >&2 exit 3 ;; esac exit $?

chmod +x /etc/init.d/spawn-fcgi && update-rc.d spawn-fcgi defaults

PS. Если сервер FastCGI произвольно падает и вместо своего сайта вы частов видете ошибку 502, то можете в crontab добавить:

* * * * * root /usr/bin/curl --head -sf http://site.ru/index.php -o /dev/null || (/etc/init.d/spawn-fcgi restart && /usr/sbin/service nginx restart)

Не забудьте заменить site.ru на адрес своего сайта. code.cons, div.cons {background:#000; color:#fff; font-family: Courier New, monospace;margin:2px;} li {margin:3px;}