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