Главная страница Статьи / Unix Установка и настройка nginx и php-fpm

Рекомендую - скидка 25%

Баннер

Поиск по сайту

Добавить в закладки!

odnaknopka.ru/kolyan.cz

Установка и настройка nginx и php-fpm PDF Печать E-mail
Статьи - Unix

Начну, пожалуй, несмотря на техническую сторону статьи, с небольшого отступления. Nginx - это высокопроизводительный http-сервер. php-fpm - PHP FastCGI Process Manager - это патч для PHP позволяющий более эффективно управлять процессами FastCGI для обеспечения высокой стабильности работы.

Используя nginx и php-fpm вы получаете большую экономию памяти сервера и высокую произоводительность.

В настоящий момент этот блог работает именно на этой технологии, я мигрировал с вебсервера apache 1.3 и php-cgi на nginx php-fpm. Об их настройке будет написано в этой статье.

Итак, краткое описание того что было до инсталляции. Используется виртуальный выделенный сервер под управленим VDSmanager темплейт “современное ПО” , например на хостингах FirstVDS или ISPserver. Однако особой роли этого не играет, подразумевается, что у вас сервер с операционной системой FreeBSD, а nginx можно легко установить из системы портов.

В нем уже предустановлен nginx версии 0.6.31 (на сегодняшний день) и PHP 5.2.6 и некоторое другое ПО (apache 2.2, mysql5, но это не суть важно)

Предположим, что на сервере работает один сайт (реально у меня их больше) - ihtiandr.info и распишу ниже настройку более подробно.

Итак, захотелось мне перевести все это дело на Nginx и php-fpm для экономии памяти. С чего же начать? Начнем с установки php-fpm.

Установка php-fpm на сегодняшний день (28.05.2008) производится следующим образом -
На сайте есть порт для FreeBSD и PHP версии php5-5.2.6RC3 (на сервере уже установлена финальная 5.2.6)

Скачаем его (файл php5-5.2.6RC3-fpm-0.5.8-rc1.tar.gz) к себе на сервер. И распакуем его.

Теперь у нас есть каталог php5-5.2.6RC3-fpm-0.5.8-rc1, но нам нужно пропатчить его до последней версии. Патча на сайте нет. Я нашел патч в конференции google groups highload-php-ru в этом сообщении от 4 мая 2008 года в сообщении от Igor (email заканчивается на * Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript )

Положите патч в каталог php5-5.2.6RC3-fpm-0.5.8-rc1 и запустите его (patch -i update.patch)

Тем самым порт для 5.2.6 готов, остается только скомпилировать его.

Думаю, что когда вы будете ставить, то уже выйдет порт для текущей версии PHP, или предположим, вы будете использовать PHP 4.4.8 и тому подобное)

Выполните команду make (т.е. это обычный freebsd port, файлы скачиваются в /usr/ports/distfiles, собираются в вашем каталоге) и на стадии конфигурации (make config) следует отметить галочки:
[X] CLI Build CLI version
[X] SUHOSIN Enable Suhosin protection system (not for jails)
[X] MAILHEAD Enable mail header patch
[X] PATHINFO Enable path-info-check support

После успешной сборки я не буду инсталлировать автоматически php-fpm (делать make install), дабы не переписать какие-либо темплейтные файлы (просто не хочу, хотя восстановить их через rm -W или удалив “собственные файлы в VDSmanager” проблемы не составляет), а скопирую вручную файл php-cgi из каталога php5-5.2.6RC3-fpm-0.5.8-rc1/work/php-5.2.6/sapi/cgi в /usr/local/bin/php-fpm (переименование в другое имя)
также скопируем файл конфигурации
php5-5.2.6RC3-fpm-0.5.8-rc1/work/php-5.2.6/sapi/cgi/fpm/conf/php-fpm.conf.in в /usr/local/etc/php-fpm.conf
и стартовый скрипт
php5-5.2.6RC3-fpm-0.5.8-rc1/work/php-5.2.6/sapi/cgi/fpm/init.d/php-fpm.in в /usr/local/etc/rc.d/php-fpm выставим права запуска (555) на него.

Исправьте переменные в /usr/local/etc/rc.d/php-fpm, чтобы они имели следующие значения

#!/bin/sh
php_fpm_BIN=/usr/local/bin/php-fpm
php_fpm_CONF=/usr/local/etc/php-fpm.conf
php_fpm_PID=/var/run/php-fpm.pid
php_opts=”–fpm-config $php_fpm_CONF”

Теперь следует настроить конфигурацию /usr/local/etc/php-fpm.conf
Укажите группу и пользователя под которыми запускаются скрипты

Unix user of processes
<value name=”user”>web</value>
Unix group of processes
<value name=”group”>web</value>

Тут ограничение на максимальное число порожденных процессов, по умолчанию их 5, но у меня сервер не нагружен и имеет мало свободной оперативной памяти, поставил 2, но лучше ставить больше.

<value name=”max_children”>2</value>

Укажите адрес и порт на котором работает FastCGI, для VDS надо указывать внешний IP-адрес

<value name=”listen_address”>193.0.0.193:9010</value>

Укажите IP адрес с которого разрешено подключение к php-fpm извне.

<value name=”allowed_clients”>193.0.0.193</value>

На этом начальная настройка php-fpm закончена

Запуск осуществляется как /usr/local/etc/rc.d/php-fpm start

У меня почему-то по невыясненной причине (в messages чисто, особо не разбирался) он не стартует при перезагрузке виртуального сервера, поэтому я прописал эту команду в /etc/rc.local и тем самым проблема решилась.

Настройка nginx

Я отключил apache (в последствии он у меня остался на других портах для кое-каких нужд, но это выходит за рамки данной статьи) и настроил конфигурацию следующем образом, распишу подробно для чего какой пункт в конфигурации

Файл конфигурации /usr/local/etc/nginx/nginx.conf (как я и писал выше, он немного урезанный на один сайт, т.к. сайтов несколько больше)

# максимальное число одновременных connections, я выставил 256 зная
# возможности сервера
#

events {
worker_connections 256;
}

# куда будем писать error.log. Я не стал долго размышлять, ведь уже есть место,
# куда пишет логи apache, не суть важно
#

error_log /var/log/httpd-error.log;

# блок http, думаю тут разъяснения излишни
#

http {

include mime.types;
default_type application/octet-stream;

log_format main ‘$remote_addr - $remote_user [$time_local] $request ‘
‘”$status” $body_bytes_sent “$http_referer” ‘
‘”$http_user_agent” “$http_x_forwarded_for”‘;

# включение режима sendfile и увеличение максимального размера upload (post)
# файлов, т.к. у меня заливаются скриптами большие файлы и умолчания в 1 мегабайт
# недостаточно
#

sendfile on;
client_max_body_size 8m;

# будем компрессировать контент gzip-компрессией (все современные
# браузеры понимают его), тем самым ускорим время загрузки
# страниц и экномим трафик
#

gzip on;

# отдаем ошибки от FastCGI с кодом больше 400 клиенту, а не обработчику ошибок nginx
#

fastcgi_intercept_errors on;

# Если домен не был найден в вируталхостах nginx, то он попадает в первый хост
# в конфигурации (также как и в apache), поэтому создадим вначале хост-заглушку
#

server {

listen 80;
server_name localhost;
root /usr/local/www/nginx/;
index index.html index.htm;
access_log /var/log/httpd-access.log;

}

# Конфигурация виртуальных хостов
# сайт ihtiandr.info

server {

listen 80;
server_name ihtiandr.info www.ihtiandr.info;
root /home/web/data/www/ihtiandr.info/;

index index.php index.html;

access_log /home/httpd-logs/ihtiandr.info.access.log main;

# Используем парольную защиту для директории со статистикой *
#

location /webstat/ {
auth_basic “webstat”;
auth_basic_user_file /usr/local/etc/nginx/htpasswd;
}

# Переписывание всех запросов к несуществующему документу на index.php,
# аналог mod_rewrite в apache, для работы постоянных ссылок в wordpress,
# смотрите ниже еще пример **
#

if (!-e $request_filename) {
rewrite ^.*$ /index.php last;
}

# Передача файлов, имена которых заканчиваются на .php на интерфейс fastCGI (php-fpm)
# для обработки
#

location ~ \.php$ {

fastcgi_pass 193.0.0.193:9010;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/web/data/www/ihtiandr.info$fastcgi_script_name;
include fastcgi_params;

}

# конец файла, не забываем про закрывающие фигурные скобки в конце
# для закрытия директив server и http
#

}

}

* Файл с паролями /usr/local/etc/nginx/htpasswd имеет вид

user:$1$4M6WtgGM60101234xZ
user1:$1$4M6WtgGM60101234xY

Пароли зашифрованы алгоритмом crypt, т.е. создается с помощью обыного htpasswd, можно посмотреть в имеющихся паролях пользователя на статистику.

** Переписывать ссылки средствами rewrite можно и более сложно, например

if (!-e $request_filename) {
rewrite ^([^\.]*)$ /clamshell.php?u=$1 last;
}

То есть мы переписываем все что после доменной части после знака / на файл clamshell.php?u=текст_после_домена

Запуск nginx осуществляется командой /usr/local/etc/rc.d/nginx start
Предварительно следует написать в /etc/rc.conf строку nginx_enable=”YES”

На этом начальная настройка nginx и php-fpm закончена.

 

=======================================================

Комментарии к статье:

  1. Добавлю от себя:
    В конфиге nginx`а у меня ещё есть запись

    location /awstatsicon {
    alias /usr/local/www/awstats/icon;
    }

    В секции домена. Это чтобы картинки в статитстике отображались :)
    Минус использования php-fpm вместо apache - меньшая “динамическая расширяемость”:
    Апач форкается в зависимости от запросов, а php-fpm их ставит в очередь. Поэтому нужно чётко знать нагрузку на сервер, чтобы выставить количество процессов php-cgi. Иначе клиенты могу получить и “connections refused”

    Я вместо того, чтобы извращаться с оставлением теплейтного PHP специально снёс всё подчистую. Вот будет обновление темплейта, обновится PHP, а твой PHP-FPM нет. Последствия неизвестны. Может просто в сегфолт падать будет при запуске и будет простой сайтов, пока ты его не обновишь, а может он ещё что-нить напакостит. Я лучше сам если, что полностью PHP обновлю.

    Comment by http://tuupic.org.ru/ — May 30, 2008 @ 8:09 pm

  2. Согласен, лучше совсем пересобрать, весь php.
    А вот по поводу динамической расширяемости - ты путаешь с обычным php FastCGI, FPM как раз преследовал одной из целей уход от этого ограничения, так что неправда ваша. Форкаются они также взависимости от запросов и настраиваются очень похоже на Apache.

    Comment by Sergey Klimov — May 30, 2008 @ 11:19 pm

  3. На сайте PHP-FPM по поводу расширяемости я вижу такую строку:

    “Динамическое количество процессов, в зависимости от нагрузки TODO”
    http://php-fpm.anight.org/current_php_fastcgi_problems.html

    То есть это в процессе разработки. Но сейчас пока не реализовано. Или я не прав?

    Comment by http://tuupic.org.ru/ — June 1, 2008 @ 10:11 am

  4. Есть ошибка. Вместо
    php_opts=”–fpm-config $php_fpm_CONF”
    нужно
    php_opts=”–fpm-config $php_fpm_CONF”

    Comment by Dor an'Tor — June 3, 2008 @ 7:38 pm

  5. блин. движок блога втихую преобразует “- -” в “–”
    т.е. должно быть:
    php_opts=”- -fpm-config $php_fpm_CONF”
    но между тирешками нужно убрать пробел.

    Comment by Dor an'Tor — June 3, 2008 @ 7:40 pm

  6. И ещё момент. У меня не создавался pid файл, пока я не прописал ручками в
    /usr/local/etc/php-fpm.conf
    настройки:
    /var/run/php-fpm.pid
    /var/log/php-fpm.log

    После этого команды
    /usr/local/etc/rc.d/php-fpm stop
    /usr/local/etc/rc.d/php-fpm start
    стали работать правильно.

    Comment by Dor — June 5, 2008 @ 5:37 am

  7. > И ещё момент. У меня не создавался pid файл, пока я не прописал
    > ручками в /usr/local/etc/php-fpm.conf

    Да, извините, забыл записал когда делал про этот момент

    Comment by Slava — June 10, 2008 @ 3:37 am

  8. И еще чуть-чуть замечание в плане безопасности (выяснилось в процессе работы нескольких уже сайтов на этой конфигурации), пока тестируется, но все работает, применяется к ISPmanager особенно, следует обратить внимание

    php-fpm более безопасно пускать под юзером nobody например (можно и под другим), а не под web (или какой там у тебя), группу оставить

    То есть в конфиге прописать
    nobody

    Поясняю почему так

    Дефотовые права

    root@gw:/home/web/data/www/ihtiandr.info# ls -l
    -rw-r–r– 1 web web 94 19 ноя 2006 index.php

    тем самым читать после смены юзера на nobody файлы он может (и выполняет, вот что самое главное)

    А вот переписать index.php из-за дыр в скриптах каких-либо уже не сможет

    Соответственно на директории куда надо писать файлы скриптам у меня права стоят соответствующие 775 например

    очень безопасно в плане дефейсов как вариант

    вроде бы пока все работает, проблем нет

    Также рекомендую подключать eaccelerator - скорость работы возрастает значительно, правда память любит - возрастает расход мегабайт на 8 у каждого php-fpm процесса

    во FreeBSD его подцеплять просто вот так в /usr/local/etc/php/extensions.ini дописываем

    extension=eaccelerator.so
    eaccelerator.shm_size=”16″
    eaccelerator.cache_dir=”/var/tmp/eaccelerator”
    eaccelerator.enable=”1″
    eaccelerator.optimizer=”1″
    eaccelerator.check_mtime=”1″
    eaccelerator.debug=”0″
    eaccelerator.filter=”"
    eaccelerator.shm_max=”0″
    eaccelerator.shm_ttl=”0″
    eaccelerator.shm_prune_period=”0″
    eaccelerator.shm_only=”0″
    eaccelerator.compress=”1″
    eaccelerator.compress_level=”9″

    Директорию /var/tmp/eaccelerator создать надо и поставить права на нее 777

    Comment by Slava — June 19, 2008 @ 1:47 am

  9. 2 замечания:
    Во-первых сразу оламывается, то ради чего в 50% случаев используется CGI - скрипты не смогут закачивать файлы
    Во-вторых, кто мешает пускать FastCGI от WWW, при этом назначив владельца файлам и дирам user? Эффект тот же

    Comment by http://tuupic.org.ru/ — June 19, 2008 @ 11:51 pm

 

 
Документация @ Ihtiandr.Info