Установка Nginx с PHP-FastCGI в Ubuntu

По просьбам трудящихся, выкладываю короткую статью, от том, как настроить связку Nginx и FastCGI (которая будет обрабатывать PHP скрипты).

Для экономии времени (чтобы не создавать конфигурационные файлы и скрипты) будем обновлять старую версию до актуальной, в нашем случае это 1.0.5

aptitude install libpcre3-dev libcurl4-openssl-dev gcc nginx

Качаем свежие исходники:

wget sysoev.ru/nginx/nginx-1.0.5.tar.gz

Распаковываем:

tar -zxvf nginx-1.0.5.tar.gz

Заходим в директорию с распакованными файлами:

cd nginx-1.0.5

Собираем и устанавливаем:

./configure --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --pid-path=/var/run/nginx.pid \
--user=www-data \
--group=www-data \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_gzip_static_module \
--with-mail \
--with-mail_ssl_module
make
make install

Запускаем то, что мы там накомпилировали:

/etc/init.d/nginx start

Напоминаю тем, кто будет пользоваться данным мануалом на уже настроенном «боевом сервере», а такие найдутся, уж поверьте-периодически в личку пишут просьбы о помощи в восстановлении старых конфигов, которые были сделаны еще бог знает когда.

Перед обновлением ОБЯЗАТЕЛЬНО скопировать конфигурационные файлы web сервера в безопасное место, чтобы не было проблем с восстановлением того, что до этого нормально работало.

По идее, старые конфиги не затираются, но не известно, как пойдет обновление-в общем рекомендация банальная до безобразия:Резервное копирование лучший друг сис.админа! На этом, с тягомотиной все.

Установка PHP-cgi

Установка из из исходников -большая возня и отнимает много времени, по этому будем ставить из репозиториев:

aptitude install php5-cgi php5-mysql php5-curl php5-gd php5-idn php-pear php5-imagick php5-xmlrpc php5-imap php5-mcrypt php5-memcache php5-mhash php5-ming php5-pspell php5-xsl php5-recode php5-snmp php5-sqlite php5-tidy

 

переходим в конфигурационный файл PHP:

nano /etc/php5/cgi/php.ini

находим строку cgi.fix_pathinfo = 1 и снимаем с нее комментарий
Было:

;cgi.fix_pathinfo = 1

Стало:

cgi.fix_pathinfo = 0

Сохраняем изменения, выходим.
Теперь нам необходимо установить web сервер lighttpd, сам сервер нам не нужен, но вместе с ним идет весьма ценный для нас модуль-spawn-fcgi

aptitude install lighttpd

После установки выйдет ошибка, что порт 80 занят-это нормально у нас там Nginx.

Теперь удаляем из автозагрузки lighttpd:

update-rc.d -f lighttpd remove

Нам необходимо запустить spawn-fcgi

/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

Из написанного видно что закупается spawn-fcgi на порту 9000, от имени пользователя www-data.

Теперь нам необходимо настроить nginx для выполнения PHP:

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:

/etc/init.d/nginx restart

Создадим тестовый файл:

nano /var/www/nginx-default/test.php

C содержимым:

<?php
phpinfo();
?>

Открываем браузер и переходим по адресу httр://ip_server/test.php

Нас интересует строка ServerAPI (обведено красным) там написано CGI/FastCGI, значит все работает нормально.

Есть еще один важный момент, демон spawn-fcgi не добавлен в автозагрузку, каждый раз запускать в ручную после перезагрузки сервера -не вариант, так что автоматизируем этот процесс:

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

Сохраняем изменения и выходим.

Перезагружаем сервер и переходим по тестовому адресу httр://ip_server/test.php снова,
если тестовая страница PHP открывается, значит все завелось автоматически.
Теперь нам необходимо создать первый виртуальный хост.

Создаем виртуальный хост Nginx

Я делал его на основе дефолтного конфига, а чтобы было проще для понимания-выкинул из него все лишнее.

Создаем сам файл:

sudo nano /etc/nginx/sites-available/example.org

Следующего содержания:

server {
        listen   80;
        server_name  example.org www.example.org; #доменные имена по которым будет откликаться наш хост

        access_log  /home/example/logs/nginx.access.log; #расположение логов данного хоста

        location / {
                root   /home/example/www/; #расположение корневой директории сайта
                index  index.php index.htm; #файлы которые будут загружаться по умолчанию
        }

#       location /doc {
#               root   /usr/share;
#               autoindex on;
#               allow 127.0.0.1;
#               deny all;
#       }

        location /images {
                root   /usr/share;
                autoindex on;
        }
        # Секция отвечающая за обработку PHP
        location ~ \.php$ {
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  /home/example/www$fastcgi_script_name; #путь указывающий на место хранения скриптов, для каждого виртуального хоста указывам свой путь
                include        fastcgi_params;
        }

}

Теперь нам необходимо создать символическую ссылку на свеже-созданный файл из директории
sites-enabled Чтобы наш хост подключился к после перезагрузки сервера:

ln -s /etc/nginx/sites-available/example.org /etc/nginx/sites-enabled/

Теперь, нам необходимо создать пользователя и необходимые директории для сайта:
Создаем пользователя:

sudo useradd example -b /home/ -m -U

и пароль для него:

sudo passwd example

Создадим директории для сайта:

sudo mkdir -p -m 754 /home/example/www
sudo mkdir -p -m 754 /home/example/logs

Предоставляем пользователю example права на них:

sudo chown -R example: /home/example/www/
sudo chown -R example: /home/example/logs/

Т.к. у нас Nginx работает от пользователя www-data, то он не сможет получить доступ к содержимому домашней директории пользователя example, но при создании была создана одноименная группа, в нее нам необходимо добавить пользователя www-data.

usermod -a -G example www-data

Создаем тестовый файл, в корневой директории нашего виртуального хоста:

nano /home/example/www/test.php

C содержимым:

<?php
phpinfo();
?>

Перезапускаем nginx

sudo /etc/init.d/nginx restart

Переходим по тестовому адресу httр://example.org/test.php