Skip to content

Использование Monit

Monit — это мощная утилита для мониторинга и управления процессами, программами, файлами, директориями и файловыми системами в Unix-системах. Monit автоматически выполняет техническое обслуживание и восстановление, а также может выполнять осмысленные действия в случае ошибок.

Основные возможности

1. Мониторинг процессов

  • Автоматический запуск остановленных процессов
  • Перезапуск неотвечающих процессов
  • Остановка процессов, использующих слишком много ресурсов
  • Мониторинг характеристик процессов (память, CPU)

2. Мониторинг файлов и директорий

  • Отслеживание изменений файлов (время, контрольные суммы, размер)
  • Мониторинг файловых систем
  • Проверка прав доступа и владельцев файлов

3. Сетевой мониторинг

  • Проверка TCP, UDP и Unix Domain Socket соединений
  • Встроенные тесты для основных интернет-протоколов
  • SSL/TLS поддержка для безопасных соединений

4. Системный мониторинг

  • Общее использование CPU, памяти и загрузки системы
  • Мониторинг дискового пространства
  • Проверка сетевых интерфейсов

Установка Monit

Ubuntu/Debian

bash
# Установка из официального репозитория
sudo apt update
sudo apt install monit

# Проверка установки
monit -V

CentOS/RHEL/Fedora

bash
# Установка EPEL репозитория
sudo yum install epel-release

# Установка Monit
sudo yum install monit

# Или для Fedora
sudo dnf install monit

Компиляция из исходного кода

bash
# Установка зависимостей
sudo apt install build-essential libssl-dev libpam0g-dev

# Скачивание и компиляция
wget https://mmonit.com/monit/dist/monit-5.35.2.tar.gz
tar -xzf monit-5.35.2.tar.gz
cd monit-5.35.2

# Конфигурация и компиляция
./configure --prefix=/usr/local
make
sudo make install

Проверка установки

bash
# Проверка версии
monit -V

# Проверка синтаксиса конфигурации
monit -t

# Запуск в режиме отладки
monit -Iv

Базовая конфигурация

Создание основного файла конфигурации

bash
# Создание директории для конфигурации
sudo mkdir -p /etc/monit/conf.d

# Создание основного файла конфигурации
sudo nano /etc/monit/monitrc

Базовая структура конфигурации

bash
# /etc/monit/monitrc

# Глобальные настройки
set daemon 30                    # Проверка каждые 30 секунд
set logfile /var/log/monit.log   # Лог файл
set idfile /var/lib/monit/id     # ID файл
set statefile /var/lib/monit/state # Файл состояния

# Настройки HTTP интерфейса
set httpd port 2812 and
    use address localhost        # Только локальные подключения
    allow localhost              # Разрешить только localhost
    allow admin:monit            # Пользователь:пароль

# Настройки уведомлений
set mailserver localhost
set mail-format {
    from: monit@$HOST
    subject: $SERVICE $EVENT at $DATE
    message: Monit $ACTION $SERVICE at $DATE on $HOST: $DESCRIPTION.
}

# Получатель уведомлений
set alert admin@example.com

# Включение дополнительных конфигураций
include /etc/monit/conf.d/*

Мониторинг процессов

Базовый мониторинг процесса

bash
# /etc/monit/conf.d/nginx.conf

check process nginx with pidfile /var/run/nginx.pid
    start program = "/etc/init.d/nginx start"
    stop program  = "/etc/init.d/nginx stop"
    if failed port 80 then restart
    if 3 restarts within 5 cycles then timeout

Мониторинг с проверкой ресурсов

bash
# /etc/monit/conf.d/apache.conf

check process apache with pidfile /var/run/apache2/apache2.pid
    start program = "/etc/init.d/apache2 start"
    stop program  = "/etc/init.d/apache2 stop"
    if failed host localhost port 80 protocol http
       and request "/server-status" with timeout 10 seconds
       then restart
    if cpu > 60% for 2 cycles then alert
    if cpu > 80% for 5 cycles then restart
    if memory > 500 MB for 5 cycles then restart
    if 3 restarts within 5 cycles then timeout

Мониторинг MySQL

bash
# /etc/monit/conf.d/mysql.conf

check process mysql with pidfile /var/run/mysqld/mysqld.pid
    start program = "/etc/init.d/mysql start"
    stop program  = "/etc/init.d/mysql stop"
    if failed host localhost port 3306 protocol mysql
       with timeout 15 seconds
       then restart
    if failed unixsocket /var/run/mysqld/mysqld.sock
       then restart
    if cpu > 80% for 2 cycles then alert
    if memory > 1024 MB for 5 cycles then restart
    if 3 restarts within 5 cycles then timeout

Мониторинг файлов и директорий

Мониторинг файлов конфигурации

bash
# /etc/monit/conf.d/config-files.conf

check file nginx_config with path /etc/nginx/nginx.conf
    if changed checksum then alert
    if changed timestamp then alert
    if failed permission 644 then alert
    if failed uid root then alert
    if failed gid root then alert

Мониторинг лог файлов

bash
# /etc/monit/conf.d/log-files.conf

check file apache_error_log with path /var/log/apache2/error.log
    if size > 100 MB then exec "/usr/bin/truncate -s 0 /var/log/apache2/error.log"
    if changed timestamp then alert

Мониторинг директорий

bash
# /etc/monit/conf.d/directories.conf

check directory web_root with path /var/www/html
    if failed permission 755 then alert
    if failed uid www-data then alert
    if failed gid www-data then alert

Мониторинг файловых систем

Мониторинг дискового пространства

bash
# /etc/monit/conf.d/filesystem.conf

check filesystem rootfs with path /
    if space usage > 80% for 5 cycles then alert
    if space usage > 90% for 2 cycles then alert
    if inode usage > 80% for 5 cycles then alert
    if inode usage > 90% for 2 cycles then alert

check filesystem var with path /var
    if space usage > 80% for 5 cycles then alert
    if space usage > 90% for 2 cycles then alert

Мониторинг с действиями

bash
# /etc/monit/conf.d/disk-cleanup.conf

check filesystem tmp with path /tmp
    if space usage > 80% for 2 cycles then exec "/usr/bin/find /tmp -type f -mtime +7 -delete"
    if space usage > 90% for 1 cycle then exec "/usr/bin/find /tmp -type f -delete"

Сетевой мониторинг

Мониторинг HTTP сервисов

bash
# /etc/monit/conf.d/http-services.conf

check host website with address example.com
    if failed port 80 protocol http
       and request "/" with timeout 10 seconds
       then alert

check host secure_website with address secure.example.com
    if failed port 443 protocol https
       and request "/" with timeout 10 seconds
       then alert

Мониторинг с аутентификацией

bash
# /etc/monit/conf.d/authenticated-service.conf

check host api_server with address api.example.com
    if failed port 443 protocol https
       and request "/health" with timeout 10 seconds
       and header "Authorization: Bearer your-token-here"
       then alert

Мониторинг SMTP

bash
# /etc/monit/conf.d/smtp.conf

check host mail_server with address mail.example.com
    if failed port 25 protocol smtp
       with timeout 15 seconds
       then alert

Системный мониторинг

Мониторинг системных ресурсов

bash
# /etc/monit/conf.d/system.conf

check system $HOST
    if loadavg (1min) > 4 then alert
    if loadavg (5min) > 2 then alert
    if memory usage > 80% for 4 cycles then alert
    if swap usage > 20% for 4 cycles then alert
    if cpu usage (user) > 80% for 2 cycles then alert
    if cpu usage (system) > 80% for 2 cycles then alert

Мониторинг сетевых интерфейсов

bash
# /etc/monit/conf.d/network.conf

check network eth0 with interface eth0
    if failed link then alert
    if changed link then alert
    if saturation > 90% then alert
    if download > 10 MB/s for 5 cycles then alert
    if upload > 10 MB/s for 5 cycles then alert

Продвинутые настройки

Группировка сервисов

bash
# /etc/monit/conf.d/web-services.conf

check process nginx with pidfile /var/run/nginx.pid
    start program = "/etc/init.d/nginx start"
    stop program  = "/etc/init.d/nginx stop"
    group web

check process apache with pidfile /var/run/apache2/apache2.pid
    start program = "/etc/init.d/apache2 start"
    stop program  = "/etc/init.d/apache2 stop"
    group web

check process php-fpm with pidfile /var/run/php/php8.1-fpm.pid
    start program = "/etc/init.d/php8.1-fpm start"
    stop program  = "/etc/init.d/php8.1-fpm stop"
    group web

Зависимости между сервисами

bash
# /etc/monit/conf.d/dependencies.conf

check process database with pidfile /var/run/mysqld/mysqld.pid
    start program = "/etc/init.d/mysql start"
    stop program  = "/etc/init.d/mysql stop"
    if failed port 3306 then restart

check process webapp with pidfile /var/run/webapp.pid
    start program = "/etc/init.d/webapp start"
    stop program  = "/etc/init.d/webapp stop"
    depends on database
    if failed port 8080 then restart

Настройка уведомлений

bash
# /etc/monit/conf.d/notifications.conf

# Настройка почтового сервера
set mailserver smtp.gmail.com port 587
    username "monit@example.com"
    password "your-password"
    using tlsv12

# Настройка формата уведомлений
set mail-format {
    from: monit@$HOST
    subject: [$SERVICE] $EVENT - $HOST
    message:
    Service: $SERVICE
    Event: $EVENT
    Action: $ACTION
    Description: $DESCRIPTION
    Date: $DATE
    Host: $HOST
}

# Получатели уведомлений
set alert admin@example.com
set alert ops@example.com

Мониторинг программ и скриптов

Мониторинг пользовательских скриптов

bash
# /etc/monit/conf.d/scripts.conf

check program backup_script with path "/usr/local/bin/backup.sh"
    if status != 0 then alert
    if 3 restarts within 5 cycles then timeout

check program log_cleanup with path "/usr/local/bin/cleanup.sh"
    if status != 0 then alert
    every 24 cycles  # Запуск каждые 24 цикла (12 часов при 30-секундном интервале)

Мониторинг с проверкой вывода

bash
# /etc/monit/conf.d/output-check.conf

check program health_check with path "/usr/local/bin/health_check.sh"
    if status != 0 then alert
    if output match "ERROR" then alert
    if output match "CRITICAL" then alert

Безопасность и аутентификация

Настройка HTTP аутентификации

bash
# /etc/monit/monitrc

set httpd port 2812 and
    use address 0.0.0.0
    allow admin:monit
    allow readonly:readonly
    allow 192.168.1.0/24
    allow 10.0.0.0/8

SSL настройки

bash
# /etc/monit/monitrc

set httpd port 2812 and
    ssl enable
    pemfile /etc/ssl/certs/monit.pem
    allow admin:monit

Автоматизация и скрипты

Скрипт управления Monit

bash
#!/bin/bash
# monit_manager.sh

case "$1" in
    start)
        echo "Запуск Monit..."
        monit
        ;;
    stop)
        echo "Остановка Monit..."
        monit quit
        ;;
    restart)
        echo "Перезапуск Monit..."
        monit quit
        sleep 2
        monit
        ;;
    reload)
        echo "Перезагрузка конфигурации..."
        monit reload
        ;;
    status)
        echo "Статус сервисов:"
        monit status
        ;;
    summary)
        echo "Сводка сервисов:"
        monit summary
        ;;
    *)
        echo "Использование: $0 {start|stop|restart|reload|status|summary}"
        exit 1
        ;;
esac

Скрипт мониторинга состояния

bash
#!/bin/bash
# monit_health_check.sh

# Проверка статуса Monit
if ! pgrep -x "monit" > /dev/null; then
    echo "Monit не запущен!"
    exit 1
fi

# Проверка конфигурации
if ! monit -t; then
    echo "Ошибка в конфигурации Monit!"
    exit 1
fi

# Получение статуса сервисов
monit status | grep -E "(Process|File|Directory|Filesystem)" | while read line; do
    if echo "$line" | grep -q "Not monitored\|Failing"; then
        echo "Проблема с сервисом: $line"
    fi
done

Мониторинг и логирование

Настройка детального логирования

bash
# /etc/monit/monitrc

set logfile /var/log/monit.log
set logfile /var/log/monit.log size 1MB count 5
set daemon 30
set log syslog facility log_daemon

Ротация логов

bash
# /etc/logrotate.d/monit

/var/log/monit.log {
    daily
    missingok
    rotate 7
    compress
    delaycompress
    notifempty
    create 644 root root
    postrotate
        /bin/kill -USR1 `cat /var/run/monit.pid 2> /dev/null` 2> /dev/null || true
    endscript
}

Troubleshooting

Диагностика проблем

bash
# Проверка конфигурации
monit -t

# Запуск в режиме отладки
monit -Iv

# Проверка статуса сервисов
monit status

# Проверка логов
tail -f /var/log/monit.log

# Проверка процессов
ps aux | grep monit

Частые проблемы и решения

Проблема: Monit не запускается

bash
# Проверка прав доступа к файлам
sudo chown root:root /etc/monit/monitrc
sudo chmod 600 /etc/monit/monitrc

# Проверка синтаксиса
monit -t

# Проверка логов
journalctl -u monit

Проблема: Сервисы не перезапускаются

bash
# Проверка прав на выполнение скриптов
sudo chmod +x /etc/init.d/nginx
sudo chmod +x /etc/init.d/apache2

# Проверка PID файлов
ls -la /var/run/nginx.pid
ls -la /var/run/apache2/apache2.pid

Лучшие практики

1. Организация конфигурации

bash
# Структура конфигурации
/etc/monit/
├── monitrc              # Основной файл
├── conf.d/              # Дополнительные конфигурации
   ├── system.conf      # Системные сервисы
   ├── web.conf         # Веб-сервисы
   ├── database.conf    # Базы данных
   └── custom.conf      # Пользовательские сервисы
└── scripts/             # Скрипты для действий

2. Мониторинг критических сервисов

bash
# Приоритетные сервисы
check process sshd with pidfile /var/run/sshd.pid
    start program = "/etc/init.d/ssh start"
    stop program  = "/etc/init.d/ssh stop"
    if failed port 22 then restart
    if 3 restarts within 5 cycles then timeout

3. Регулярное обслуживание

bash
# Еженедельная проверка конфигурации
#!/bin/bash
monit -t > /dev/null 2>&1
if [ $? -ne 0 ]; then
    echo "Ошибка в конфигурации Monit" | mail -s "Monit Config Error" admin@example.com
fi

Заключение

Monit предоставляет мощные возможности для мониторинга и автоматического восстановления сервисов в Linux системах. Правильная настройка и регулярное обслуживание обеспечивают высокую доступность и стабильность системы.

Ключевые преимущества:

  • Автоматическое восстановление сервисов
  • Гибкая конфигурация через простой синтаксис
  • Веб-интерфейс для мониторинга
  • Мощные уведомления и алерты
  • Минимальное потребление ресурсов

Для получения дополнительной информации обратитесь к официальной документации Monit.