Рекомендации по настройке 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