Системное администрирование Связка nginx + php в Ubuntu

В рамках работ по настройке виртуального выделенного сервера с ограниченным объемом оперативной памяти было принято заменить веб-сервер Apache на более производительный, и менее требовательный к ресурсам веб-сервер nginx. С точки зрения системного администрирования перед нами появляется задача научить nginx обрабатывать php-скрипты самостоятельно. Предложенный мной вариант решения заставляет nginx обрабатывать php-скрипты через CGI (т.е. общий интерфейс шлюза — отдельную программу, к которой веб-сервер будет подключаться по определенному порту).

Будем считать, что сам веб-сервер nginx установлен. Если нет, то можно воспользоваться инструкцией по его установке из этой статьи. Затем нужно установить PHP и все необходимые утилиты. Следующей командой устанавливаем набор пакетов с PHP, который должен обеспечить работу среднестатистического сайта:

sudo aptitude install php5 php5-common php5-cgi php5-cli php5-gd php5-mcrypt php5-xmlrpc php5-xsl

Особое внимание обращаем на пакет php5-cgi. Именно он и обеспечит возможность веб-серверу nginx обрабатывать php-скрипты.

Однако предпочтительнее вместо CGI все же использовать FastCGI. Не секрет, что главная проблема CGI-программ в том, что они должны быть перезапущены веб-сервером при каждом запросе, что неизбежно ведет к снижению производительности. FastCGI оставляет процесс запущенным, что позволяет не тратить лишнее время на перезапуск. Для запуска php5-cli в режиме FastCGI проще всего воспользоваться утилитой spawn-fcgi. В Ubuntu 10.04 эта утилита присутствует в репозитории.

sudo aptitude install spawn-fcgi

Следующим нашим шагом будет написание простого скрипта для установки необходимых параметров и запуска php5-cgi в режиме FastCGI. Создадим в любимом текстовом редакторе (например, в nano) скрипт php-fastcgi в каталоге /usr/bin.

sudo nano /usr/bin/php-fastcgi

Внутрь файла помещаем следующие строки:

1
2
3
4
#!/bin/sh
# Количество процессов
PHP_FCGI_CHILDREN=3
exec /usr/bin/php5-cgi

После успешного сохранения скрипта нужно сделать его исполняемым.

sudo chmod 755 /usr/bin/php-fastcgi

Теперь нужно подготовить скрипт для инициализации и запуска утилиты spawn-fcgi, которая, в свою очередь, будет инициализировать и запускать экземпляры утилиты php5-cgi.

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

Содержимое скрипта для запуска spawn-fcgi будет следующим:

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 9011 -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

Особое внимание обращаем на фрагмент …-p 9011… в строке 2. Это номер порта, по которому nginx будет обращаться к FastCGI. Номер порта нужно будет учитывать при настройке виртуальных хостов веб-сервера.

Как и в случае с предыдущим скриптом, скрипт init-fastcgi тоже нужно сделать исполняемым.

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

После остается только запустить скрипт init-fastcgi и добавить его в автозагрузку, чтобы он стартовал автоматически при перезагрузке системы.

sudo /etc/init.d/init-fastcgi start
sudo update-rc.d init-fastcgi defaults

Осталось только настроить виртуальные хосты nginx так, чтобы php-скрипты обрабатывались FastCGI. Ниже приведено содержимое файла с примерной конфигурацией виртуального хоста example.org.

1
2
3
4
5
6
7
8
9
10
11
server {
        server_name             example.org;
        listen                  80;
        root                    /var/www/example.org/;
        index                   index.php;
 
        location ~ \.php$ {
                include         fastcgi_params;
                fastcgi_pass    127.0.0.1:9011;
        }
}

Подобная последовательность действий позволяет полностью отказаться от использования веб-сервера Apache, заменив его веб-сервером nginx.