Apache «зависает» несколько раз в день

Я пишу здесь после нескольких недель борьбы с проблемой, из-за которой Apache перестает отвечать на запросы до тех пор, пока он не будет перезапущен. Это происходит 3/4 раза в день, иногда через несколько часов, иногда через несколько минут, иногда через день. Никакой связи (по крайней мере, нет доказательств) с количеством одновременных подключений к серверу: это происходит как в период большого трафика (с 8.00 до 18.00), так и в ночное время, когда доступы очень низкие.

Конфигурация: виртуальная машина на Vmware ESXi Rel. 7 – ОС: Ubuntu 20.04, Apache 2.4.41, PHP 8.0.15, драйверы MSSQL 17.8.1.1-1.6 процессоров «Xeon(R) Gold 5218», 12 ГБ оперативной памяти. 3 веб-сайт, работающий на «чистом» PHP (без CMS, таких как Wordpress, Drupal, Ruby On Rails и т. д.).Awstats показывает, что один из интранетов без внешнего доступа обслуживает <10 тысяч страниц в день, остальные — около 200 тысяч страниц в день. Большую часть времени загрузка ЦП составляет около 1%, а используемая память - около 2 ГБ. Когда проблема возникает, «пики» ЦП/памяти/сети не обнаруживаются.

В этот момент я установил и настроил Monit , который каждые 20 секунд проверял с помощью Curl эту минимальную веб-страницу PHP:

      <?php
echo "ok";
?>

Обычно пишет «ОК». Во время «заморозки» даже эта простая страница не обслуживается; Curl заканчивается с ошибкой тайм-аута и запускает monit для «перезапуска службы apache2». Через 2/3 секунды сайт возвращается к нормальной работе (до следующего зависания).

Далее следует список неудачных исправлений (не в хронологическом порядке):

  • Удален certbot-Letsencrypt и использован SSL-сертификат, приобретенный Sectigo.
  • Apache переключен с mpm_worker на mpm_event.
  • Отключено множество неиспользуемых модулей Apache.
  • Отключено множество неиспользуемых модулей PHP.
  • Отключено большинство некритических заданий cron (даже нет никаких свидетельств того, что зависание происходит во время выполнения заданий cron).
  • Изменен виртуальный сетевой адаптер с VMXNET3 на E1000.
  • Включено подробное ведение журнала: никакая полезная информация/ошибки не записываются, просто существует временной интервал в 25–30 секунд от последней страницы, которая была отправлена ​​непосредственно перед зависанием, и первая страница, когда завершился перезапуск.
  • Включено на несколько дней mod_log_forensic: с помощью утилиты check_forensic не сообщается об ошибках (!)
  • Дважды проверил несколько правил перезаписи в .conf и .htaccess.
  • Изменена конфигурация Apache; соответствующие значения:
          StartServers 10
    MinSpareThreads 40
    MaxSpareThreads 120
    ThreadLimit 100
    ThreadsPerChild 75
    MaxRequestWorkers 450
    MaxConnectionsPerChild 1000

Нет очевидной корреляции между «последней» страницей/файлом, обслуживаемым перед проблемой: иногда это страница PHP (очевидно, не та же самая), иногда изображение PNG/JPEG. Читая журналы, я не могу найти аномальные/неверные/чрезмерные клиентские запросы.

Проблема на 99,99% связана с Apache, служба PHP-fpm работает отлично, и нет необходимости перезапускать ее после зависания. Все остальные работающие службы сервера не будут затронуты.

Прежде чем написать здесь, я прочитал массу веб-страниц, но не нашел никакой полезной (для меня) подсказки.

Спасибо в рекламе

Чао

JYD

0 ответов

Другие вопросы по тегам