Как исправить нестабильность Apache? - PullRequest
0 голосов
/ 24 ноября 2008

Я настроил простой стек LAMP в Debian, и у меня возникают некоторые проблемы с веб-сервером Apache.

Каждые 3-4 часа веб-сервер входит в тупик и все запросы, попавшие в блок базы данных. Сервер создает новый дочерний элемент для каждого запроса. Количество процессов увеличивается очень быстро. Через несколько секунд Monit обнаруживает, что что-то не так, и перезапускает сервер Apache.

Я подозреваю, что эта проблема возникает из-за способа, которым PHP обрабатывает пул соединений с базой данных, потому что сервер все еще может отвечать на запросы статического содержимого. Вы испытывали такое поведение? Что я должен попытаться сделать?

Обновление: Проблема решена. Кажется, это плохая идея использовать APC для кэширования кода операции и пользовательских данных. Сейчас я использую Memcache для хранения пользовательских данных и APC только для кода. Время от времени я получаю некоторые ошибки сегментации, но сервер в большинстве случаев стабилен.

Ответы [ 4 ]

3 голосов
/ 24 ноября 2008

Я подозреваю, что проблемы:

  • Сложный длительный запрос к базе данных, который блокирует дальнейшие запросы. Это довольно легко, если вы используете движок MySQL MyISAM, который имеет только блокировку на уровне таблицы, и считыватели могут легко блокировать средства записи и наоборот, поэтому один сложный запрос, скажем, пользовательской таблицы, может в значительной степени блокировать весь сервер, в то время база данных ожидает ввода / вывода. Обычно вы можете диагностировать это, используя «SHOW PROCESSLIST» или инструмент, который делает это за вас.
  • Установив MaxClients слишком высоко для оперативной памяти, доступной на сервере prefork - это делают почти все. Если вы используете «толстый» prefork Apache (например, с внутрипроцессным PHP), не устанавливайте MaxClients выше, чем у вас достаточно памяти. Это, вероятно, намного меньше, чем типичные значения 100 или 150.

Эти две вещи способствуют возникновению проблемы, которую вы видите. Они оба должны быть исправлены, поскольку они могут вызвать проблемы в одиночку.

Это полностью основано на догадках и опыте.

1 голос
/ 24 ноября 2008

Проверьте настройки тайм-аута в /etc/apache2/apache2.conf. Подобные проблемы возникали, когда задан высокий тайм-аут и система получает сбой из-за сброшенных соединений.

1 голос
/ 24 ноября 2008

Почему бы вам не посмотреть журналы? /var/log/apache2/* хорошее место для начала. Что запрашивается перед тем, как сервер умирает? Оттуда вы, вероятно, можете сделать вывод, что происходит не так. Поскольку php-скрипты по умолчанию завершаются через 30 секунд, ошибка должна быть достаточно массовой, чтобы вызвать что-то подобное.

0 голосов
/ 08 января 2009

mysql-slow log также полезен для поиска медленных проблемных запросов.

...