Monit — бесплатная утилита мониторинга с низким потреблением системных ресурсов, а также простотой использования и настройки.
Утилита ведет наблюдение за системой и уведомляет администратора о малейших отклонениях от заданных правил. При соответствующей настройке может останавливать потребляющие большое количество ресурсов процессы и перезапускать переставшие отвечать службы.
Установка Monit из исходников
Для сборки нужно установить следующий набор утилит и библиотек.
apt-get install -y build-essential autoconf automake pkg-config libtool checkinstall
А также установить библиотеки PAM, zlib и libssl.
apt-get install -y libpam0g-dev zlib1g-dev libssl-dev
Скачиваем архив с исходниками.
wget https://mmonit.com/monit/dist/monit-5.25.2.tar.gz
Распаковываем архив и сразу переходим в распакованный каталог.
tar -zxvf monit-5.25.2.tar.gz && cd monit-5.25.2
Собираем указав местонахождение конф. файла (--sysconfdir=/etc/monit).
./configure --sysconfdir=/etc/monit
Компилируем и устанавливаем.
make && checkinstall
Каталог для конфигурационных файлов.
mkdir /etc/monit
Скопируем дефолтный конф. файл monitrc из каталога с исходниками в /etc/monit.
cp ~/monit-5.25.2/monitrc /etc/monit
Иногда Monit может ругаться на неправильные права доступа к файлу monitrc. Такое случается когда копируешь готовый конф. файл или создаешь его с нуля.
The control file '/etc/monitrc' permission 0644 is wrong, maximum 0700 allowed
Лучше всего сразу проверить разрешения и при необходимости установить в значение 0600.
chmod 600 /etc/monit/monitrc
Для добавления в автозагрузку и управления через systemd копируем monit.service из каталога с исходниками в /lib/systemd/system.
cp ~/monit-5.25.2/system/startup/monit.service /lib/systemd/system
Добавим в автозагрузку и запустим.
systemctl enable monit systemctl start monit
Управление Monit
Выполним monit --help для просмотра списка команд управления.
start all - Запустить все сервисы start <name> - Запустить названный сервис stop all - Остановить все сервисы stop <name> - Остановить названный сервис restart all - Остановить и запустить все сервисы restart <name> - Перезапустить только наванный сервис monitor all - Задействовать мониторинг всех сервисов monitor <name> - Задействовать мониторинг только названного сервиса unmonitor all - Остановить мониторинг всех сервисов unmonitor <name> - Остановить мониторинг только названного сервиса reload - Реинициализация (перезагрузка настроек) monit status [name] - Вывести полный статус сервиса/сервисов summary [name] - Вывести суммарный (короткий) статус сервиса/сервисов report [up|down|..] - Отчет по сервисам. Подробнее в мануале. quit - Убить все процессы monit validate - Проверить все сервисы и запустить незапущенные procmatch <pattern> - Проверка процессов на соответствие шаблону
Основные настройки Monit
За настройки отвечает конф. файл /etc/monit/monitrc. В файле содержится много примеров, все достаточно подробно описано, так что разобраться не составит труда.
Частота проверки сервисов
Устанавливаю частоту проверки в 120 секунд и задержку в 300 секунд. Monit начинает проверку сразу после загрузки, но поскольку не все службы успевают загрузиться одновременно, то первая проверка пойдет через пять минут после старта.
set daemon 120 with start delay 300
На время настройки параметр лучше всего закомментировать, поскольку задержка работает не только при старте, но и при перезапуске.
log, state, id — файлы
Будем писать логи в отдельный файл, поскольку по умолчанию все пишется в syslog.
set logfile /var/log/monit.log
В /etc/logrotate.d создадим файл monit и добавим в него следующее содержимое.
/var/log/monit.log { su root root rotate 14 daily compress missingok create 0644 root root postrotate invoke-rc.d monit reload > /dev/null endscript notifempty }
После сохранения настроек и перезагрузки запускаем ротацию лог-файла.
logrotate -v -f /etc/logrotate.d/monit
Файл monit.id хранит уникальный идентификатор, а файл monit.state содержит информацию о состоянии мониторинга чтобы восстанавливать его после перезагрузки. По умолчанию файлы создаются в домашнем каталоге пользователя. Я изменяю положение файлов и помещаю их в /etc/monit.
set idfile /etc/monit/.monit.id set statefile /etc/monit/.monit.state
Не забудьте удалить старые файлы после перезапуска.
Рассылка уведомлений
Для рассылки уведомлений можно использовать локальный почтовый сервер или удаленный. Также рассылку можно настроить через SMTP сервер Gmail. Меня вполне устраивает мой Postfix и поэтому я устанавливаю значение localhost.
set mailserver localhost
Если почтовый сервер недоступен, то все уведомления отключаются. Чтобы этого не произошло и уведомления сохранялись для повторной доставки, следует включить очередь событий (eventqueue).
set eventqueue
При включенной очереди событий нужно указать каталог для хранения сообщений и установить их максимальное количество.
set eventqueue basedir /etc/monit/events slots 100
Не забываем создать каталог /etc/monit/events.
mkdir /etc/monit/events
Зададим адрес с которого будут приходить уведомления.
set mail-format { from: monit@techlist.top }
Напоследок я указываю два почтовых ящика. В документации рекомендуется указать именно два ящика, один для всех уведомлений, а второй только для критических, например когда упал один из сервисов (событие timeout).
set alert admin@techlist.top set alert alert@techlist.top { timeout }
HTTP/веб-интерфейс
Monit имеет HTTP-интерфейс для просмотра состояния через браузер.
set httpd port 2812 and use address localhost # only accept connection from localhost (drop if you use M/Monit) allow localhost # allow localhost to connect to the server and allow admin:monit # require user 'admin' with password 'monit'
По умолчанию интерфейс настроен на localhost и 2812-й порт, и доступен по адресу:
http://localhost:2812/
Изменим настройки для возможности доступа с удаленных машин. Меняем "localhost" на ip-адрес своего сервера.
use address 93.170.169.118
Чтобы разрешить доступ к интерфейсу с любых ip-адресов (без ограничений), меняем "localhost" на "0.0.0.0/0.0.0.0".
allow 0.0.0.0/0.0.0.0
Доступ только с одного ip-адреса.
allow 192.168.1.150
Соответственно для нескольких ip-адресов.
allow 192.168.1.150 allow 192.168.1.155
Для входа используется логин:пароль (admin:monit). Изменяем на свои значения.
allow admin:monit
После перезапуска HTTP-интерфейс будет доступен по адресу:
http://93.170.169.118:2812/
Подключение дополнительных конфигураций
Создадим каталог /etc/monit/conf.d для остальных файлов с настройками.
mkdir /etc/monit/conf.d
Включаем содержимое каталога в общую конфигурацию.
include /etc/monit/conf.d/*
В итоге у меня вышел вот такой файл с основными настройками.
# Частота проверки сервисов set daemon 120 with start delay 300 # log-файл set logfile /var/log/monit.log # id-файл set idfile /etc/monit/.monit.id # state-файл set statefile /etc/monit/.monit.state # HTTP-интерфейс (Только для примера!) set httpd port 2812 and use address 93.170.169.118 allow 0.0.0.0/0.0.0.0 allow admin:monit # Почтовый сервер set mailserver localhost # Очередь событий set eventqueue basedir /etc/monit/events slots 100 # Адрес с которого слать уведомления set mail-format { from: monit@techlist.top } # Ящик куда слать уведомления set alert admin@techlist.top # Доп. конфигурации include /etc/monit/conf.d/*
Мониторинг общего состояния системы
Настроим проверку общих системных ресурсов, таких как: среднее значение загрузки системы, потребление процессора и памяти. Пример из конф. файла monitrc.
## Check general system resources such as load average, cpu and memory ## usage. Each test specifies a resource, conditions and the action to be ## performed should a test fail. # # check system $HOST # if loadavg (1min) > 4 then alert # if loadavg (5min) > 2 then alert # if cpu usage > 95% for 10 cycles then alert # if memory usage > 75% then alert # if swap usage > 25% then alert
Немного изменю настройки и сохраню в виде файла system в /etc/monit/conf.d.
check system techlist-server if loadavg (1min) > 4 then alert if loadavg (5min) > 2 then alert if memory usage > 75% then alert if swap usage > 25% then alert if cpu usage (user) > 90% then alert if cpu usage (system) > 50% then alert if cpu usage (wait) > 30% then alert
Мониторинг файловой системы
За файловую систему отвечают следующие настройки (пример из файла monitrc).
## Check filesystem permissions, uid, gid, space usage, inode usage and disk I/O. ## Other services, such as databases, may depend on this resource and an automatically ## graceful stop may be cascaded to them before the filesystem will become full and data ## lost. # # check filesystem datafs with path /dev/sdb1 # start program = "/bin/mount /data" # stop program = "/bin/umount /data" # if failed permission 660 then unmonitor # if failed uid "root" then unmonitor # if failed gid "disk" then unmonitor # if space usage > 80% for 5 times within 15 cycles then alert # if space usage > 99% then stop # if inode usage > 30000 then alert # if inode usage > 99% then stop # if read rate > 1 MB/s for 5 cycles then alert # if read rate > 500 operations/s for 5 cycles then alert # if write rate > 1 MB/s for 5 cycles then alert # if write rate > 500 operations/s for 5 cycles then alert # if service time > 10 milliseconds for 3 times within 5 cycles then alert # group server
Переписываю настройки и сохраняю в виде файла filesystem в /etc/monit/conf.d.
check filesystem datafs with path /dev/mapper/vg-lv_root start program = "/bin/mount /dev/mapper/vg-lv_root" stop program = "/bin/umount /dev/mapper/vg-lv_root" if failed permission 660 then alert if failed uid "root" then alert if space usage > 95% for 5 times within 15 cycles then alert if inode usage > 95% then alert group server
Отдельное внимание стоит обратить на имя и расположение устройства за которым будет вестись наблюдение. У меня называется vg-lv_root и находится в /dev/mapper/.
Список дисков можно просмотреть командой df -h.
df -h Filesystem Size Used Avail Use% Mounted on udev 472M 0 472M 0% /dev tmpfs 99M 13M 86M 14% /run /dev/mapper/vg-lv_root 19G 6.8G 11G 40% / tmpfs 492M 0 492M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 492M 0 492M 0% /sys/fs/cgroup /dev/sda1 461M 461M 0 100% /boot tmpfs 99M 0 99M 0% /run/user/0
Или по точке монтирования командой mount.
mount /dev/mapper/vg-lv_root on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)
Проверка доступности отдельных служб
Примеры файлов можно найти в Wiki на странице Configuration Examples. Здесь есть готовые конфигурации практически на все случаи жизни, но это не значит что файлы можно слепо копировать и использовать. Иногда требуются правки.
SSH
Для ssh-сервера есть готовый файл, который пришлось немного поправить. Скрипт в /etc/init.d у меня назывался ssh, а не sshd, поэтому я изменил файл. Помимо проверки по pid-файлу, здесь еще есть проверка доступности ssh на 22-м порту.
check process SSH with pidfile /var/run/sshd.pid start program "/etc/init.d/ssh start" stop program "/etc/init.d/ssh stop" if failed port 22 protocol ssh then restart
Cron
Для мониторинга cron я использую такие настройки.
check process cron with pidfile /var/run/crond.pid start program = "/etc/init.d/cron start" stop program = "/etc/init.d/cron stop" group system
Nginx
Для веб-сервера Nginx используется следующая конфигурация. Проверяем работу по наличию pid-файла, если сервер неактивен — перезапускаем скриптами из /etc/init.d/.
check process Nginx with pidfile /var/run/nginx.pid start program = "/etc/init.d/nginx start" stop program = "/etc/init.d/nginx stop"
MariaDB
Для СУБД MariaDB используется похожая конфигурация. Проверяем по pid-файлу, если непорядок — перезапускаем.
check process MariaDB with pidfile /var/run/mysqld/mysqld.pid start program = "/etc/init.d/mysql start" stop program = "/etc/init.d/mysql stop"
PHP 7
Для php7-fpm — проверка по pid + дополнительная проверка sock-файла.
check process PHP7 with pidfile /var/run/php-fpm.pid start program = "/usr/sbin/service php7 start" stop program = "/usr/sbin/service php7 stop" if failed unixsocket /var/run/techlist.sock then restart
Прокси-серверы Tinyproxy и Dante
Для прокси-серверов Tinyproxy и Dante я использую такие настройки.
check process Tinyproxy with pidfile /var/run/tinyproxy/tinyproxy.pid start program "/etc/init.d/tinyproxy restart" stop program "/etc/init.d/tinyproxy stop" check process Dante-sockd with pidfile /var/run/sockd.pid start program "/etc/init.d/sockd start" stop program "/etc/init.d/sockd stop"
Выполним команду monit reload для применения настроек. Остановите все службы, которые были поставлены на проверку доступности, и если через некоторое время они будут запущены, то все настроено правильно.
Документация Monit.