ServerAdmin.ru
31.6K subscribers
847 photos
57 videos
23 files
3K links
Авторская информация о системном администрировании.

Информация о рекламе: @srv_admin_reklama_bot
Автор: @zeroxzed

Второй канал: @srv_admin_live
Сайт: serveradmin.ru

Ресурс включён в перечень Роскомнадзора
Download Telegram
На днях опять упал сайт, на этот раз из-за неправильной настройки php-fpm. Он съел всю память под нагрузкой. Я неправильно понимал значение одного из параметров, плюс мониторинга php-fpm не было. Сейчас уже нормально разобрался, настроил мониторинг. Решил сделать заметку по настройке php-fpm. Для себя и для вас.

Php-fpm может работать в трёх режимах:
static - фиксированное количество процессов
dynamic - динамическое управление процессами
ondemand - создание процессов при получении запросов

Я чаще всего использую режим dynamic, так как он универсален. Всегда запущены сколько-то процессов (от 1 и более), а их количество поддерживается по заданным правилам.

Основные параметры, которые настраиваем для режима dynamic.

📌 pm.max_children - указывает на то, сколько всего процессов php-fpm могут быть созданы. Если ошибётесь и выставите слишком большое число, то вся память веб сервера будет занята и oom killer прибьёт какое-нибудь приложение. Опытным путём необходимо выяснить, сколько в среднем памяти занимает один рабочий процесс php-fpm для вашего сайта, потом прикинуть, сколько памяти можно отдать для всех процессов php-fpm. На основе этого задать параметр.

📌 pm.start_servers - количество процессов, запускаемых при старте php-fpm. Можно начинать с небольших значений в 5-10. Остальные процессы будут создаваться динамически.

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

📌 pm.max_spare_servers - максимальное количество бездействующих процессов. Если доступно больше свободных процессов, чем здесь задано, лишние будут завершены. То есть количество простаивающих процессов будет всегда в интервале описываемых spare параметров.

📌 pm.process_idle_timeout - время простоя, по истечении которого бездействующий процесс будет завершён.

Поясню, какой логики надо придерживаться при настройке php-fpm. Если у вас несколько сайтов, то для безопасности каждому сайту лучше создавать отдельного системного пользователя и от его имени запускать отдельный php-fpm пул. Именно в таких ситуациях имеет смысл использовать режим dynamic, так как это компромисс между максимально быстрым и затратным по памяти режимом static и более медленным, но экономным по памяти режимом ondemand.

Если у вас один сайт, один пул, то вы можете точно рассчитать максимально возможное количество памяти под php-fpm и сразу выставить максимальное число процессов. Это самый производительный вариант, так как время на создание новых процессов во время обработки запросов не тратится. У вас всё статично.

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

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

Ещё несколько параметров, про которые тоже надо не забыть.
user = site01_user
group = site01_user
listen = /run/php/site01.ru.sock
slowlog = /var/log/php-fpm/site01.ru.log
php_value[session.save_path]  = /sites/site01.ru/php_session

#webserver #phpfpm
👍70👎2