заметки на полях

Блокнот разработчика

Nginx + PHP-FastCGI или избавляемся от apache

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

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

1
sudo apt-get install php5-cgi

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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:

1
sudo vim /usr/bin/php-fastcgi

и вставляем:

1
2
3
4
5
6
#!/bin/sh
# сколько процессов запускать
PHP_FCGI_CHILDREN=3
# через сколько обработанных запросов перезапускать экземпляр
PHP_FCGI_MAX_REQUESTS=1000
exec /usr/bin/php5-cgi

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

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

и вставляем сюда:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/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

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

1
2
sudo chmod 755 /usr/bin/php-fastcgi
sudo chmod 755 /etc/init.d/init-fastcgi

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

1
2
3
sudo /etc/init.d/init-fastcgi start
# В ответ должно получится примерно следующее:
spawn-fcgi.c.197: child spawned successfully: PID: 16428

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

1
sudo update-rc.d init-fastcgi defaults

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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 можно окончательно удалить с сервера. :)

1
sudo apt-get remove apache2

Tags: , , ,

2 Responses to “Nginx + PHP-FastCGI или избавляемся от apache”

  1. Deller Says:

    И насколько существенный прирост производительности при php+fastcgi+nginx?

  2. Дерябин Сергей Says:

    Именно на каком то проекте не проверял как до и после.
    Но есть один проект работающих в связке php + fastCGI + Memcached

Leave a Reply