На днях опять упал сайт, на этот раз из-за неправильной настройки php-fpm. Он съел всю память под нагрузкой. Я неправильно понимал значение одного из параметров, плюс мониторинга php-fpm не было. Сейчас уже нормально разобрался, настроил мониторинг. Решил сделать заметку по настройке php-fpm. Для себя и для вас.
Php-fpm может работать в трёх режимах:
▪ static - фиксированное количество процессов
▪ dynamic - динамическое управление процессами
▪ ondemand - создание процессов при получении запросов
Я чаще всего использую режим dynamic, так как он универсален. Всегда запущены сколько-то процессов (от 1 и более), а их количество поддерживается по заданным правилам.
Основные параметры, которые настраиваем для режима dynamic.
📌
📌
📌
📌
📌
Поясню, какой логики надо придерживаться при настройке php-fpm. Если у вас несколько сайтов, то для безопасности каждому сайту лучше создавать отдельного системного пользователя и от его имени запускать отдельный php-fpm пул. Именно в таких ситуациях имеет смысл использовать режим dynamic, так как это компромисс между максимально быстрым и затратным по памяти режимом static и более медленным, но экономным по памяти режимом ondemand.
Если у вас один сайт, один пул, то вы можете точно рассчитать максимально возможное количество памяти под php-fpm и сразу выставить максимальное число процессов. Это самый производительный вариант, так как время на создание новых процессов во время обработки запросов не тратится. У вас всё статично.
Если сайты не очень нагруженные, их много, и нет желания выжать максимальное быстродействие, то используйте режим ondemand. Процессы будут создаваться только под запросы, использование памяти минимальное, так как ничего не держится в запасе.
Режим dynamic позволяет сбалансировать работу нескольких пулов, так как не все сайты на веб сервере одновременно испытывают максимальную нагрузку. Параметрами этого режима можно сделать так, что в случае надобности каждый отдельный сайт сможет получить максимально возможное количество ресурсов под процессы php-fpm, но при этом остальные сайты останутся со своими минимально допустимыми ресурсами. При неудачном раскладе и повышенной нагрузке на несколько сайтов всем памяти может не хватить.
Ещё несколько параметров, про которые тоже надо не забыть.
#webserver #phpfpm
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_usergroup = site01_userlisten = /run/php/site01.ru.sockslowlog = /var/log/php-fpm/site01.ru.logphp_value[session.save_path] = /sites/site01.ru/php_session#webserver #phpfpm
👍70👎2