Конфигурация PHP-FPM

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

Очень важно понимать те настройки, которые вы делаете, иначе будут сложности. Первая настройка, на которой я хотел бы остановиться — это выбор правильного режима работы PHP-FPM для вашего приложения либо сайта.

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

Для настройки PM существуют три основных значения:

  • dynamic
  • static
  • ondemand

Режим dynamic

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

Возросла нагрузка — он добавил процессы. Нагрузка ушла — он эти процессы удалил. Это наиболее универсальный режим, идеален для систем с переменной непредсказуемой нагрузкой.

Например, у вас есть сайт: сегодня пришло 100 посетителей, завтра 200, потом 30. Если нагрузка плавает, то режим dynamic более подходит. При старте он создаёт определённое количество процессов, которое задаётся в настройке pm.start_servers. При росте нагрузки увеличивает количество процессов до установленного лимита. При простое уменьшает количество активных процессов, освобождая ресурсы системы.

Режим static

Это режим максимальной производительности, который содержит фиксированное число процессов. Вы указываете, например, пять воркеров, и эти пять служб постоянно будут висеть в памяти.

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

Если запускать отдельный воркер при поступлении запроса, требуется время на его запуск. Это может быть несколько секунд, что для веба критично. Режим static подходит, когда важна предсказуемая скорость ответа: системы управления ставками, обслуживание приборов и подобные задачи.

Из минусов — легко приводит к перерасходу памяти, если число процессов завышено. Определённое количество памяти будет постоянно выделено под эти процессы. Зато мы получаем стабильность и предсказуемую нагрузку.

Режим ondemand

Это самый экономный режим. Если у вас слабый сервер, он, скорее всего, вам подойдёт. Здесь мы получаем максимальную экономию ресурсов. Процессов нет, и они появляются только когда пришёл запрос на обработку данных.

Этот режим подходит, когда скорость ответа не так важна. Например, вы разрабатываете что-то в девелопмент-среде, где простой в 1-2 секунды не критичен. Вы получаете минимальное потребление оперативной памяти в состоянии простоя.

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

Итоги

В режиме dynamic при старте PHP-FPM создаётся количество процессов, указанное в pm.start_servers, и сервер сразу готов к работе. В режиме ondemand не создаётся ни одного процесса — первый процесс появляется только после первого запроса.

Как правило, можно особо не заморачиваться с выбором режима. Режим dynamic можно оставлять по умолчанию для большинства случаев.