Рекомендации по настройке mod_fcgid для ispmanager
Данное руководство носит рекомендательный характер.
Общая информация
Данная инструкция не является обязательной при настройке модуля, но при проектировании сервера, она может помочь в выявлении параметров, влияющих на поведение модуля.
Каждый виртуальный хост (virtualhost) является классом, поэтому параметры FcgidMaxProcessesPerClass и FcgidMinProcessesPerClass
применяются к каждому хосту.
Если у пользователя N сайтов, то максимальное число обработчиков php-cgi, которое он сможет запустить, рассчитывается как:
N-сайтов*FcgidMaxProcessesPerClass
Например, если параметр задан как FcgidMaxProcessesPerClass=5, а сайтов 10, то максимум запустится 50 процессов php-cgi.
Нужно учитывать, что длительность жизни процессов php-cgi определяется как самим mod_fcgid, так и переменной
окружения PHP_FCGI_MAX_REQUESTS, которая по умолчанию равна 500.
Параметры mod_fcgid, которые управляют длительностью жизни процесса php-cgi:
FcgidMaxRequestsPerProcess— число запросов к php-cgi (по умолчанию 0, т.е. проверка отключена), желательно задать значение меньше, чемPHP_FCGI_MAX_REQUESTS, чтобы как можно скорее выявлять ноды, завершающие свой жизненный цикл и освобождать их. ЕслиPHP_FCGI_MAX_REQUESTS=500, тоFcgidMaxRequestsPerProcessжелательно задавать, например, 499 или 400. Не рекомендуется задавать слишком малое значение, т.к. пропадает эффект накопления операционных кодов (опкодов) или добавляются лишние fork-exec (когда выполняющийся процесс порождает новую программу).FcgidProcessLifeTime— длительность жизни процесса в секундах, по умолчанию 3600. Этот параметр удобно применять в совокупности с параметрамиFcgidIdleTimeoutиFcgidBusyTimeout. Оба параметра по умолчанию равны 300 секунд. ПараметрFcgidIdleTimeoutпринудительно завершает («убивает») процессphp-cgi, если он неактивен более 300 секунд. ПараметрFcgidBusyTimeoutпринудительно завершает («убивает») процессphp-cgi, если он обрабатывает запрос более 300 секунд. Эти параметры зависят отFcgidBusyScanIntervalиFcgidIdleScanInterval, один раз в этот интервал запускается процесс, который сканирует списокphp-cgi, и если превышен лимит неактивности или занятости, то такиеphp-cgiпринудительно завершаются («убиваются»).
Таким образом можно настроить баланс между скоростью обработки и потреблением памяти, а FcgidBusyTimeout не даст процессу зависнуть.
Не рекомендуется задавать слишком маленькое значение параметров FcgidBusyScanInterval, FcgidIdleScanInterval,
FcgidZombieScanInterval и FcgidErrorScanInterval во избежание частых повторных сканирований списка контролируемых процессов.
Еще один параметр FcgidMinProcessesPerClass — по умолчанию равен 3.
Этот параметр устанавливает минимальное число процессов php-cgi, которые будут обрабатывать запросы к виртуальному хосту (virtualhost).
Он отменяет действие FcgidIdleTimeout, FcgidMaxRequestsPerProcess и FcgidProcessLifeTime в случае,
если число обработчиков для сайта меньше FcgidMinProcessesPerClass.
Например, если FcgidMinProcessesPerClass=3 и для сайта запущено 2 обработчика, то даже при достижении
таймаута неактивности, процесс все равно не будет принудительно завершён («убит»).
Процесс php-cgi в этом случае завершится при достижении PHP_FCGI_MAX_REQUESTS запросов, т.к. это не контролируется mod_fcgid,
а контролируется внутренними механизмами самого php-cgi.
Рекомендуется задать FcgidMinProcessesPerClass=0, чтоб неактивные сайты не занимали
слоты контролируемых mod_fcgid, т.к. это число ограничено значением FcgidMaxProcesses.
И неактивные php-cgi, которые не угасают из-за FcgidMinProcessesPerClass, кроме слотов занимают еще и память.
Поэтому значение 0 заставит php-cgi освободить слот и память для тех процессов, которые превысили лимиты неактивности или время жизни.
FcgidMaxProcesses— устанавливает предельный размер таблицы контролируемыхphp-cgi. При достижении этого лимита новые обработчикиphp-cgiне будут запускаться и после достиженияFcgidConnectTimeoutпри запросе к сайту будет возвращаться ошибка 504.По умолчанию этот параметр равен 1000. Но рекомендуется настраивать его из расчёта:
N-сайтов*FcgidMinProcessesPerClassТ.е. если на сервере 1000 сайтов (не пользователей, а именно сайтов) и
FcgidMinProcessesPerClass=3, тоFcgidMaxProcesses=1000*3=3000.Если же
FcgidMinProcessesPerClass=0, то здесь нужно исходить из активности сайтов, и для базыFcgidMaxProcessesзадать равным как минимум количеству сайтов. Т.е. если сайтов 1000, тоFcgidMaxProcesses=1000— это минимум (т.к. максимальное число обработчиков, которые в идеале могут быть запущены —N-сайтов*FcgidMaxProcessesPerClass).FcgidMaxProcessesPerClass— максимальное число обработчиковphp-cgi, которые могут быть запущены для каждого виртуального хоста (virtualhost).FcgidErrorScanInterval— интервал, через который всем процессам, которые не завершились принудительно сигналом SIGTERM, будет отправлен сигнал SIGKILL, который окончательно их завершит («убьёт»).FcgidZombieScanInterval— интервал по сканированию «зомби»-процессов.
Рекомендованные настройки
Пример рекомендуемой конфигурации:
# cat /etc/httpd/conf.d/fcgid.conf
AddHandler fcgid-script fcg fcgi fpl
FcgidIPCDir /run/mod_fcgid
FcgidProcessTableFile /run/mod_fcgid/fcgid_shm
IPCCommTimeout 300
FcgidIOTimeout 300
FcgidConnectTimeout 300
FcgidMaxRequestLen 1048576000
MaxRequestLen 1048576000
FcgidBusyTimeout 300
FcgidBusyScanInterval 30
FcgidIdleScanInterval 30
FcgidIdleTimeout 20
FcgidErrorScanInterval 10
FcgidMaxRequestsPerProcess 400
FcgidMaxProcessesPerClass 30
FcgidMinProcessesPerClass 0
FcgidOutputBufferSize 0
FcgidProcessLifeTime 3600
FcgidZombieScanInterval 20
FcgidMaxProcesses N-сайтов*2