avatar Ubuntu Установка Nginx с PHP-FastCGI и MySQL в Ubuntu 10.04

По просьбам трудящихся, выкладываю короткую статью, от том, как настроить связку Nginx и FastCGI (которая будет обрабатывать PHP скрипты) ну и MySQL-куда без него.
В репозиториях Ubuntu до сих пор лежит древняя версия nginx 0.7.65, тогда как на сайте разработчика доступна 1.0.5 вот ее мы и будем ставить.

Все начинается весьма стандартно:
sudo su


Установка MySQL

aptitude install mysql-server mysql-client

Следуем инструкциям мастера установки, вводим 2 раза пароль и ждем завершения.

Установка Nginx


Для экономии времени (чтобы не создавать конфигурационные файлы и скрипты) будем обновлять старую версию до актуальной, в нашем случае это 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
Должно выдать такое, как на скриншоте:
тест работы php5
Нас интересует строка 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
Должно выдать то, как на скрине выше, если выводит значит виртуальный хост работает нормально
В дальнейшем, новые виртуальные хосты, создаются аналогично этому, только указываем правильные пути к корневой директории и скриптам.
Пользуемся.

19 комментариев

avatar
Судя по сборке nginx, то путь к контенту сайта будет лежать в —
/usr/local/nginx/html

А как изменить путь например на
/var/www

Да и логи например тоже на
/var/log/nginx

??
avatar
откуда такая инфа?!

Корневая директория сайта будет там, где будет указано в конфигах конкретно в default, как и остальные виртуальные хосты можно делать где угодно.
А такая сборка используется для того чтобы конфиги лежали в /etc/nginx.

Срочно читать документацию!
avatar
Ну каким образом он подхватывает виртуальные хосты?
Что должно быть прописано в /etc/nginx/nginx.conf чтобы он подхватил виртуальный хост — default?
У меня например в данный момент nginx, так и работает по путю /usr/local/nginx/html, виртуальные хост default, он почему то не подцепил, где посмотреть в чем проблема?
avatar
Параметры директории, где хранятся виртуальные хосты, находятся в nginx.conf. Nginx подхватывает все файлы которые в ней находятся.
avatar
А как сделать так чтобы он подхватывал хосты из ISPManager? чтобы не прописывать вручную.
avatar
Скажу честно, ISPManager я ни разу не ставил, мне проще зайти через SSH и все сделать руками, да и надежнее, все эти админ-панели от лукавого-мое личное мнение, не претендующие на истину в последней инстанции.
avatar
Вчера до 4х утра возился, без апача не захотело работать… получилось что nginx занял 80 порт, а апач 81 и 443, php-cgi 9000 в php_info() Server API CGI/FastCGI. В общем сам не понял что у меня за велосипед получился =) протестировал производительность через siege средняя скорость отдачи страницы увеличилась на секунду.
avatar
По какой статье ставили?
avatar
По этой, апач просто стопил, и ставил по ней. Самое интересное что панель сама заполнила хосты в /etc/nginx/nginx.conf только почему то они не цеплялись при выключенном апаче и не работали. test.php отрабатывал.
avatar
Nginx работает на какой порту?
test.php работал из /var/www/nginx-default?
Что же вы так сразу на боевом тестить начали, для начала хоть на виртуальке попробовать, разобраться что к чему, а то один сервер остановил, другой установил, так любая работающая система выпадет в глубокий осадок.
avatar
На 80 порту.
Да, потом я путь переписал на /var/www/имя пользователя/data/www/
Ничего страшного, после того как сервер из-за вирусов отключали несколько раз, можно и на боевом пробовать, там сейчас нет сайтов которые должны выдавать постоянный аптайм.
avatar
После взлома не перезалили ОС?! Это не правильно!
В системе могли остаться шеллы, через которые хацкеры будут лазить как к себе домой… У вас есть 100% уверенность что вы вычистили от «подарков»
Сайты слить, ОС переустановить-иначе никакого смысла в этом нет, взломы будут повторяться.

Да и самое главное-ищите причину взлома(как к вам попали на сервер)
avatar
После взлома ось перезалили чистую поставили.
Причина взлома была в устаревшем сайте как я понял там cms 4года не обновлялась, сейчас все ок.
пс: кстати, у вас сообщения не прочитанные никак не выделяются… из-за этого это сообщение даже упустил из виду.
avatar
Отличная идея, подумаю как ее реализовать…
avatar
Сейчас думаю еще раз попробовать поколдовать, но мне кажется я как слепой котенок тыкаюсь везде) Так и не могу понять эти схемы взаимодействия сервера через nginx, apache и php-cgi… статьи еще разные гуглил везде примерно одно и тоже пишут.
avatar
если нужно Nginx+Apache то вот статья
Там и схема присутствует, думаю общий смысл будет понятен
avatar
Вместо извращений с установкой nginx из исходников, я обычно пользуюсь ланчпадом
launchpad.net/nginx
avatar
отличная идея!
Есть что добавить? Регистрируйся и оставляй комментарии!