Ubuntu → Настройка Nginx с поддержкой PHP-FPM в Ubuntu 12.04 (включает: Nginx, php-fpm, MySQL, Memcached)
Лично я, стараюсь использовать именно LTS дистрибутивы, основная причина моей любви к ним-придонная лень, все дело в том что если возится с этим дома, настраиваешь, потом перенастраиваешь, затем слегка допиливаешь, а потом все это сносишь и делаешь как нужно , то это интересно, но когда ты работаешь в крупной сети, то на такие эксперименты, обычно, нет времени т.к. других задач припасено на пару недель вперед. В общем, все интересно делать самому, пока это не дошло до промышленных масштабов, а вот когда ты к ним пришел, то уже стараюсь максимально упростить и автоматизировать работу. Но все это лирика, переходим к практике.
Как всегда: Предполагается что операционная система у вас уже установлена, сеть настроена, интернет шустрый, провайдер не жадный (качать будем много)…
Учтя все предыдущие недостатки, мы будем ставить, все из репозиториев, собирать в ручную мы ничего не будем.
Поднимем права до root:
sudo su
Добавим туда, официальное зеркало Nginx, то в каком виде представлен данный пакет, отражает видение его разработчиков:
Теперь нам нужно скачать GPG ключ:
Установим GPG ключ:
Обновим список пакетов:
Установим Nginx:
Нам необходимо устранить уязвимость PHP:
Находим строку:
Приводим ее к виду:
Сохраняем изменения и перезапустим PHP-FPM:
При создании пользователя, отключим ему доступ к шеллу, так безопаснее.
также, при создании пользователя, мы завели одноименную группу example, она нам также пригодится.
Придумаем для пользователя example пароль:
Создадим необходимые, для работы WEB сайта, директории:
Предоставляем пользователю example права на них:
Предоставим Nginx доступ в домашнюю директорию пользователя example, добавив пользователя www-data в группу example
С содержимым:
(Здесь я привожу только базовые настройки, чтобы работало, если нужно добавить что-то дополнительно, то вы сделаете это сами, исходя из ваших задач )
Обращаю внимание!
Все виртуальные хосты должны иметь в названии расширение .conf, иначе виртуальный хост не будет загружен. Чтобы это исправить, можно зайти в:
найти строку:
и привести к такому виду, с каким вы привыкли работать или тем что вам удобнее, лично я рекомендую оставлять все как есть!
Создадим тестовый файл, чтобы проверить работоспособность PHP5:
С содержимым:
Перезапустим Nginx, чтобы изменения вступили в силу:
Переходим по тестовому адресу httр://example.org/test.php
Получаем то, что написано на экране, нас интересует строка Server API ( на скриншоте подчеркнуто красным) там указывается, кто у нас обрабатывает скрипты PHP.

Наш сервер уже работоспособен, осталось добавить сопутствующие приложения MySQL и memcached
Придумываем пароль для пользователя root (Администратор сервера баз данных)
Для применения изменений перезапустим PHP-FPM
Чтобы удостовериться что модуль установился и работоспособен, снова переходим по адресу httр://example.org/test.php
Находим пункт memcached

Также, для закачки файлов вам потребуется установить FTP сервер, о способах его настройки можно прочить в опубликованной ранее статье-Настройка FTP сервера vsFTPd, статья актуальна до сих пор, по этому, я не вижу смысла ее обновлять.
Теперь наш сервер полностью упакован, у нас получилась отличная заготовка, которая будет обновятся из основных репозиториев, также нам не пришлось ничего собирать руками, от вас теперь только требуется расширять функционал, исходя из тех задач-которые перед вами ставятся…
Ну и как всегда, обо всех найденных ошибках, а также предложениях по улучшению функционала, да и просто вопросов, прошу в комментарии.
Как всегда: Предполагается что операционная система у вас уже установлена, сеть настроена, интернет шустрый, провайдер не жадный (качать будем много)…
Учтя все предыдущие недостатки, мы будем ставить, все из репозиториев, собирать в ручную мы ничего не будем.
Поднимем права до root:
sudo su
Установка Nginx
Для начала добавим репозиторий проекта Nginx:nano /etc/apt/sources.list
Добавим туда, официальное зеркало Nginx, то в каком виде представлен данный пакет, отражает видение его разработчиков:
deb http://nginx.org/packages/ubuntu/ precise nginx
deb-src http://nginx.org/packages/ubuntu/ precise nginx
Теперь нам нужно скачать GPG ключ:
wget http://nginx.org/keys/nginx_signing.key
Установим GPG ключ:
apt-key add nginx_signing.key
Обновим список пакетов:
aptitude update
Установим Nginx:
aptitude install nginx
Установка PHP-FPM:
aptitude install php5-cli php5-common php5-mysql php5-suhosin php5-gd php5-fpm php5-cgi php5-fpm php-pear php5-mcrypt -y
Нам необходимо устранить уязвимость PHP:
nano /etc/php5/fpm/php.ini
Находим строку:
;cgi.fix_pathinfo = 1
Приводим ее к виду:
cgi.fix_pathinfo = 0
Сохраняем изменения и перезапустим PHP-FPM:
/etc/init.d/php5-fpm restart
Создадим пользователя для работы с виртуальным хостом
Чтобы не заморачиваться, назовем его example:При создании пользователя, отключим ему доступ к шеллу, так безопаснее.
useradd example -b /home/ -m -U -s /bin/false
также, при создании пользователя, мы завели одноименную группу example, она нам также пригодится.
Придумаем для пользователя example пароль:
passwd example
Создадим необходимые, для работы WEB сайта, директории:
mkdir -p -m 755 /home/example/www
mkdir -p -m 754 /home/example/logs
Предоставляем пользователю example права на них:
chown -R example: /home/example/www/
chown -R example: /home/example/logs/
Предоставим Nginx доступ в домашнюю директорию пользователя example, добавив пользователя www-data в группу example
usermod -a -G example www-data
Создадим виртуальный хост Nginx
Настаиваем первый виртуальный хост Nginx, назовем его example.orgnano /etc/nginx/conf.d/example.org.conf
С содержимым:
(Здесь я привожу только базовые настройки, чтобы работало, если нужно добавить что-то дополнительно, то вы сделаете это сами, исходя из ваших задач )
server {
listen 80;
root /home/example/www;
access_log /home/example/logs/nginx.access.log; #расположение логов данного хоста
server_name example.org www.example.org;
location / {
index index.php index.html index.htm;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Обращаю внимание!
Все виртуальные хосты должны иметь в названии расширение .conf, иначе виртуальный хост не будет загружен. Чтобы это исправить, можно зайти в:
nano /etc/nginx/nginx.conf
найти строку:
include /etc/nginx/conf.d/*.conf;
и привести к такому виду, с каким вы привыкли работать или тем что вам удобнее, лично я рекомендую оставлять все как есть!
Создадим тестовый файл, чтобы проверить работоспособность PHP5:
nano /home/example/www/test.php
С содержимым:
<?php
phpinfo();
?>
Перезапустим Nginx, чтобы изменения вступили в силу:
/etc/init.d/nginx restart
Переходим по тестовому адресу httр://example.org/test.php
Получаем то, что написано на экране, нас интересует строка Server API ( на скриншоте подчеркнуто красным) там указывается, кто у нас обрабатывает скрипты PHP.

Наш сервер уже работоспособен, осталось добавить сопутствующие приложения MySQL и memcached
Устанавливаем MySQL
aptitude install mysql-server mysql-client mysql-common
Придумываем пароль для пользователя root (Администратор сервера баз данных)
Установка Memcached
aptitude install memcached php5-memcached
Для применения изменений перезапустим PHP-FPM
/etc/init.d/php5-fpm restart
Чтобы удостовериться что модуль установился и работоспособен, снова переходим по адресу httр://example.org/test.php
Находим пункт memcached

Также, для закачки файлов вам потребуется установить FTP сервер, о способах его настройки можно прочить в опубликованной ранее статье-Настройка FTP сервера vsFTPd, статья актуальна до сих пор, по этому, я не вижу смысла ее обновлять.
Теперь наш сервер полностью упакован, у нас получилась отличная заготовка, которая будет обновятся из основных репозиториев, также нам не пришлось ничего собирать руками, от вас теперь только требуется расширять функционал, исходя из тех задач-которые перед вами ставятся…
Ну и как всегда, обо всех найденных ошибках, а также предложениях по улучшению функционала, да и просто вопросов, прошу в комментарии.
119 комментариев
Для примера можно посмотреть: howitmake.ru/blog/ubuntu/42.html
Ну и поиск рулит.
А вам для чего такая сложная конфигурация?
Думаю что для вашего проекта за глаза хватит nginx с php-fpm, а если он выстрелит, то том уже будете смотреть в каком направлении масштабирования вам двигаться.
По поводу VPS соглашусь лишь от части, процессорное время там жестко ограничено, но ничего не мешает вам настроить кеширование, а по мере роста сайта, просто добавлять ресурсов, ну или если у вас там все серьезно, то уйти в облако например у Амазон, там вообще все круто, вы оплачиваете только использованные ресурсы.
Хотя думаю будет сложно(во всяком случае мне), если данная схема не ограничивается 1 сервером, и разговор уже идёт про кластер :D
Хотя, 2500 руб не такая крупная сумма, а если на «сервант» взять еще и соседей, то совсем не дорого получится. Главное-настройте резервное копирование!
По поводу бэкапов вроде по крону можно всё нормально организовать, но для лс есть варикан попроще недавно был добавлен тестовый плагин backup он бесплатный.
А можно ссылку на ваш сайт, в личку? Просто интересно посмотреть чем люди интересуются.
1. Почемы вы не используете для виртуальных хостов директорию /etc/nginx/sites-available/ с последующим симлинков в /etc/nginx/sites-enabled/
2. Почему вы добавляете пользователя nginx в шруппу к вашему пользователю, а не используете конфигурационные файлы в /etc/php5/fpm/pool.d/ где можно указать выполнения от имени вашего пользователя
3. Раз вы используете php5-fpm, то думаю лучше использовать
вместо
просто в свое время отхватил кучу проблем с последним
1) в сборке Nginx от nginx.org -это не требуется, а править конфиги не особо хотелось, да и откровенно говоря, мне не очень нравится схема с сим.линками.
2) согласен с вами на 100%
3) Да работа через сокет немного повышает скорость из-за того что не проверяется целостность данных в отличии от TCP.
З.Ы. Я не утверждаю что мое мнение единственно-верное, вы, свои замечания, лучше оформите в виде небольшого дополнения к статье, а я сделаю ссылку на нее, как один из вариантов решения, думаю, ваш опыт будет весьма полезен другим людям, поделитесь им!
Конечно можно, просто я с MacOS не работаю, ей у нас занимаются другие люди…
Если есть вопросы, обращайтесь в личку.
Должен признать, я полный нуб в администрировании сервера и практически не работал с ОС на базе Linux. Возникла необходимость настроить LAMP на VPS c предустановленным Ubuntu minimal.
Решил воспользоваться данным мануалом. С горем пополам дошел до шага с созданием файла test.php, после этого при попытке перезагрузки nging нарвался на сообщение:
Даже не знаю, с какой стороны хвататься за проблему, то ли писать тикет в саппорт хостера, то ли начинать учить мат часть основательно.
Пожалуйста, толкните в нужном направлении.
Теперь уперся в то, что у меня не открывается мой httр://example.org/test.php, его нужно вбивать просто в браузере или есть хитрости?
Коннекчусь к серверу через Putty.
Заранее спасибо за ответ.
1.Хочу обновить свой nginx 0.5.3 до последней версии.В связи с этим возникает вопрос. После этих манипуляций, сайты стоящие на моем nginx не удалятся?
2.Пользователи и группу не удалятся?
3.У меня еще много вопрос.Например что такое GPG ключ, Memcached для чего они нужны.PHP-FPM чем отличается от обычного PHP?
Можно было у вас на сайте сделать FAQ по всем этим и другим вопросом
Так уже все давно написано, просто это для меня элементарно, по этому я не писал об этом. Тем более что я один поддерживаю этот сайт, а помимо этого, служебные обязанности никто не отменял, проблема в том что все хотят только получать, но не хотят что-то делать, а объять необъятное одному человеку не реально. ))
Если кому понадобится
в секции [mysqld]
default-storage-engine = myisam
skip-innodb
А в чем у вас бала проблема, ну запущены процессы и что-серверу от этого плохо становилось?
Принимать решения нужно ситуационно, а не увидил-испугался-бросил ядрену бомбу, так на всякий случай… ;)
На всякий случай прилагаю скриншот.
Как уже пробовал бороться:
В конфиге nginx включил gzip, установил zip и в php.ini прописал его поддержку, права на все папки и сам файл editor_plugin.js стоят 777, — все это не помогает.
А что говорят форумы поддержки, не думаю что вы один сталкиваетесь с данной проблемой…
1)Я использую wordpress 3.5 — не работает ЧПУ (создал .htaccess как было написано в панеле управления)
2)Можно узнать как правильно сделать виртуальные хосты? (я собираюсь использовать такие адреса mc.server.rabotki.net и srv.rabotki.net)
3)Вот столько потребляется озу у меня
1) Nginx не воспринимает .htaccess они работают только в Apapche! Чтобы работали ЧПУ нужно прописать рерайты в конфиге виртуального хоста, рабочий пример ддя Nginx легко гуглится за пару минут.
2) Пример создания виртуального хоста сесть в статье, но там базовый функционал, если нужно что-то добавить, думаю что вы лучше меня знаете какой функционал вам нужен, а я, к сожалению, не телепат. :)
3) У вас есть проблемы с потреблением ОЗУ?! Лично я их не вижу, у вас система в аптайме всего 2 часа и использовано 160Мб в чем проблема? По поводу отображения на экране, расшифровку легенды можно посмотреть в самом htop
Пришлось пошаманить и Вот наговнокодил конфиг nginx который вроде как работает в wordpress 3.5
выдает:
nginx: [emerg] invalid number of arguments in «fastcgi_param» directive in /etc/nginx/conf.d/example.conf:16
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
создал другой teamspeak.danfis.eu пишет 403 Forbidden
попробовал с правами поиграться для него — мимо (делал 7777 на все каталоги и файлы внутри пользователя)
что не так??
Если 403 Forbidden — то не хватает прав доступа.
Посмотрите в логах, там все написано…
2013/03/04 16:14:38 [error] 22699#0: *2 open() "/home/example/www/favicon.ico" failed (2: No such file or directory), client: 213.219.*.*, server: ***.eu, request:$
с favicon.ico в принципе все ясно — touch.
а вот, что делать с directory index of "/home/example/www/" is forbidden
не понятно. я ведь при создании права указывал.(все как в мануале.)
Создайте в корневой директории файл index.php с содержимым:
трабл был из-за того, что послушал камент выше, от другого пользователя
fastcgi_pass unix:/var/run/php5-fpm.sock;
log:
2013/03/04 16:41:40 [crit] 22838#0: *3 connect() to unix:/var/run/php5-fpm.sock failed (2: No such file or directory) while connecting to upstream, client: 213.219.
у меня в этой директории только php5-fpm.pid
у меня в этой директории только php5-fpm.pid
fastcgi_pass 127.0.0.1:9000;
надо вставить
fastcgi_pass unix:/var/run/php5-fpm.sock;
И БОЛЬШОЕ СПАСИБО за статью!!!
Есть возможность подключения через TCP или через сокет.
Сокет работает быстрее из-за того что проверяет целостность данных, тогда как TCP проверяет, но он несколько медленный в работе, но это имеет значение лишь при высоких нагрузках.
Так что, это ошибкой не считается…
конфиг:
PS: Пост интересный, спасибо. Хочу добиться конечного результа (неделю бьюсь).
*** — это example. Путь существует. Права заданы.
Обьясните подробнее пожалуйста.
Строка 3, похоже лишний пробел
ну и кусок конфига
Физически не было каталога /usr/local/nginx/ и файла /home/vtgsm/logs/nginx.access.log
все создал. реакций ноль…
или просто добавьте пользователя www-data в группу vtgsm
конфигурацию ставлю на Debian 6.0 2.6.32-5.686-bigmem
Переустановил nginx:
ошибка не ушла, права по мануалу…
конфиг виртуалки:
1) Нет директорий.
2) Нет прав на запись в эти директории.
Других вариантов тут быть не может, чисто технически.
странно что при проверке синтаксиса он это не выдал…
на данный момент спасибо поеду дальше.
в логах пишет *1 connect() failed (111: Connection refused) while connecting to upstream, client: 127.0.0.1, server: localhost, request: «GET / HTTP/1.1», upstream: «fastcgi://127.0.0.1:9000», host: «localhost»
подскажите что делать
php5-fpm запущено?
правилами фаерволла порт 9000 не заблокирован?
Машина с которой стучусь также на виртуалке.
в файле hosts пробывал вводить и 192.168.1.1 example.org/test.php и просто хост(без ip).
Запись в файле host выглядит так
А что толку вводить доменное имя без IP куда система будет стучаться?!
Все остальные настройки делаются через конфигурационный файл виртуального хоста.
Также, причину ошибки, всегда можно посмотреть в логах.
в логах следующее
проверьте права на выполнение скрипта
service php5-fpm restart
результата нет
файл hosts правил…
паравильно:
example.org/test.php
Две машины.
1-я: 192.168.10.1 — на ней сервер Ubuntu 14.04, шлюз, DNS+DCHP, squid.
2-я: 192.168.10.11 — Linux mint 16. Адрес получает по DCHP.
Не могу зайти со 2-го ПК gal-ex.org/test.php. Не может определить IP-адрес по имени узла «gal-ex.org». В /etc/hosts прописал (на 2-ом):
127.0.0.1 localhost
127.0.1.1 mars
192.168.10.1 gal-ex.org # Ссылка на сервер.
Сервисы nginx, php5-fpm — запущены. Логи nginx, php — пустые. ping gal-ex.org — проходит. Думаю, проблема в разрешении имен DNS. Но как исправить и добиться работы, пока знаний не хватает.
igor@mars ~ $ nslookup gal-ex.org
Server: 192.168.10.1
Address: 192.168.10.1#53
** server can't find gal-ex.org: NXDOMAIN
Кстати, пробиваюсь к nginx через IP, но он оправляет на /usr/share/nginx/html. Хотя в конфиге написано:
Ещё, имя пользователя в энджинске (nginx.conf) у меня было nginx поменял на www-data, но ничего не произошло.
#user nginx;
user www-data;
Файлы все на месте, логи правда не пишутся.
nginx/1.6.0
Ubuntu Server 14.04
Даже не знаю в какую сторону копать, перепробовал множество мануалов в Интернете, ни один не рабочии
Ну если вы все сделали в точности по инструкции, то откуда взялась директория example?
В примере указан адрес example.org, но чтобы зайти по адресу, нужно добавить запись в файл hosts или, чтобы ходить по ip, нужно править дефолтный виртуальный хост, который находится /etc/nginx/conf.d/default
на example.org 403 forbidden
на файле test.php 502 ошибка
Вот лог nginx^
Что показывает команда
приложение слушает порт?
Проблема решилась заменой в файле /etc/php5/fpm/pool.d/www.conf
listen = /var/run/php5-fpm.sock
НА
listen = 127.0.0.1:9000
нужно добавить запись
А строку которая 127.0.0.1:9000 закомментировать, ну и перезупустить php-fpm
а также поправить настройки виртуального хоста Nginx
Консоль в хроме показала выигрыш в 10ms (скрипт просто echo string)
Просто у меня опыта работы в линуксе нет) вот и паникую
У меня тоже была проблема как у winil, решил ее так же через , т.к. по дефолту в значение стояло .
Не знаю, на что это влияет, но заработало. Теперь другая проблема: файлы читаются только если создавать их через , подозреваю, что проблема в доступе, но как это исправить? Например, поставил фреймворк, там ничего не читает.