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

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

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

<> install libpcre3-dev libcurl4-openssl-dev gcc </code>

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

<code> sysoev.ru/nginx/nginx-1.0.5.tar.gz</code>

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

<code>tar -zxvf nginx-1.0.5.tar.gz</code>

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

<code>cd nginx-1.0.5</code>

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

<code>./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- \
--with-_ssl_module
make
make install
</code>

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

<code>/etc/init.d/nginx start</code>

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

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

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

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

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

<code>aptitude install -cgi -mysql -curl -gd -idn php- -imagick -xmlrpc -imap -mcrypt -memcache -mhash -ming -pspell -xsl -recode -snmp -sqlite -tidy</code>

 

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

<code>nano /etc/php5/cgi/php.ini</code>

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

<code>;cgi.fix_pathinfo = 1</code>

Стало:

<code>cgi.fix_pathinfo = 0</code>

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

<code>aptitude install lighttpd</code>

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

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

<code>update-rc.d -f lighttpd remove</code>

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

<code>/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/-php.pid</code>

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

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

<code>nano /etc/nginx/sites-available/default</code>

Добавляем туда в контейнер server {} секцию

<code>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;
        }</code>

Сохраняем изменения выходим и перезапускаем nginx:

<code>/etc/init.d/nginx restart</code>

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

<code>nano /var/www/nginx-default/test.php</code>

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

<code>&lt;?php
phpinfo();
?&gt;</code>

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

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

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

<code>nano /etc/rc.local</code>

И добавляем туда, перед строкой  0

<code>/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</code>

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

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

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

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

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

<code>sudo nano /etc/nginx/sites-available/example.org</code>

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

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

        _log  //example/logs/nginx..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;
        }
}</code>

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

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

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

<code>sudo useradd example -b /home/ -m -U</code>

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

<code>sudo passwd example</code>

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

<code>sudo mkdir -p -m 754 /home/example/www
sudo mkdir -p -m 754 /home/example/logs</code>

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

<code>sudo  -R example: /home/example/www/
sudo  -R example: /home/example/logs/</code>

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

<code>usermod -a -G example www-data</code>

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

<code>nano /home/example/www/test.php</code>

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

<code>&lt;?php
phpinfo();
?&gt;</code>

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

<code>sudo /etc/init.d/nginx restart</code>
Переходим по тестовому адресу httр://example.org/test.php

Запись навигация

Top