Monit автоматический мониторинг системы Linux.

Monit — программа для проверки состояния сервера по многим параметрам. Используется как средство мониторинга и перезапуска каких либо сервисов,слежение за загрузкой сервера,файловой системой. Гибкие настройки и функционал делают программу очень полезной.

Monit умеет проверять:

  • Существование процесса по PID.
  • Работу определенного порта (TCP/UDP).
  • Ответ определенного протокола по порту (SMTP, SSH, HTTP,MYSQL…).
  • Ресурсы, занимаемые процессом (CPU/RAM).
  • Объем и свободное пространство в файловой системе.
  • Права доступа к файлу или каталогу.
  • MD5 checksum

В случае отклонений monit может:

  • Остановить, стартовать или перезапустить сервис.
  • Подождать определенное время.
  • Послать уведомление.
  • Примонтировать, отмонтировать файловую систему
  • Запустить отдельный скрипт и передать ему определенные параметры.

Начнем установку и настройку Monit.

apt-get install monit

Основной файл настройки демона /etc/monit/monitrc :

########################################################################
## Global section
########################################################################

set daemon 120 # Проверять каждые 120 сек.
with start delay 240 # Задержка первой проверки 240 сек.
set logfile /var/log/monit.log # Путь куда писать лог файл.
set mailserver localhost # Почтовый сервер отправки.
Пример для gmail.com
set mailserver smtp.gmail.com port 587
username "MYEMAIL"
password "MYPASSWORD"
using tlsv1
with timeout 30 seconds
set alert root@localhost # почта оповещения.
 Так же вы можете отправлять оповещение прям в настройке проверки: alert root@localhost.
 Можно и отключить оповещение на конкретное событие noalert root@localhost.
 Так же можно настроить  уведомление по событию :
 set alert root@localhost only on { timeout, nonexist } #События можно посмотреть в официальной документации.
set eventqueue # Запись событий которые не удалось отправить. Записи будут отправлены при первой возможности.
basedir /var/lib/monit/events # Файл записи. 
slots 1000 # Сколько записей хранить. 
Настраивать веб доступ мы не будет. Мне кажется это не безопасно ,сервис работает от пользователя root.
################################################### Services ######################################################

Так же можно настраивать их не в этом файле, а в отдельном для каждого сервиса include /etc/monit/conf.d/* . Теперь будем разбираться как писать проверки и их синтаксис.

CHECK SYSTEM 

Позволяет контролировать общие системные ресурсы хоста.

Общий синтаксис проверки  IF <test> THEN <action>

ACTION

  • ALERT отправка уведомления.
  • RESTART перезагрузка служб и отправка уведомления. С начало служба останавливается , потом запускается.
  • START старта службы и отправка уведомления..
  • STOP остановка службы и отправка уведомления. Мониторинг службы будет остановлен и запустить его можно только в ручную через консоль( monit monitor servicename) или веб интерфейс.
  • EXEC выполнения произвольной программы(помните что программа будет выполнена от пользователя root) и отправить оповещение:
     if failed <test> then exec "/usr/local/bin/sms.sh"
          as uid nobody and gid nobody
          repeat every 5 cycles
  • UNMONITOR отключить мониторинг и отправить уведомление. Включать придется опять же вручную.

TEST

IF <resource> <operator> <value> THEN <action>

Эти параметры можно использовать только для  system:
  • CPU([user|system|wait]) Загрузка ЦП (пользователь,система,ждущие)
  • SWAP  (Byte, kB, MB, GB). Занятая область  SWAP.
Эти параметры можно использовать в process:
  • CPU нагрузка на ЦП процессом.
  • TOTAL CPU нагрузка на ЦП процессом и дочерними процессами.
  • CHILDREN дочерние процессы.
  • TOTAL MEMORY занятая память процессом и дочерними процессами (Byte, kB, MB, GB).
Общие параметры:
  • MEMORY занятая память системой или процессом без дочерних процессов. Может также выражаться в % (Byte, kB, MB, GB).
  • LOADAVG([1min|5min|15min])  avg загрузка.operator ( «<«, «>», «!=», «==» ) или  («gt», «lt», «eq», «ne» ) или («greater», «less», «equal», «notequal»)

Пример системного монитора:

check system $HOST
 if loadavg (1min) > 4 then alert   #Загрузка процессора avg
 if loadavg (5min) > 2 then alert
 if memory usage > 90% then alert # Память
 if swap usage > 25% then alert # swap
 if cpu usage (user) > 70% then alert
 if cpu usage (system) > 30% then alert
 if cpu usage (wait) > 20% then alert

Вообще тестов очень много , полное описание и список можно найти в официальной документации.

CHECK PROCESS

Файл pid должен быть. Внимательно пишите путь.

check process apache with pidfile /var/run/apache2/apache2.pid
start program = "/etc/init.d/apache2 start" 
stop program = "/etc/init.d/apache2 stop"
#start program = "/bin/systemctl start apache2.service" with timeout 60 seconds # У меня корректно сервис перезапускается так.
#stop program = "/bin/systemctl stop apache2.service"

Запуск и остановка сервиса. with timeout 60 seconds значит ждать 30 секунд на остановку и 30 секунд на запуск сервиса.

Пример мониторинга Apache:

check process apache with pidfile /var/run/httpd.pid
   start program = "/etc/init.d/httpd start"
   stop program = "/etc/init.d/httpd stop"
   if cpu > 40% for 2 cycles then alert
   if total cpu > 60% for 2 cycles then alert
   if total cpu > 80% for 5 cycles then restart
   if mem > 100 MB for 5 cycles then stop
   if loadavg(5min) greater than 10.0 for 8 cycles then stop
FOR <X> CYCLES вы можете выполнить тест несколько раз перед действием. максимальное значение cycles 64.
if total cpu > 60% for 2 cycles then alert  # если в течении двух циклов проверки нагрузка больше 60% отправить уведомление.

CONNECTION TESTS

IF FAILED

[HOST string]
<PORT number>
[ADDRESS string]
[IPV4 | IPV6]
[TYPE <TCP|UDP>]
[<SSL|TLS> [with options {…}]
[CERTIFICATE CHECKSUM [MD5|SHA1] string]
[CERTIFICATE VALID for number DAYS]
[PROTOCOL protocol | <SEND|EXPECT> «string»,…]
[TIMEOUT number SECONDS]
[RETRY number]

THEN action

Options:

HOST hostname: Соответствен имя хоста.

PORT number: Номер порта для подключения.

UNIXSOCKET path: путь к Unix сокет (local machine only).

ADDRESS string:  IP address обращения.

IPV4 | IPV6 : Optionally specify the IP version Monit should use when trying to connect to the port. If not used, Monit will try to connect to the first available address (IPv4 or IPv6). If multiple addresses are available and connection to one address failed, Monit will try the next address and so on until a connection succeed or until there are no more addresses left to try.

TYPE <TCP | UDP]>: Тип подключения. По умолчанию используется TCP.

[SSL | TLS] [with options {…}]:Установите SSL/TLS и переопределить глобальные параметры/параметры SSL по умолчанию. Вы можете установить SSL/TLS версии использовать, проверять сертификаты, доверять само заверяющим сертификатам или установить базу данных клиентских сертификатов SSL для проверки подлинности сертификата клиента.

CERTIFICATE CHECKSUM [MD5|SHA1] hash. Проверить сертификат сервера SSL, проверив его контрольную сумму. Вы можете использовать MD5 или SHA1 контрольной суммы (если Вы не укажите Тип, Monit определит дайджест в зависимости от длины хэш).

if failed
 port 443
 protocol https
 and certificate checksum = "1ED948A6F4258ACAB964227EF4EB19FCC453B0F8"
 then alert

CERTIFICATE VALID for number DAYS. Отправляет уведомление о сроке сертификата.

if failed
 port 443
 protocol https
 and certificate valid > 30 days
 then alert

PROTOCOL protocol : APACHE-STATUS, DNS, DWP, FTP, GPS, HTTP, HTTPS, IMAP, IMAPS, CLAMAV, LDAP2, LDAP3, LMTP, MEMCACHE, MONGODB, MYSQL, NNTP, NTP3, PGSQL, POP, POPSPOSTFIX-POLICY, RADIUS, RDATE, REDIS, RSYNC, SIEVE, SIP, SMTP, SMTPS, SSH, TNS, WEBSOCKET.

TIMEOUT number SECONDS: Таймаут количество секунд. При необходимости указывает подключения и чтения время ожидания для подключения. Если Monit не удается подключиться к серверу в это время он будет считать, что соединение не удалось, и выполнять указанное действие. По умолчанию тайм-аут подключения-5 секунд.

RETRY number: Число повторов. При необходимости указывает число повторных попыток подряд в течение одного цикла испытаний в случае, если соединение не удалось. По умолчанию стоит одна попытка.

Specific protocol test options смотри в официальной документации. Здесь я расписывать не буду .

Немного примеров:

check process apache with pidfile /var/run/httpd.pid
 start program = "/etc/init.d/httpd start" with timeout 60 seconds
 stop program = "/etc/init.d/httpd stop"
 if failed port 80 for 2 cycles then restart # если 80 порт не отвечает, перезагрузить сервис.
 #if failed port 443 for 2 cycles then restart

В этом примере мы проверяем сервер Apache веб-сервер работает на localhost,
который отвечает за несколькими IP на основе виртуальных Хостов или виртуальных доменов:

check process apache with pidfile /var/run/httpd.pid
 start "/etc/init.d/httpd start"
 stop "/etc/init.d/httpd stop"
 if failed host www.sol.no port 80 then alert
 if failed host shop.sol.no port 443 then alert
 if failed host chat.sol.no port 80 then alert

check process apache with pidfile /var/run/httpd.pid
 start "/etc/init.d/httpd start"
 stop "/etc/init.d/httpd stop"
 if failed
 host www.sol.no port 80 protocol http
 then alert

NETWORK PING TEST

IF FAILED PING[4|6]
[COUNT number]
[SIZE number]
[TIMEOUT number SECONDS]
[ADDRESS string]
THEN action

Вы можете заставить Monit пинговать только IPv4 или IPv6-адреса с помощью PING4 или PING6

COUNT: определяет, сколько последовательных ping-запросы будут отправлены на хост в один цикл . Значение по умолчанию 3.

SIZE: задает размер данных. По умолчанию-64 байта.

TIMEOUT: время сколько ждать ответа, к стати даже если хотя бы один ping пройдет, Monit будет считать что все хорошо.

примерчик:

check host mmonit.com with address mmonit.com
 if failed ping4 then alert # IPv4 only
 if failed ping6 then alert # IPv6 only

check host mmonit.com with address mmonit.com
 if failed ping count 5 size 128 with timeout 10 seconds then alert

UPTIME TEST

Забавный тест.

IF UPTIME [[operator] value [unit]] THEN action

unit :  «SECOND», «MINUTE», «HOUR» or «DAY» (можно заменить «SECONDS», «MINUTES», «HOURS», or «DAYS»).

check process myapp with pidfile /var/run/my.pid
 start program = "/etc/init.d/my start"
 stop program = "/etc/init.d/my stop"
 if uptime > 3 days then restart

FILE SIZE TEST

IF SIZE [[operator] value [unit]] THEN action

operator можно использовать( «<«, «>», «!=», «==») или («GT», «LT», «EQ», «NE») или ( «GREATER», «LESS», «EQUAL», «NOTEQUAL») человеко понятные выражения.

unit : «B»,»KB»,»MB»,»GB»  или «byte», «kilobyte», «megabyte», «gigabyte».

check file mydb with path /data/mydatabase.db
 if size > 1 GB then alert

Ну и под конец примеры популярных сервисов:

FTP Services
 Proftpd
 check process proftpd with pidfile /var/run/proftpd.pid
 start program = "/etc/init.d/proftpd start"
 stop program = "/etc/init.d/proftpd stop"
 if failed port 21 protocol ftp then restart
 Login Services
 SSHD
 check process sshd with pidfile /var/run/sshd.pid
 start program "/etc/init.d/sshd start"
 stop program "/etc/init.d/sshd stop"
 if failed port 22 protocol ssh then restart
Apache
 check process apache with pidfile /opt/apache_misc/logs/httpd.pid
 start program = "/etc/init.d/apache start"
 stop program = "/etc/init.d/apache stop"
 if failed host localhost port 80
 protocol HTTP request "/~hauk/monit/token" then restart
 if failed host 192.168.1.1 port 443 type TCPSSL
 certmd5 12-34-56-78-90-AB-CD-EF-12-34-56-78-90-AB-CD-EF
 protocol HTTP request http://localhost/~hauk/monit/token then restart
 depends on apache_bin
 depends on apache_rc

check file apache_bin with path /opt/apache/bin/httpd
 if failed checksum then unmonitor
 if failed permission 755 then unmonitor
 if failed uid root then unmonitor
 if failed gid root then unmonitor

check file apache_rc with path /etc/init.d/apache
 if failed checksum then unmonitor
 if failed permission 755 then unmonitor
 if failed uid root then unmonitor
 if failed gid root then unmonitor

Mail Services
 Postfix (mail server)
 check process postfix with pidfile /var/spool/postfix/pid/master.pid
 start program = "/etc/init.d/postfix start"
 stop program = "/etc/init.d/postfix stop"
 if failed port 25 protocol smtp then restart
 depends on postfix_rc

check file postfix_rc with path /etc/init.d/postfix
 if failed checksum then unmonitor
 if failed permission 755 then unmonitor
 if failed uid root then unmonitor
 if failed gid root then unmonitor

Sendmail (mail server)
 check process sendmail with pidfile /var/run/sendmail.pid
 start program = "/etc/init.d/sendmail start"
 stop program = "/etc/init.d/sendmail stop"
 if failed port 25 protocol smtp then restart
 depends on sendmail_bin
 depends on sendmail_rc

check file sendmail_bin with path /usr/lib/sendmail
 if failed checksum then unmonitor
 if failed permission 755 then unmonitor
 if failed uid root then unmonitor
 if failed gid root then unmonitor

check file sendmail_rc with path /etc/init.d/sendmail
 if failed checksum then unmonitor
 if failed permission 755 then unmonitor
 if failed uid root then unmonitor
 if failed gid root then unmonitor

Database Services
 MySQL Server

check process mysql with pidfile /opt/mysql/data/myserver.mydomain.pid
 group database
 start program = "/etc/init.d/mysql start"
 stop program = "/etc/init.d/mysql stop"
 if failed host 192.168.1.1 port 3306 protocol mysql then restart
 depends on mysql_bin
 depends on mysql_rc

check file mysql_bin with path /opt/mysql/bin/mysqld
 group database
 if failed checksum then unmonitor
 if failed permission 755 then unmonitor
 if failed uid root then unmonitor
 if failed gid root then unmonitor

check file mysql_rc with path /etc/init.d/mysql
 group database
 if failed checksum then unmonitor
 if failed permission 755 then unmonitor
 if failed uid root then unmonitor
 if failed gid root then unmonitor