MyTetra Share
Делитесь знаниями!
О, смотри-ка какое хорошее место. Дайте два!
Nginx + PHP-FastCGI или избавляемся от apache
02.12.2009
13:12
Текстовые метки: nginx, php, php5
Раздел: Компьютер - Linux - Сеть в Linux - nginx

Статья от 1 Августа 2009.

В предыдущем шаге мы уже убрали apache слушать только локальные запросы (те которые приходят от nginx) теперь же пришло время убрать его совсем и заставить nginx обрабатывать все самому!

Для этого понадобится php5-cgi, если он еще не установлен, необходимо поставить:

sudo apt-get install php5-cgi

Для запуска php потребуется утилита spawn-fcgi от lighttpd. Сейчас она идёт как отдельный проект и расположена по адресу http://redmine.lighttpd.net/projects/spawn-fcgi. Можно получить последнюю версию оттуда, а можно воспользоваться советом отсюда и взять её из lighttpd:

mkdir ~/sources

cd ~/sources

# возможно будет уже и более свежая версия

wget http://www.lighttpd.net/download/lighttpd-1.4.19.tar.bz2

tar jxvf lighttpd-1.4.19.tar.bz2

# необходимые пакеты для установочного скрипта

sudo apt-get install libpcre3-dev libbz2-dev

cd lighttpd-1.4.19

# здесь может возникнуть ошибка, но и тут же предлагается решение -

# конфигурировать с параметром --without-zlib

./configure --without-zlib

make

sudo cp src/spawn-fcgi /usr/bin/spawn-fcgi

# И удалим за собой ненужныеболее файлы

cd ~/

rm -Rf sources/

Таким образом, или взяв отдельный пакет, но spawn-fcgi у нас получился установлен. Теперь необходимо все это дело запускать. Сделаем скрипт, который будет устанавливать дополнительные управляющие переменные и запускать php5-cgi:

sudo vim /usr/bin/php-fastcgi

и вставляем:

#!/bin/sh

# сколько процессов запускать

PHP_FCGI_CHILDREN=3

# через сколько обработанных запросов перезапускать экземпляр

PHP_FCGI_MAX_REQUESTS=1000

exec /usr/bin/php5-cgi

Скрипт для запуска php5-cgi готов, теперь нам нужен скрипт, для запуска spawn-fcgi, который будет дергать уже наш скрипт для установки переменных и запуска php5-cgi:

sudo vim /etc/init.d/init-fastcgi

и вставляем в него:

#!/bin/bash

PHP_SCRIPT="/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -g www-data -f /usr/bin/php-fastcgi"

RETVAL=0

case "$1" in

start)

$PHP_SCRIPT

RETVAL=$?

;;

stop)

killall -9 php5-cgi

RETVAL=$?

;;

restart)

killall -9 php5-cgi

$PHP_SCRIPT

RETVAL=$?

;;

*)

echo "Usage: sudo /etc/init.d/init-fastcgi {start|stop|restart}"

exit 1

;;

esac

exit $RETVAL

Осталось только сделать оба новых скрипта доступных для запуска:

sudo chmod 755 /usr/bin/php-fastcgi

sudo chmod 755 /etc/init.d/init-fastcgi

Теперь можно попробовать запустить наш FastCGI:

sudo /etc/init.d/init-fastcgi start

В ответ должно получится примерно следующее:

spawn-fcgi.c.197: child spawned successfully: PID: 16428

Осталось только добавит наш скрипт в автозагрузку:

sudo update-rc.d init-fastcgi defaults

Теперь надо подправить все конфиги, что бы nginx обрабатывал PHP сам, а не передавал их на apache. У меня в конфиге

sudo vim /etc/nginx/sites-available/svdev.ru

получилось примерно следующее:

server {

listen 80;

server_name www.svdev.ru;

# здесь при заходе на www.svdev.ru происходит редирект на svdev.ru

rewrite ^(.*) http://svdev.ru$1 permanent;

}

server {

listen 80;

server_name svdev.ru;

error_log /var/www/svdev.ru/logs/error.log warn;

access_log /dev/null;

root /var/www/svdev.ru/htdocs;

charset utf-8;

# страницы с ошибками, вместо стандартных, путь указывается от root (выше)

error_page 404 /error/404.html;

error_page 403 /error/403.html;

error_page 500 /error/500.html;

location ~ .*(gif|jpg|jpeg|png|ico|css|swf|js|html|htm)$ { }

# Для wordpess - это директория с upload и по умолчанию получится

# что залив php скрипт можно будет выполнить его по прямой ссылке

location ~ wp-content/uploads/.*\.php { }

location ~ \.php$

{

include /etc/nginx/fastcgi_params;

fastcgi_param SCRIPT_FILENAME /var/www/svdev.ru/htdocs$fastcgi_script_name;

fastcgi_param QUERY_STRING $query_string;

fastcgi_pass 127.0.0.1:9000;

# Директива определяет что ответы FastCGI-сервера с кодом больше или равные 400

# перенаправлять на обработку nginx'у с помощью директивы error_page

fastcgi_intercept_errors on;

break;

}

location / {

fastcgi_index index.php;

fastcgi_pass 127.0.0.1:9000;

fastcgi_param SCRIPT_FILENAME /var/www/svdev.ru/htdocs$fastcgi_script_name;

fastcgi_param QUERY_STRING $query_string;

include /etc/nginx/fastcgi_params;

fastcgi_intercept_errors on;

}

}

и на этом можно пока остановиться. Теперь apache можно окончательно удалить с сервера.

sudo apt-get remove apache2

Все.

← Содержание ...
 
MyTetra Share v.0.35
Яндекс индекс цитирования