Проблемы с apache mod_fcgid
У меня проблема на нескольких серверах, чем использование модуля Apache mod_fcgid для обслуживания сценария cgi, который обрабатывает запрос (проверка заявок и аналогичная обработка), а затем обслуживает файлы на сервере на основе результатов обработки.
Я постоянно получаю следующие ошибки в журналах:
[Mon Jan 30 23:11:41 2012] [warn] [client 95.35.160.193] mod_fcgid: error reading data, FastCGI server closed connection
[Mon Jan 30 23:11:41 2012] [warn] [client 95.35.160.193] (32)Broken pipe: mod_fcgid: ap_pass_brigade failed in handle_request_ipc function
[Mon Jan 30 23:13:34 2012] [warn] [client 37.8.52.128] mod_fcgid: can't apply process slot for /var/www/cgi-bin/assetx.fcgi
Эти проблемы приводят к медленной работе сервера, а иногда приводят к ошибке временно недоступной службы.
На серверах большой трафик, в настоящее время я настроил следующие директивы fcgi, как показано ниже:
FcgidMaxRequestsPerProcess 0
FcgidMaxProcesses 300
FcgidMinProcessesPerClass 0
FcgidIdleTimeout 240
FcgidIOTimeout 240
FcgidBusyTimeout 300
средняя нагрузка на серверы нормальная, количество процессов в среднем 250 процессов.
Я провел исследование этой проблемы в течение нескольких дней, некоторые говорят, что это проблема с разрешениями, я последовал их предложению, но не помог. Я попытался настроить параметры выше, это последние значения, которые я пробовал, но они не сработали. Я также пытаюсь использовать nginx вместо apache, но не могу найти подходящий способ запустить скрипт cgi с такой высокой нагрузкой на сервер, используя nginx.
Что я могу сделать, чтобы решить эту проблему?
1 ответ
Ваше приложение умирает, прежде чем Apache сможет успешно с ним связаться. Ответ состоит в том, чтобы узнать, почему приложение умирает.
Процесс FastCGI никогда не должен прекращаться или выходить даже из состояния ошибки. Apache ожидает, что скрипт FastCGI будет продолжать работать.
Вы упоминаете, что у вас есть скрипт CGI. Как вы изменили его для поддержки FastCGI?
Обычно вам нужно переключиться на что-то вроде CGI::Fast, удалить все вызовы, чтобы умереть и выйти, и реорганизовать ваш скрипт для запуска, используя цикл CGI::Fast while.