7
ноября
0

PHP в режиме FastCGI средствами патча PHP-FPM + Nginx



Высокой производительности веб-сервера можно достичь используя в качестве front-end Nginx, а в качестве back-end PHP-FastCGI-сервер.

Преимущества Nginx и FastCGI:

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

При такой схеме возможно обрабатывать большое количество запросов за небольшое время. Nginx может использоваться как самостоятельный HTTP-сервер или как reverse proxy перед Apache или любым другим тяжелым веб-сервером, чтобы снять часть нагрузки. Apache при этом выступает в качестве бэк-енда для генерации динамического контента, но Apache достаточно громоздкий и тяжелый, к тому же он требует много памяти.

Множество запросов к веб-серверу порождают много параллельных потоков/процессов, которые удерживаются в памяти, пока клиентское соединение не будет закрыто. Поэтому целесообразно использовать nginx для приема соединений и отдачи статики, а обработку динамики передавать «главному» серверу. Для обработки динамики в nginx используется проксирование и FastCGI. Кэширование и отдача статики выполняется самим nginx. Все будет работать абсолютно прозрачно для уже написанных скриптов.
Для указания какие статические файлы будет отдавать nginx можно создать секцию с таким location:

location ~* ^.+.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|
pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$

Для перенаправления всех запросов к файлам .php на определенный tcp-порт, прослушиваемый FastCGI-сервером, нужно в файле конфигурации nginx.conf создать отдельную секцию location:

location ~ .php$ { fastcgi_pass   127.0.0.1:1900;}

Проблема CGI программ в том, что они должны быть перезапущенны веб-сервером при каждом запросе, что приводит к понижению производительности. CGI программы соединены с сервером через pipe’ы. По сравнению с CGI протокол FastCGI является более производительным и безопасным, который не тратит время на создание fork-ов (новых процессов). FastCGI-процессы используют Unix Domain Sockets или TCP/IP для связи с сервером.

При использовании PHP как CGI выделяются следующие достоинства:

— доступна индивидуальная настройка PHP для пользователя;
— выполнение скриптов с правами пользователя;
— меньший расход оперативной памяти, чем при использовании PHP, как модуль apache;
— ошибки в скриптах не приводят к падению веб-сервера в отличие от режима PHP, как модуль apache.

При использовании PHP как FastCGI:

— за счет кэширования некоторых промежуточных данных скрипт не интерпретируется каждый раз при выполнении и достигается более высокая скорость по сравнению с PHP как CGI;
— является более безопасным, как с точки зрения прав доступа, так и с точки зрения наличия ошибок в работе посторонних скриптов.

Запуск встроенного в PHP сервера FastCGI – метод, не требующий никаких дополнительных утилит. Для этого используется команда:

php-cgi -b 127.0.0.1:9000

Запуск PHP внутри какого-либо стороннего обработчика запросов – этот вариант может быть более удобным так как имеет большую гибкость в настройке. Контролировать процесс FastCGI внешними программами можно, к примеру, такими, как spawn-fcgi, чтобы запустить FastCGI процесс в своём окружении, выставить ему user-id, group-id и сменить корневую директорию (chroot).

На данный момент в портах FreeBSD можно найти при компиляции php5 5.3.3_2 или php52 5.2.14_1 опцию «[X] FPM» — это, входящий непосредственно, патч для PHP, то есть нет теперь необходимости скачивать из исходников или из портов и патчить или использовать spawn-fcgi.
PHP FastCGI Process Manager(php-fpm) разработан для обеспечения высокой стабильности работы. Обычно используется с nginx в проектах с высокими нагрузками или дефицитом ресурсов. Используя nginx и php-fpm можно получить большую экономию памяти сервера и высокую производительность.
Php-fpm — это высокопроизводительный и масштабируемый интерфейс, устраняющий ряд проблем, мешающих использовать PHP в режиме FastCGI.

Достоинства php-fpm:

— запуск FastCGI процесса под пользователем, отличным от пользователя web-сервера, а также может находиться в chroot’е, отличном от chroot’а веб-сервер;
— рабочие процессы с разными uid/gid/chroot/environment и разные опции php.ini;
— логирование stdout & stderr;
— поддержка «slowlog»;
— «плавная» остановка и перезапуск php-воркеров без потери запросов;
— контроль ip-адресов, с которых могут приходить запросы от web сервера;

Для добавления в автозагрузку на FreeBSD:

echo 'php_fpm_enable="YES"' >> /etc/rc.conf

Конфигурационный файл — /usr/local/etc/php-fpm.conf. Начиная с версии 5.3.3 конфиг php-fpm имеет формат более близкий к формату php.ini. В версиях ниже — в xml-формате.
Настройки в конфигурации делятся на глобальные и настройки пулов. Сколько пользователей столько пулов. Общая структура:

<?xml version="1.0" ?>
<configuration>
<section name="global options">
#"Глобальные опции"
</section>
<workers>
<section name="pool"> #(одна секция на пул)
#"Опции секции"
</section>
</workers>
#Глобальные опции:
#pid-файл
<value name="pid_file">/var/run/php-fpm/php-fpm.pid</value>
#файл журнала ошибок
<value name="error_log">/var/log/php-fpm/php-fpm.log</value>
#уровень записываемых в журнал ошибок
<value name="log_level">>notice</value>
<value name="emergency_restart_threshold">10</value>
<value name="emergency_restart_interval">1m</value>
<value name="process_control_timeout">5s</value>
<value name="daemonize">yes</value>
#Опции секции:
<section name="pool">
#уникальное имя пула, которое используется для журналов и статистики
<value name="name">user1</value>
#cокет, где слушает FastCGI-сервер (или tcp, к примеру, 127.0.0.1:1900)
<value name="listen_address">/home/user1/data/sockets/php.sock</value>
<value name="listen_options">
<value name="backlog">-1</value>
#владелец и группа от которых создается сокет
<value name="owner">user1</value>
<value name="group">www</value> 

права для unix socket, если он используется. В Linux права на чтение/запись должны быть настроены таким образом, чтобы веб-север мог подключиться. Многие BSD-системы разрешают подключение независимо от прав. По умолчанию: 0666

<value name="mode">0660</value>
</value>
#задать специфичные для пула опции php.ini, для подгрузки расширений php
<value name="php_defines">
<value name="open_basedir">/home/user1/data:.</value>
<value name="upload_tmp_dir">/home/user1/data/tmp</value>
<value name="session.save_path">/home/user1/data/tmp</value>
<value name="error_log">/home/user1/data/logs/domain.ua.error.log</value>
</value>
#oт какого пользователя и группы будет работать php-cgi
<value name="user">user1</value>
<value name="group">user1</value>
#настройка менеджера процессов
<value name="pm">

установка стиля контролирования числа рабочий процессов. Допустимые значения ‘static’ и ‘apache-like’. По умолчанию «static». Замечание: только ‘static’ работает в настоящее время.

<value name="style">static</value>

устанавливает лимит на количество одновременных запросов, которые будут обслуживаться. Используется с любым стилем контролирования числа рабочих процессов.

<value name="max_children">1</value>
#настойки для стиля контролирования процессов 'apache-like'
<value name="apache_like">
#устанавливает количество рабочих процессов, созданныx при запуске. 
#Используйте только при стиле контролирования числа рабочих 
#процессов 'apache-like'
<value name="StartServers">20</value>
#устанавливает желаемое минимальное количество рабочих процессов 
#при простое сервера.
<value name="MinSpareServers">5</value>
#устанавливает желаемое максимальное количество рабочих процессов 
#при простое сервера.
<value name="MaxSpareServers">35</value>
</value>
</value>

время (в секундах) для обслуживания одного запроса, после чего рабочий процесс будет остановлен. Используется, когда ‘max_execution_time’ не останавливает выполнение скрипта на какой-то причине. По умолчанию: «5s». Замечание: ‘0s’ равноценно ‘off’

<value name="request_terminate_timeout">0s</value>

время (в секундах) для обслуживания одного запроса после которого php backtrace сбрасывается в журнал медленных запросов. По умолчанию: «5s». Замечание: ‘0s’ равноценно ‘off’

<value name="request_slowlog_timeout">0s</value>
#slowlog - файл журнала для медленных запросов
<value name="slowlog">/var/log/php-fpm.log.slow</value>
<value name="request_execution_timeout">31s</value>
<value name="rlimit_files">1024</value>
<value name="rlimit_core">unlimited</value>
#изолировать запуск скриптов в этой директории, абсолютный путь
<value name="chroot"></value>
#изменить директорию на указанную, при запуске скриптов, абсолютный путь
<value name="chdir"></value>
#перенаправить STDOUT и STDERR рабочих процессов в основной журнал ошибок. 
#Если не задано, то они будут перенаправлены в /dev/null, согласно 
#спецификации FastCGI
<value name="catch_workers_output">yes</value>

сколько запросов каждый процесс должен обработать до перезапуска. Позволяет обойти учетчики памяти в сторонних библиотеках. Для бесконечной обработки запросов, укажите 0. Эквивалент переменной окружения PHP_FCGI_MAX_REQUESTS.

<value name="max_requests">500</value>
<value name="allowed_clients">localhost</value>
<value name="environment">
<value name="HOSTNAME">$HOSTNAME</value>
<value name="PATH">/usr/local/bin:/usr/bin:/bin</value>
<value name="TMP">/tmp</value>
<value name="TMPDIR">/tmp</value>
<value name="TEMP">/tmp</value>
<value name="OSTYPE">$OSTYPE</value>
<value name="MACHTYPE">$MACHTYPE</value>
<value name="MALLOC_CHECK_">2</value>
</value>
</section>
Понравилась статья?
Подписаться на RSS feed
Оставить комментарий