воскресенье, 8 января 2012 г.

Настройки PHP-FPM

(PHP 5.2.17, PHP-FPM 0.5.14)


Глобальные параметры


pid_file - pid файл. По умолчанию: то, что было указано при maleextra компилировании опцией --with-fpm-pid

error_log - файл журнала ошибок. По умолчанию: то, что было указано при компилировании опцией --with-fpm-log

log_level - уровень записываемых в журнал ошибок. По seo India умолчанию: "notice" (TODO: get list)

emergency_restart_threshold - при это числе рабочий процессов завершенных с SIGSEGV или SIGBUS... По умолчанию: 10

emergency_restart_interval - ...менее чем за этот промежуток instant performer времени, php-fpm будет мягко перезапущен. Это необходимо, чтобы исключить случайные повреждения памяти. По умолчанию: "1 минута"

process_control_timeout - время ожидания ответа от рабочий процессов. По умолчанию: "5 секунд"

daemonize - укажите "no" для отладки php-fpm или для его performer5 запуска в диспетчере (runit/sv, daemontools, upstart, etc.) По умолчанию: "yes"

Настройки пулов

Пул естественно может быть не один, а сколько вам потребуется. Это позволяет запускать их под разными системными пользователями, разными chroot'ами и т.д. Вообщем это дает определенною гибкость, так как позволяет в каждом пуле использовать свои собственные настройки под веб-приложение, которое будет его использовать. Улучшает безопасность, так как веб-приложения изолированы друг от друга и при компрометации одного приложения, остальные останутся в относительной безопасности. Кроме того это же и облегчает процесс обнаружения скомпрометированных веб-приложений.

В конфигурационном файле php-fpm.conf объявление 2-3 пулов будет выглядеть примерно так

<?xml version="1.0" ?>
<configuration>
<workers>
<section name="pool">
<value name="name">pool-1</value>
...
...
</section>
<section name="pool">
<value name="name">pool-2</value>
...
...

</section>
<section name="pool">
<value name="name">pool-3</value>
...
...
</section>
</workers>
</configuration>


Но так как PHP-FPM с PHP версий ниже 5.3.3 не поддерживает динамическое число дочерних процессов, то путем разнесения веб-приложений по свои отдельным php-fpm пулам, мы теряем по ресурсам. Связано это с тем что при static style pm кол-во процессов всегда одинаковое и если все процессы в одном пуле и ими пользуются все веб-приложения, то единовременно каждому приложению доступно на порядок большее число php-fpm процессов для обработки запросов, чем если бы у каждого приложения было по собственному персональному пулу.


name - имя пула, используется php-fpm'ом при ведении логов

listen_address - прослушиваемый адрес, здесь можно указать как сетевой адрес и порт, так и файловый сокет, например 127.0.0.1:9000 или tmp/php-fpm.sock, соответственно

owner - владелец, который будет назначен файловому сокету

group - группа, которая будет назначена файловому сокету

mode - права, которые будут выставлены на созданный файловый сокет

php_defines - описание настроек php, которые будут применены к данному пулу, перекрыв настройки указанные в /etc/php.ini. Например задание параметров max_execution_time и upload_max_filesize будет выглядеть вот так


<value name="php_defines">
<value name="max_execution_time">120</value>
<value name="upload_max_filesize">30</value>
</value>


user - системный пользователь из под которого будет работать процесс текущего пула

group - системная группа из под которой будет работать процесс текущего пула

style - задает стиль управления кол-вом рабочих процессов php-fpm. Возможные значения это static и apache-like (для PHP версии 5.2.17 с патчем PHP-FPM 0.5.14 - apache-like скорее всего работать не будет, с PHP версии 5.3.3 значение apache-like переименовано в dynamic и работает)

max_children - максимальное кол-во одновременно обрабатываемых запросов, т.е. кол-во процессов php-fpm которое будет запущено

startservers - кол-во создаваемых рабочих процессов php-fpm при запуске (применяется только при использовании apache-like для style)

minspareservers - минимальное кол-во рабочих процессов php-fpm (применяется только при использовании apache-like для style)

maxspareservers - максимальное кол-во рабочих процессов php-fpm (применяется только при использовании apache-like для style)

request_terminate_timeout - время в секундах на обслуживание одного запроса, по истечение которого рабочий процесс будет остановлен. Используется в том случае когда php параметру max_execution_time по каким либо причинам не удается остановить выполнение скрипта. Значение "0s" отключает использование этой функции.

request_slowlog_timeout - время в секундах для обработки одного запроса и при превышении которого данные о выполненном php скрипте будут сброшены в slow.log файл (аналог логирования медленных sql запросов Mysql сервера). 
Значение "0s" отключает использование этой функции.

slowlog - лог файл для записи в него информации о медленных запросах

rlimit_files - устанавливает лимит дескрипторов открытых файлов rlimit

rlimit_core - устанавливает максимальное кол-во используемых ядер rlimit

chroot - директория chroot окружения при запуске. Путь должен быть абсолютным

chdir - изменяет текущую директория при запуске

catch_workers_output - перенаправление STDOUT и STDERR рабочего процесса в главный лог ошибок. Если не установлен, STDOUT и STDERR будут перенаправлены в /dev/null в соответствии со спецификацией FastCGI

max_requests - кол-во запросов которое может обработать процесс, по истечению лимита которого он будет перезапущен. Полезно для минимизации негативного эффекта от утечки памяти при использовании сторонних библиотек. Нулевое значение отключает перезапуск

allowed_clients - список IP адресов запросы с которых будут разрешены к обработке, IP адреса перечисляются через запятую. Нулевое значение снимает ограничение на доступ к php-fpm по IP адресу

Переменные окружения

Особо описывать нечего, ниже часть настроек по умолчанию из конфига php-fpm

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

3 комментария:

  1. А как определенный pool привязать к определенному сайту или группе сайтов

    ОтветитьУдалить
    Ответы
    1. Это можно сделать задав каждому пулу свой собственный прослушиваемый сетевой порт/файловый сокет с помощью опции listen address. После чего со стороны веб-сервера для каждого виртуального хоста настроить выполнение php кода в требуемом Вам пуле. Простой пример под Nginx:

      server
      {
      server_name site1.local.lan;
      listen 80;
      root /var/www/site1;
      index index.php;

      location ~ \.php$ {
      fastcgi_pass 127.0.0.1:9001;
      include fastcgi_params;
      }
      }

      server
      {
      server_name site2.local.lan;
      listen 80;
      root /var/www/site2;
      index index.php;

      location ~ \.php$ {
      fastcgi_pass 127.0.0.1:9002;
      include fastcgi_params;
      }
      }

      server
      {
      server_name site3.local.lan;
      listen 80;
      root /var/www/site3;
      index index.php;

      location ~ \.php$ {
      fastcgi_pass unix:/tmp/pool1.sock;
      include fastcgi_params;
      }
      }

      server
      {
      server_name site4.local.lan;
      listen 80;
      root /var/www/site4;
      index index.php;

      location ~ \.php$ {
      fastcgi_pass unix:/tmp/pool2.sock;
      include fastcgi_params;
      }
      }

      Удалить
  2. А как можно включить в php-fpm.conf дополнительно другие конфиги для каждого сайта? include= как для 5.3 не работает, же.

    ОтветитьУдалить