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