Я пишу сюда после нескольких недель, потраченных на борьбу с проблемой, из-за которой 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 ГБ. Когда возникает проблема, пики ЦП/памяти/сети не обнаруживаются.
В тот момент я установил и настроил Монит что каждые 20 секунд проверяйте с помощью curl эту минимальную веб-страницу PHP:
<?php
echo "ok";
?>
Обычно он печатает "ОК". Во время «заморозки» даже эта простая страница не обслуживается; curl завершается с ошибкой тайм-аута и запускает monit, чтобы выполнить «перезапуск службы apache2». Через 2/3 секунды сайт возвращается к нормальной работе (до следующего зависания).
Далее следует список неудачных исправлений (не в хронологическом порядке):
- Удален certbot-Letsencrypt и использован приобретенный Sectigo сертификат SSL.
- Переключил Apache с mpm_worker на mpm_event
- Отключил кучу неиспользуемых модулей Apache
- Отключена куча неиспользуемых модулей PHP.
- Отключено большинство некритичных заданий cron (даже нет никаких доказательств того, что зависание происходит во время выполнения заданий cron).
- Виртуальный сетевой адаптер изменен с VMXNET3 на E1000.
- Включено подробное ведение журнала: никакая полезная информация/ошибки не записываются, просто есть 25-30-секундный промежуток времени от последней обслуживаемой страницы непосредственно перед зависанием первой обслуживаемой страницы после завершения перезапуска.
- Включено на несколько дней mod_log_forensic: при использовании утилиты check_forensic не сообщается об (!) ошибках
- Дважды проверил несколько правил перезаписи в .conf и в .htaccess.
- Изменена конфигурация Apache; соответствующие значения:
Стартовые серверы 10
Минспаретредс 40
Максспаретредс 120
ThreadLimit 100
ThreadsPerChild 75
Максрекуестворкерс 450
МаксКоннектионсПерЧилд 1000
Нет очевидной корреляции между «последней» страницей/файлом, который был использован перед проблемой: иногда это страница PHP (очевидно, не та же самая), иногда изображение png/jpeg.
Читая журналы, я не могу найти ненормальные/неправильные/чрезмерные запросы клиента.
Проблема на 99,99% связана с Apache, служба PHP-fpm работает отлично и не требует перезапуска после зависания. Все другие запущенные службы сервера не затронуты.
Прежде чем написать сюда, я прочитал тонны веб-страниц, но не нашел ни одной полезной (для меня) подсказки.
Спасибо в рекламе
Чао
JYD