PHP и mod_fcgid: ошибка ap_pass_brigade в функции handle_request_ipc

Это было задано и ответили до https://stackoverflow.com/a/12686252/219116, но решение для меня не работает.

Конфигурация mod_fcgid

<IfModule mod_fcgid.c> AddHandler fcgid-script .fcgi FcgidIPCDir /var/run/mod_fcgid/ FcgidProcessTableFile /var/run/mod_fcgid/fcgid_shm FcgidIdleTimeout 60 FcgidProcessLifeTime 120 FcgidMaxRequestsPerProcess 500 FcgidMaxProcesses 150 FcgidMaxProcessesPerClass 144 FcgidMinProcessesPerClass 0 FcgidConnectTimeout 30 FcgidIOTimeout 600 FcgidIdleScanInterval 10 FcgidMaxRequestLen 269484032 </IfModule> 

скрипт php-cgi

 #!/bin/bassh export PHPRC=/var/www/vhosts/example.com/etc/ export PHP_FCGI_MAX_REQUESTS=5000 exec /usr/bin/php-cgi 

Сведения о системе

  • Версия CentOS Linux 7.1.1503 (Core)
  • HTTPD-2.4.6-31.el7.centos.x86_64
  • mod_fcgid-2.3.9-4.el7.x86_64
  • php56u-кли-5.6.12-1.ius.centos7.x86_64

Таким образом, для моего FcgidMaxRequestsPerProcess установлено значение 500, а для моего PHP_FCGI_MAX_REQUESTS установлено значение 10x, как указано в предыдущих ответах и ​​документации Apache. И все же я все еще получаю эти ошибки

 [Thu Nov 19 18:16:48.197238 2015] [fcgid:warn] [pid 6468:tid 139726677858048] (32)Broken pipe: [client XXXX:41098] mod_fcgid: ap_pass_brigade failed in handle_request_ipc function 

Я также получаю такую ​​же проблему примерно год назад, я пробовал много вещей, и, наконец, я сделал некоторые из хитов и запускал после чтения документации, и моя проблема исчезла. Сначала необходимо было установить важные вещи:

 FcgidBusyTimeout 300 [default] FcgidBusyScanInterval 120 [default] 

Цель этой директивы – прекратить работу приложений . Может потребоваться увеличение тайм-аута по умолчанию для приложений, которые могут потребовать больше времени для обработки запроса. Поскольку проверка выполняется в интервале, определяемом FcgidBusyScanInterval , обработка запроса может быть продолжена в течение более длительного периода времени

 FcgidProcessLifeTime 3600 [default] 

Простаивающие процессы приложений, которые существовали больше, чем это время, будут прекращены, если число процессов для класса превышает FcgidMinProcessesPerClass .

Эта проверка жизненного цикла процесса выполняется на частоте сконфигурированного FcgidIdleScanInterval .

 FcgidZombieScanInterval 3 [seconds default] 

Модуль проверяет завершенные приложения FastCGI на этом интервале. В течение этого периода времени приложение может существовать в таблице процессов как зомби (в Unix).

Примечание. Все приведенные выше варианты уменьшают или увеличивают в зависимости от времени вашего приложения или его потребностей или применяются к конкретному vhost.

Но моя проблема решена с помощью этой опции:

Вышеуказанные параметры изменили мой сервер, но через некоторое время ошибки появляются снова, но ошибка действительно устраняется этим:

  FcgidOutputBufferSize 65536 [default] 

Я изменил его на

  FcgidOutputBufferSize 0 

Это максимальный объем данных ответа, который модуль будет читать из приложения FastCGI, прежде чем очищать данные до клиента. Это мгновенно очистит данные, не дожидаясь 64 Кбайт байт, что действительно помогает мне быстрее очистить процесс.

Другие вопросы, которые я получил

если 500 ошибок исходит из времени Nginx. Исправление:

/etc/nginx/nginx.conf

 keepalive_timeout 125; proxy_read_timeout 125; proxy_connect_timeout 125; fastcgi_read_timeout 125; 

С перерывами я получал ошибку MySQL «MySQL server has away away», которая требовала еще одной настройки: /etc/my.conf

 wait_timeout = 120 

Тогда, только для funsies, я пошел вперед и увеличил свой предел памяти PHP, на всякий случай: /etc/php.ini

 memory_limit = 256M 

Использование SuExec

mod_fastcgi вообще не работает под SuExec на Apache 2.x У меня не было ничего, кроме неприятностей (у него также было много других проблем в нашем тестировании). Реальная причина вашей проблемы – SuExec

В моем случае это был запуск для меня, я начинаю Apache, mod_fcgid порождает ровно 5 процессов для каждого vhost. Теперь, при использовании простого сценария загрузки и отправки файла размером более 4-8 КБ, все эти дочерние процессы сразу уничтожаются для конкретного vhost, на котором был выполнен сценарий.

Возможно, можно сделать отладочную сборку или запустить ведение журнала в mod_fcgid, что может дать ключ.

Я пробовал mod_fastcgi тем временем в течение 1 года, и я тоже могу сказать со многими другими, что SuExec – не что иное, как хлопотное, и работает не гладко вообще, в каждом случае.