Как наблюдать за состоянием Apache и автоматически перезапускать его в случае сбоя?

Как можно обнаружить и устранить проблему зависания мастер-процесса Апача, который иногда возникает после перезагрузки с помощью "systemctl reload"? Можно ли внести изменения в текущий механизм обслуживания, добавив задачу в крон, заменив скрипт на таймер systemd или добавив другое ПО или юниты systemd, но без возможности заменить связку "Апач и PHP как модуль" на что-то иное, например, PHP-FPM?
  • 16 января 2024 г. 5:09
Ответы на вопрос 3
Для наблюдения за состоянием Apache и автоматического перезапуска в случае сбоя существует несколько подходов:

1. Использование мониторинга состояния systemd
Systemd, который используется в большинстве современных дистрибутивов Linux для управления службами, может следить за состоянием процессов и перезапускать их при сбое. Для настройки этого механизма проверьте конфигурационный файл Apache (например, `/etc/systemd/system/apache2.service` или аналогичный, в зависимости от вашего дистрибутива), чтобы он содержал следующие директивы:

```ini
[Service]
Restart=always
RestartSec=5s
```

`Restart=always` будет пытаться перезапустить сервис после сбоя, а `RestartSec=5s` устанавливает интервал ожидания 5 секунд перед перезапуском.

2. Создание кастомного таймера systemd с утилитой проверки
Вы можете создать свой собственный таймер systemd, который будет регулярно запускать скрипт для проверки состояния Apache. Если скрипт обнаруживает, что Apache не работает корректно, он может выполнять перезапуск сервиса.

Вот пример такого скрипта (назовем его `check_apache.sh`):

```bash
#!/bin/bash
if ! pidof apache2 > /dev/null; then
    systemctl restart apache2
fi
```
Сделайте его исполняемым командой `chmod +x check_apache.sh`, и поместите в `/usr/local/bin/`.

Создайте юнит сервиса для systemd (`/etc/systemd/system/check-apache.service`):

```ini
[Unit]
Description=Check Apache Service

[Service]
Type=oneshot
ExecStart=/usr/local/bin/check_apache.sh
```

И соответствующий таймер (`/etc/systemd/system/check-apache.timer`):

```ini
[Unit]
Description=Runs check-apache every minute

[Timer]
OnBootSec=5min
OnUnitActiveSec=1min
Unit=check-apache.service

[Install]
WantedBy=timers.target
```

Активируйте и запустите таймер:

```bash
systemctl daemon-reload
systemctl start check-apache.timer
systemctl enable check-apache.timer
```

3. Использование внешних систем мониторинга, таких как Nagios, Zabbix, или Prometheus с Alertmanager, которые могут следить за работоспособностью веб-сервера и отправлять оповещения или инициировать действия по восстановлению.

4. Включение модуля `mod_status` в Apache для отслеживания его состояния через HTTP. Вы можете настроить скрипт, который будет регулярно обращаться к странице статуса Apache и проверять его работоспособность:

```apache
<Location "/server-status">
    SetHandler server-status
    Require local
    # Или укажите список IP-адресов, которым разрешен доступ
</Location>
```

Чтобы решить проблему зависания мастер-процесса Apache после выполнения `systemctl reload`, вам нужно будет более тщательно исследовать причину зависаний. Это может включать в себя:

- Проверку логов Apache на предмет ошибок.
- Анализ конфигурационных файлов на предмет несоответствий или неверных параметров.
- Использование инструментов профилирования производительности, таких как `strace`, `perf` или отладка с помощью
monit
В настройках Apache можно выставить ограничение на память и время выполнения - https://stackoverflow.com/a/24933004
Похожие вопросы