Monit — установка из исходников и настройка

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/

monit install from source

Подключение дополнительных конфигураций

Создадим каталог /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.

Ответить:

Please enter your comment!
Please enter your name here