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