mod_fcgid + блокировка PHP + apache

Я запускаю довольно типичный стек LAMP с PHP, работающим через mod_fcgid. Я считаю, что сервер будет находиться под «высокой нагрузкой», учитывая объем трафика, который он получает.

Существует периодическая проблема, когда Apache сообщает, что все соединения находятся в состоянии «Отправляя контент» («W» на мониторе) при доступе к сайтам, которые полагаются на PHP.

Об ошибках PHP нет, как будто PHP на самом деле не вызван в эти периоды «блокировки». Однако в журналах сайта apache я вижу следующее:

(103)Software caused connection abort: mod_fcgid: ap_pass_brigade failed in handle_request function [warn] mod_fcgid: can't apply process slot for /var/www/cgi-bin/php.fcgi 

За это время я все еще могу получить доступ к сайтам, которые не зависят от PHP, например, к статусу apache и к виртуальным хостам только для HTML (к которым не относится обработчик PHP).

Сценарий php.fcgi имеет набор PHP_FCGI_MAX_REQUESTS = 500 , потому что я прочитал, что проблема с условиями гонки связана с PHP, работающим в режиме CGI. Fcgid.conf также имеет набор MaxProcessCount = 15 .

Кто-нибудь еще испытывает эту ошибку, и если да, то как ее можно решить?

Мне удалось исправить это сам.

Чтобы решить эту проблему, добавьте более строгие проверки в конфигурации FastCGI для зависания процессов и уменьшите время жизни ваших экземпляров PHP:

 IPCConnectTimeout 20 ProcessLifeTime 120 IdleTimeout 60 IdleScanInterval 30 MaxRequestsPerProcess 499 MaxProcessCount 100 

В зависимости от ваших требований, это может удовлетворить хорошо сконфигурированный сервер, который имеет более 50 тыс. Хитов в час.

Вы обнаружите, что число зарегистрированных несуществующих / «зомби» PHP-процессов значительно возрастает. Это хорошо, однако, как и ранее, процессы просто перестали бы отвечать на запросы, и менеджер FastCGI продолжал бы отправлять запросы на них!

Я также рекомендовал бы удалить все переопределенные директивы из вашего скрипта php.fcgi, так как это может вызвать проблемы с вашей системой. Постарайтесь как можно больше управлять основной конфигурацией FastCGI в Apache.

Мы пошли с Nginx + http://php-fpm.org/

Попробуйте «strace -p».

Я также видел, что блокировки происходят, когда некоторое программное обеспечение PHP пытается запросить файл с того же сервера, на котором он запущен (get_file_contents («http: // localhost …»))