Настройка php5-fpm

php5-fpm расшифровывается как PHP 5 FastCGI Process Manager, то есть менеджер процессов FastCGI для языка PHP 5. Это сервер, работающий по протоколу FastCGI, который может выполнять CGI-сценарии, написанные на языке PHP 5.

В php5-fpm можно настроить несколько пулов процессов с собственными настройками. Для каждого из пулов создаётся один IP- или юникс-сокет, к которому может подключиться веб-сервер и запросить страницу по протоколу FastCGI. Количество процессов в каждом пуле может быть фиксированным или динамическим, все процессы в пуле работают от имени одного определённого пользователя, но разные пулы могут работать от имени разных пользователей.

Каждый процесс в пуле может одновременно обрабатывать только один запрос, но последовательно может обрабатывать неограниченное количество запросов, не перезапускаясь. Отсутствие перезапуска процессов приближает php5-fpm по производительности к модулю mod_php из веб-сервера Apache.

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

Установим php5-fpm:

# apt-get install php5-fpm

Его настройки располагаются в файле /etc/php5/fpm/php-fpm.conf, а настройки пулов в Debian располагаются в отдельных файлах в каталоге /etc/php5/fpm/pool.d/. Рассмотрим для начала глобальные настройки php5-fpm, которые можно задать в файле /etc/php5/fpm/php-fpm.conf

[global]
; Расположение PID-файла. Значение по умолчанию отсутствует
pid = /var/run/php5-fpm.pid

; Файл для журнала ошибок. Чтобы вести журнал ошибок в syslog, можно указать вместо имени файла значение syslog
error_log = /var/log/php5-fpm.log

; "Средство" syslog. По умолчанию - daemon
;syslog.facility = daemon

; Строка идентификации, добавляемая в начало каждого сообщения, отправляемого в syslog. По умолчанию - php-fpm
;syslog.ident = php-fpm

; Уровень важности сообщений, отправляемых в syslog. Возможные значения: alert, error, warning, notice, debug. По умолчанию - notice
;log_level = notice

; Максимальное количество ошибок SIGSEGV или SIGBUS в течение интервала времени emergency_restart_interval, по достижении которого php-fpm перезапустится. По умолчанию 0 - выключено
;emergency_restart_threshold = 0

; Интервал, в течение которого ведётся учёт ошибок SIGSEGV или SIGBUS (см. выше). Можно использовать единицы s - секунды, m - минуты, h - часы, d - дни. Единица по умолчанию - секунды, значение по умолчанию - 0
;emergency_restart_interval = 0

; Максимальное время ожидания реакции порождённого процесса на отправленный ему сигнал. Можно использовать единицы s - секунды, m - минуты, h - часы, d - дни. Единица по умолчанию - секунды, значение по умолчанию - 0
;process_control_timeout = 0

; Максимальное количество порождённых процессов. Значение по умолчанию 0 - без ограничений
; process.max = 128

; Приоритет управляющего процесса: -19 - максимальный приоритет, 20 - минимальный приоритет. Используется только если управляющий процесс запущен от имени пользователя root. По умолчанию приоритет не задан
; process.priority = -19

; Переходить ли в фоновый режим. По умолчанию yes - переходить. Задайте no для отладки
;daemonize = yes

; Максимальное количество открытых файловых дескрипторов для управляющего процесса. По умолчанию используется системное значение
;rlimit_files = 1024

; Задаёт максимальный размер core-файла для управляющего процесса. Можно указать любое значение от 0 включительно и выше, а также значение unlimited - без ограничений. По умолчанию используется системное значение
;rlimit_core = 0

; Используемый механизм обработки событий: select, poll, epoll, kqueue, /dev/poll, port. По умолчанию - не задано, используется автоопределение
; events.mechanism = epoll

Рассмотрим настройки пула, которые в Debian размещаются в отдельных файлах в каталоге пулов /etc/php5/fpm/pool.d/.

; Имя пула. В дальнейших настройках можно использовать макрос $pool, вместо которого будет автоматически подставляться имя пула
[www]

; Каталог-префикс пула. Используется только в следующих директивах: slowlog, listen (для юникс-сокетов), chroot, chdir, php_values, php_admin_values. По умолчанию - не задано, используется глобальный префикс или каталог /usr
;prefix = /path/to/pools/$pool

; Имя пользователя и группа, с правами которого будут работать процессы пула
user = www-data
group = www-data

; Адрес сокета, на котором будет ожидаться поступление запросов FastCGI. Возможные формы: a.b.c.d:port - IP-адрес и TCP-порт, port - ожидать подключений на всех локальных IP-адресах на указанном TCP-порту, socket - юникс-сокет. Значения по умолчанию нет, значение должно быть задано явно
listen = /var/run/php5-fpm.sock

; Максимальное количество подключений, ожидающих обработки в очереди операционной системы
;listen.backlog = 128

; Владелец, группа и права доступа к юникс-сокету, если используется юникс-сокет. По умолчанию используются пользователь и группа, с правами которых работают процессы пула. Права доступа по умолчанию - 0666, т.е. чтение и запись для всех
;listen.owner = www-data
;listen.group = www-data
;listen.mode = 0666

; Список IP-адресов, от которых разрешено принимать подключения, при использовании сокета TCP. Значения разделяются запятыми. По умолчанию разрешены подключения с любого IP-адреса
;listen.allowed_clients = 127.0.0.1

; Приоритет процессов в пуле: -19 - максимальный приоритет, 20 - минимальный приоритет. Используется только если управляющий процесс запущен от имени пользователя root. По умолчанию используется приоритет управляющего процесса
;priority = -19

; Способ управления процессами. Указывается явным образом. Возможны следующие варианты:
; static - постоянное количество процессов (используется значение, настроенное в параметре pm.max_children)
; dynamic - динамическое управление количеством процессов. Этот способ всегда держит запущенным хотя-бы один процесс
;           pm.start_servers - количество процессов, порождаемых при запуске
;           pm.max_children - максимальное количество одновременно существующих процессов
;           pm.min_spare_servers - минимальное количество запасных процессов, не занятых обработкой запросов
;           pm.max_spare_servers - максимальное количество запасных процессов, не занятых обработкой запросов
; Если поступает новый запрос, когда все работающие процессы заняты, для обслуживания запросов используется уже готовый запасной процесс,
; а запас пополняется новым процессом. Запасные процессы позволяют начать обслуживание клиента, не заставляя его ждать,
; когда будет порождён ещё один процесс-обработчик
; ondemand - порождение процессов "по требованию". По умолчанию процессы не создаются
;            pm.max_children - максимальное количество одновременно существующих процессов
;            pm.process_idle_timeout - максимальное время простоя процесса, по достижении которого процесс будет завершён
pm = dynamic

; Значение указывается явным образом
pm.max_children = 5

; Значение по умолчанию: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
pm.start_servers = 2

; Указывается явным образом при использовании способа dynamic
pm.min_spare_servers = 1

; Указывается явным образом при использовании способа dynamic
pm.max_spare_servers = 3

; Используется способом ondemand. Значение по умолчанию - 10 секунд
;pm.process_idle_timeout = 10s;

; Максимальное количество запросов, обслуживаемых одним процессом. По умолчанию 0 - не ограничено. Используется для защиты от утечек памяти
;pm.max_requests = 500

; URL страницы со статусом пула. По умолчанию страница отключена
;pm.status_path = /status

; Страница для мониторинга исправности пула. По умолчанию страница отключена
;ping.path = /ping

; Текст, выводимый на странице мониторинга исправности пула. Страница имеет тип text/plain и отдаёт код 200. Значение по умолчанию - pong
;ping.response = pong

; Журнал запросов, обслуженных пулом. По умолчанию журнал не ведётся
;access.log = log/$pool.access.log

; Формат записей в журнале. Формат по умолчанию - "%R - %u %t \"%m %r\" %s"
; Подробное описание шаблонов можно найти в файле /etc/php5/fpm/pool.d/www.conf
; Поддерживается множество шаблонов, полезных для отладки и профилирования скриптов
;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"

; Журнал медленных запросов. По умолчанию не используется. Если используется, необходимо указать значение request_slowlog_timeout
;slowlog = log/$pool.log.slow

; Предельное время выполнения запроса, после которого информация о запросе помещается в журнал медленных запросов. По умолчанию 0 - нет лимита
;request_slowlog_timeout = 0

; Максимальное количество открытых процессом файловых дескрипторов. По умолчанию используется системное значение
;rlimit_files = 1024

; Задаёт максимальный размер core-файла процесса. Можно указать любое значение от 0 включительно и выше, а также значение unlimited - без ограничений. По умолчанию используется системное значение
;rlimit_core = 0

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

; Каталог по умолчанию, в котором выполняется скрипт. По умолчанию - текущий каталог или корневой каталог chroot
chdir = /

; Перехватывать вывод скриптов на стандартный вывод и стандартный поток диагностики. По умолчанию no - не перехватывать, yes - перехватывать
;catch_workers_output = yes

; Выполнять только скрипты, имеющие указанное расширение. По умолчанию - .php. Для обработки всех файлов можно указать пустое значение. Но безопаснее не обрабатывать посторонние файлы, особенно если они были загружены пользователем
;security.limit_extensions = .php .php3 .php4 .php5

; Задать значения переменных окружения. По умолчанию - очистить окружение. Пример использования:
;env[HOSTNAME] = $HOSTNAME
;env[PATH] = /usr/local/bin:/usr/bin:/bin
;env[TMP] = /tmp
;env[TMPDIR] = /tmp
;env[TEMP] = /tmp

БезопасТность

Ограничение доступа только указанными каталогами:

php_admin_value[open_basedir] = /var/www/www.example.com:/usr/share/php5:/tmp:/usr/share/phpmyadmin:/etc/phpmyadmin:/var/lib/phpmyadmin

Отключение возможности вызывать указанные функции:

php_admin_value[disable_functions] = dl,exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source

Настройка в chroot