Понадобилось решение для мониторинга и автоматического перезапуска некоторых сервисов. Поискав решение в Интернете, решил ознакомиться с возможностями monit.
Немного общей информации о monit.
Monit умеет мониторить:
При возникновении проблемы monit отправляет e-mail уведомление (шаблоны можно модифицировать) и может перезапустить сервис. В monit встроен простенький веб-сервер, который позволяет посмотреть состояние объектов мониторинга, включить/выключить определенный объект. Monit умеет перезапускать сервисы если они падают или не выполняется какое-то условие.
Monit построен с идеей того что система мониторинга должна быть максимально надежной и простой. И это действительно выполняется - на monit можно положиться.
Конечно из-за своей простоты monit не обладает тем количеством возможностей, которыми обладают Enterptise-системы мониторинга. Однако существует дополнение к monit под названием M/Monit, которое позволяет управлять несколькими серверами с monit из одного места. К сожалению, M/Monit распространяется под коммерческой лицензией, тоесть за деньги.
Выполним установку из портов:
# cd /usr/ports/sysutils/monit && make install clean && rehash |
Создадим конфигурационный файл monitrc копированием предложенного примера:
# cd /usr/local/etc && cp monitrc.sample monitrc |
Возможно кому-то пригодится перевод на русский дефолтного файла конфигурации monitrc (для monit-5.3_1):
############################################################################### ## Monit control file ############################################################################### ## ## Комментарии начинаются с '#' и действительны до конца строки. ## Все пути ДОЛЖНЫ БЫТЬ ПОЛНОСТЬЮ УКАЗАНЫ и начинаться с '/'. ## ## Ниже указаны примеры наиболее часто использованых конфигураций. Информацию ## относительно файла конфигурации и полного списка состояний и опций можно ## посмотреть в документации Monit. ## ############################################################################### ## Global section ############################################################################### ## ## Запуск Monit в фоновом режиме (запустить как daemon): # set daemon 60 # проверять сервисы с минутным интервалом #with start delay 240 # опционально: задержка перед первой проверкой # задана в 4 минуты (по умолчанию Monit # выполняет проверку сразу после запуска # ## Использовать логирование syslog как 'daemon' facility. Если опция ## FACILITY будет упущена, Monit будет использовать 'user' facility по ## умолчанию. Если есть необходимость логировать в определенный лог-файл, ## необходимо задать полный путь к лог-файлу. # # set logfile syslog facility log_daemon # ## Задать расположение файла, где будет храниться уникальный идентификатор ## екземпляра Monit. Идентификатор генерируется и сохраняется при первом ## запуске Monit. По умолчанию файл размещен в $HOME/.monit.id. # # set idfile /var/.monit.id # ## Задать расположение файла состояния, куда сохраняются состояния в каждом ## цикле. По умолчанию файл размещен в $HOME/.monit.state. Если файл состояния ## расположен в постоянной файловой системе, то Monit восстановит состояние ## мониторинга после перезапуска. Если это временная файловая система, то ## состояние будет утеряно после перезапуска, что может быть удобно в ## некоторых ситуациях. # # set statefile /var/.monit.state # ## Задать список почтовых серверов для доставки уведомлений. Можно указывать ## несколько серверов, разделяя список комами. Если первый почтовый сервер ## выдает ошибку, Monit будет использовать второй сервер в списке и т.д. ## По умолчанию Monit использует порт 25 - возможно переназначить, используя ## опцию PORT. # # set mailserver mail.bar.baz, # primary mailserver # backup.bar.baz port 10025, # backup mailserver on port 10025 # localhost # fallback relay # ## По умолчанию, Monit уничтожает уведомления, если почтовые сервера ## недоступны. Если вы хотите сохранить уведомления для дальнейших попыток ## доставки, необходимо использовать EVENTQUEUE состояние. Базовый каталог, ## где будут храниться недоставленные уведомления, задается опцией BASEDIR. ## Можно ограничить максимальный размер очереди, используя опцию SLOTS (если ## не указано, очередь ограничивается пространством, доступным на конечной ## файловой системе. # # set eventqueue # basedir /var/monit # set the base directory where events will be stored # slots 100 # optionally limit the queue size # ## Отправлять состояние и события в M/Monit (чтобы получить больше информации ## о M/Monit, смотрите http://mmonit.com/). По умолчанияю Monit регистрирует ## вверительные грамоты с M/Monit, так что M/Monit может обратно связываться ## с Monit и нету необходимости регистрировать вверительные грамоты вручную ## в M/Monit. Есть возможность отключить регистрацию вверительных грамот, ## используя закомментированную опцию ниже. Если вы заботитесь о ## безопасности, рекомендуется использовать https для обмена с M/Monit и ## отправки вверительных грамот. # # set mmonit http://monit:monit@192.168.1.10:8080/collector # # and register without credentials # Don't register credentials # ## Monit по умолчанию использует следующий формат почтовых уведомлений: ## ## --8<-- ## From: monit@$HOST # Отправитель ## Subject: monit alert -- $EVENT $SERVICE # Тема ## ## $EVENT Service $SERVICE # ## # ## Date: $DATE # ## Action: $ACTION # ## Host: $HOST # Тело письма ## Description: $DESCRIPTION # ## # ## Your faithful employee, # ## Monit # ## --8<-- ## ## Можно переписать формат сообщения или его части, такие как тема или ## отправитель, используя MAIL-FORMAT состояние. Макросы, такие как DATE ## и т.д., применяются во время выполнения. Например, чтобы переписать ## отправителя, используется: # # set mail-format { from: monit [at] foo [dot] bar } # ## Можно задать получателей уведомлений, которые получат уведомления, ## когда сервисы, заданные в этом файле имеют ошибки. Уведомления можно ## ограничивать событиями, используя фильтры, как указано на примере ниже. # # set alert sysadm [at] foo [dot] bar # receive all alerts # set alert manager [at] foo [dot] bar only on { timeout } # receive just service- # # timeout alert # # ## Monit имеет встроенный web-сервер, который может использоваться для ## просмотра статуса контролируемых сервисо и управления сервисами через ## web-интерфейс. Смотри Monit Wiki, если необходима поддержка SSL для ## web-сервера. # set httpd port 2812 and use address localhost # принимать соединения только с localhost allow localhost # разрешить соединения только с localhost и allow admin:monit # разрешить пользователя 'admin' с паролем 'monit' allow @monit # разрешить пользователям групы 'monit' соединяться (rw) allow @users readonly # разрешить пользователся групы 'users' соединяться (ro) ############################################################################### ## Services ############################################################################### ## ## Проверять основные системные ресурсы, такие как load average, использование ## cpu и memory. Каждая проверка задает ресурс, состояние и действие, которое ## выполняется, если проверка заканчивается неудачей. # # check system myhost.mydomain.tld # 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) > 70% then alert # if cpu usage (system) > 30% then alert # if cpu usage (wait) > 20% then alert # ## Проверка существования файла, контрольной суммы, прав, uid и gid. Кроме |
Следующий шаг - создание собственного monitrc, редактируя пример. В моем случае monitrc получился следующий:
##############################################
## Global section ############################################## set daemon 120
with start delay 240 set logfile /var/log/monit.log set idfile /var/monit/.monit.id set statefile /var/monit/.monit.state set mailserver localhost set eventqueue basedir /var/monit/alerts slots 100 set mail-format { from: monit [at] muff [dot] kiev [dot] ua subject: $SERVICE $EVENT at $DATE} set alert admins [at] muff [dot] kiev [dot] ua set httpd port 2812 and use address 0.0.0.0 allow 192.168.168.22/32
allow admin:monit ##############################################
## Includes ############################################## include /usr/local/etc/monit/*.conf
|
Cоздадим каталоги, на которые имеются ссылки в файле конфигурации:
# mkdir /var/monit # mkdir /var/monit/alerts # mkdir /usr/local/etc/monit |
Также рекомендую настроить ротацию логов (чтобы не исчерпать в результате все доступное дисковое пространство на /var). Более детально о настройке ротации логов можно почитать в этой статье. Ротацию логов будем выполнять один раз в неделю:
# echo '/var/log/monit.log 644 3 * $W6D0 JC' >> /etc/newsyslog.conf |
Теперь создадим несколько конфигурационных файлов для мониторинга и разместим их в каталог /usr/local/etc/monit. Будем выполнять проверку общих системных ресурсов, работу некоторых сервисов, свободного дискового пространства. В результате имеем такие конфигурационные файлы:
1. Проверка общих системных ресурсов - /usr/local/etc/monit/system.conf
check system muff.kiev.ua 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) > 70% then alert if cpu usage (system) > 30% then alert if cpu usage (wait) > 20% then alert |
2. Проверка сервисов - /usr/local/etc/monit/process.conf
check process apache with pidfile /var/run/httpd.pid |
3. Проверка свободного дискового пространства - /usr/local/etc/monit/filesystem.conf
check device root with path /dev/mirror/gm0s1a if space usage > 85% for 5 times within 15 cycles then alert if inode usage > 85% then alert check device home with path /dev/mirror/gm0s1d if space usage > 85% for 5 times within 15 cycles then alert if inode usage > 85% then alert check device usr with path /dev/mirror/gm0s1g if space usage > 85% for 5 times within 15 cycles then alert if inode usage > 85% then alert check device var with path /dev/mirror/gm0s1e if space usage > 85% for 5 times within 15 cycles then alert if inode usage > 85% then alert |
Добавим поддержку monit в rc.conf и запустим сервис:
# echo '# Monit - monitoring system' >> /etc/rc.conf # echo 'monit_enable="YES"' >> /etc/rc.conf # sh /usr/local/etc/rc.d/monit start Starting monit. monit: generated unique Monit id 10473348799bae9558af6f918ef160fd and stored to '/var/monit/.monit.id' Starting monit daemon with http interface at [0.0.0.0:2812] Monit start delay set -- pause for 240s |
Проверим, какие возможности предоставляет web-интерфейс. Скриншоты - ниже.
Выполним проверку работы monit - остановим сервис proftpd:
# killall proftpd |
Через небольшой промежуток времени на почту должны прийти уведомления - о перезапуске сервиса, и о том, что сервис успешно запущен.
В логе /var/log/monit.log также можно обнаружить запись о сбое в работе сервиса:
[EEST Oct 5 16:47:33] error : 'proftpd' process is not running [EEST Oct 5 16:47:34] info : 'proftpd' trying to restart [EEST Oct 5 16:47:34] info : 'proftpd' start: /usr/local/etc/rc.d/proftpd [EEST Oct 5 16:49:34] info : 'proftpd' process is running with pid 78440 |
Сервис успешно перезапущен.
Однако стоит иметь ввиду, что возможностей у monit намного больше, нежели описано в этой статье. Рекомендую ознакомиться с документацией monit.
Спасибо, очень полезная вещь
Спасибо, очень полезная вещь
Таки да... Довольно часто
Таки да... Довольно часто использую на удаленных серверах, отправленных в "автономное плаванье". Иногда и по полгода-год не приходится даже логинится на них.
Re: Monit - надежный мониторинг системы
Я научил Monit отправлять СМС сообщения если сайт неработает.
Здесь несколько полезных правил для него с инструкцией как это сделать.
dj-x.org.ua/index.php?topic=349.msg542#msg542
Re: Monit - надежный мониторинг системы
Я придумал как управлять Monit из PHP файла!
Пример для правила под названием sshd
# sshd
check process sshd with pidfile "/var/run/sshd.pid"
start program "/usr/bin/service ssh start"
stop program "/usr/bin/service ssh stop"
Re: Monit - надежный мониторинг системы
Спасибо за перевод хелпа.
Хорошая программа, помогает мне перезапускать Jenkins на CI сервере.
Re: Monit - надежный мониторинг системы
а какая монит прога позволяет мониторить работу этого monit ?