Назад | Перейти на главную страницу

apache с php fastcgi продолжает падать

У меня есть сервер apache2, настроенный с помощью MPM worker и php fast cgi. В последнее время журналы apache сообщают мне, что MaxClients достигаются часто, хотя это уже довольно много.

Мой сервер теперь постоянно отключается, и я вижу в журнале кучу таких строк:

[Sun Mar 06 04:25:40 2011] [error] [client 50.16.83.115] FastCGI: comm with (dynamic) server "/var/local/fcgi/php-cgi-wrapper.fcgi" aborted: (first read) idle timeout (20 sec)
[Sun Mar 06 04:25:40 2011] [error] [client 50.16.83.115] FastCGI: incomplete headers (0 bytes) received from server "/var/local/fcgi/php-cgi-wrapper.fcgi"

Я вижу, что мои процессы php-cgi довольно большие (в среднем около 70 МБ).

Вот моя конфигурация apache для MPM worker: KeepAlive ON KeepAliveTimeout 2

<IfModule mpm_worker_module>
    StartServers         5
    MinSpareThreads      10
    MaxSpareThreads      10
    ThreadLimit          64
    ThreadsPerChild      10
    MaxClients           20
    MaxRequestsPerChild  2000
</IfModule>

Вот моя конфигурация fastcgi apache:

<IfModule mod_fastcgi.c>
  # One shared PHP-managed fastcgi for all sites
  Alias /fcgi /var/local/fcgi
  # IMPORTANT: without this we get more than one instance
  # of our wrapper, which itself spawns 20 PHP processes, so
  # that would be Bad (tm)
  FastCgiConfig -idle-timeout 20 -maxClassProcesses 1
  <Directory /var/local/fcgi>
    # Use the + so we don't clobber other options that
    # may be needed. You might want FollowSymLinks here
    Options +ExecCGI
  </Directory>
  AddType application/x-httpd-php5 .php
  AddHandler fastcgi-script .fcgi
  Action application/x-httpd-php5 /fcgi/php-cgi-wrapper.fcgi
</IfModule>

Вот моя обертка fastcgi:

#!/bin/sh
PHPRC="/etc/php5/apache2"
export PHPRC
PHP_FCGI_CHILDREN=8
export PHP_FCGI_CHILDREN

exec /usr/bin/php-cgi

Любая помощь будет очень признательна!

Я не думаю, что конфигурация вашего сервера связана с вашей проблемой, но давайте сначала займемся этим: mod_fastcgi позаботится о порождении процессов PHP и будет подавать только один запрос за раз для каждого процесса (AFAIK, я пользователь mod_fcgid). Таким образом, бесполезно просить PHP разветвлять другие процессы, вы бы предпочли PHP_FCGI_CHILDREN = 0, чтобы отключить эту функцию.

В последнее время журналы apache сообщают мне, что MaxClients достигаются часто, хотя это уже довольно много.

Вашему MaxClients 20, на моих сайтах MPM-worker он находится в районе 5000-10 000! Это очень мало.

Имейте в виду, что MaxClients регулирует только пул процессов Apache, а Apache очень хорошо масштабируется до обслуживания тысяч одновременных подключений.

Вы можете отдельно регулировать свой пул процессов FastCGI с помощью параметров mod_fastcgi. Я могу помочь только с большим опытом работы с mod_fcgid, извините. Этот пул процессов в большинстве случаев имеет размер от 1х до 4х ядер ЦП.

[Вс, 06 марта, 04:25:40 2011] [ошибка] [клиент 50.16.83.115] FastCGI: связь с (динамическим) сервером "/var/local/fcgi/php-cgi-wrapper.fcgi" прервана: (первое чтение) тайм-аут простоя (20 сек)

Ваше приложение не могло отправить ни одного байта за 20 секунд, это довольно медленно. Вам нужно будет найти узкое место. Как показывает практика, если средняя загрузка высока, есть хорошее изменение, связанное с ограничением ЦП или ввода-вывода (затем переходите к проверке использования ЦП); в противном случае, если нагрузка низкая, проверьте ожидания на удаленных ресурсах (сервер базы данных, API третьих сторон и т. д.).

Насколько я могу судить, возникла проблема с одним из установленных мной расширений.

https://github.com/mreiferson/php-wkhtmltox/issues/11

Ваши скрипты занимают больше 20 секунд. Либо увеличьте значение тайм-аута простоя, либо выясните, почему они занимают все это время (например, ожидание соединений с БД).

Вы можете решить эту проблему, увеличив количество PHP_FCGI_CHILDREN до тех пор, пока он не съест всю вашу память, или устраните проблему, почему скрипты выполняются слишком долго. Общие проблемы: медленная БД, медленный внешний запрос (с помощью curl или fopen).