Monitorizarea și repornirea automată a serviciilor pe un server Linux cu monit

Folosesc deja de multă vreme Nagios. Nagios este foarte util pentru notificări despre servicii pe diverse servere ce nu funcționează. Poate trimite notificări prin e-mail, SMS(având un SMS gateway conectat), poate vorbi în boxe(prin intermediul festival) sau poate destul de multe notificări.

Însă nagios face doar notificări. Rulează sub un user simplu, pentru anumite comenzi(ce nu pot fi rulat de sub un simplu user) face sudo (cu supraveghere atentă).

Până nu demult aveam întipărită bine în minte ideea că dacă vreau ceva care să verifice starea unui program și să ia măsuri în anumite situații trebuie să fac un script, aveam în cap chiar și un exemplu (de la eggdrop, remember IRC?) care să îl pun să ruleze în cron.

Ieri m-a întrebat despre așa ceva, pe messenger, unul dintre cititorii acestui blog. I-am dat aceleași răspunsuri pe care le-am scris mai sus dar se pare că pe el nu l-a mulțumit. A tot căutat și el pe net până a dat de un tutorial pe care mi l-a pasat.
Software-ul pare a fi unul destul de matur, a ajuns la versiunea a 5-a(În repozitoarele Debian stable sau Ubuntu LTS e la versiunea 4.8.x). Are chiar și o interfață web pe care totuși nu v-aș recomanda să o porniți, iar dacă o porniți să nu o lăsați liberă publicului larg(în primul rând daemonul rulează sub userul root).

Monit este capabil ca în funcție de diverși parametrii ai aplicatiei, cum ar fi memoria RAM utilizată, nivelul de încărcare al procesorului, dispariția activității pe portul TCP sau UDP să ia anumite măsuri, adică să lanseze anumite comenzi de oprire/pornire/repornire a serviciilor sau chiar modificarea permisiunilor asupra fișierelor.

Dar gata cu vorba lungă, care contrar reclamelor de la TV, este sărăcia omului și să ne apucăm de treabă. Începem cu instalarea pachetului. Nu avem de făcut decât să rulăm ca root următoarea comandă:

apt-get install monit

Ce se îtâmplă?:

Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
  monit
0 upgraded, 1 newly installed, 0 to remove and 2 not upgraded.
Need to get 254kB of archives.
After this operation, 680kB of additional disk space will be used.
Get:1 http://ftp.nb.lug.ro hardy/universe monit 1:4.8.1-2.1 [254kB]
Fetched 254kB in 0s (1966kB/s)
Selecting previously deselected package monit.
(Reading database ... 79286 files and directories currently installed.)
Unpacking monit (from .../monit_1%3a4.8.1-2.1_i386.deb) ...
Setting up monit (1:4.8.1-2.1) ...
Starting daemon monitor: -e monit won't be started/stopped
        unless it it's configured
        please configure monit and then edit /etc/default/monit
        and set the "startup" variable to 1 in order to allow
        monit to start

Edităm ulterior fișierul /etc/default/monit

startup=1
CHECK_INTERVALS=180

Edităm /etc/monit/monitrc

set alert email@domeniu.ro #adresa de e-mail validă unde se vor trimite notificările
include /etc/monit.d/*

Creem directorul /etc/monit.d și creem câte un fișier de configurare pentru diversele servicii ce urmează să le monitorizăm.

mkdir /etc/monit.d
cd /etc/monit.d/

Iată câtvea exemple:

apache2:

  check process apache2 with pidfile /var/run/apache2.pid
    start program = "/etc/init.d/apache2 start"
    stop program  = "/etc/init.d/apache2 stop"
    if cpu > 60% for 2 cycles then alert
    if cpu > 80% for 5 cycles then restart
    if totalmem > 1.5 GB for 5 cycles then restart
    if children > 50 then restart
    if loadavg(5min) greater than 10 for 8 cycles then stop
    group lamp

bind9:

  check process named with pidfile /var/run/bind/run/named.pid
   start program = "/etc/init.d/bind9 start"
   stop program  = "/etc/init.d/bind9 stop"
   if failed host 127.0.0.1 port 53 type tcp protocol dns then alert
   if failed host 127.0.0.1 port 53 type udp protocol dns then alert
   if 5 restarts within 5 cycles then timeout
   group dns

dovecot:

 check process dovecot with pidfile /var/run/dovecot/master.pid
   group mail
   start program = "/etc/init.d/dovecot start"
   stop  program = "/etc/init.d/dovecot stop"
   if 5 restarts within 5 cycles then timeout
   if failed port 110 type TCP protocol POP then restart
   if failed port 143 type TCP protocol IMAP then restart

mysql:

  check process mysqld with pidfile /var/run/mysqld/mysqld.pid
    start program = "/etc/init.d/mysql start"
    stop program  = "/etc/init.d/mysql stop"
    if cpu > 60% for 2 cycles then alert
    if cpu > 80% for 5 cycles then restart
    if totalmem > 1.0 GB for 5 cycles then restart
    if children > 50 then restart
    if failed host 127.0.0.1 port 3306 protocol mysql then restart
    if 5 restarts within 5 cycles then timeout
    if loadavg(5min) greater than 10 for 8 cycles then stop
    group lamp

postfix:

 check process postfix with pidfile /var/spool/postfix/pid/master.pid
   group mail
   start program = "/etc/init.d/postfix start"
   stop  program = "/etc/init.d/postfix stop"
   if failed port 25 protocol smtp then restart
   if 5 restarts within 5 cycles then timeout

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
   if 5 restarts within 5 cycles then timeout
   group lamp

ssh:

  check process sshd 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
    if 5 restarts within 5 cycles then timeout
    group ssh

webmin:

 check process webmin with pidfile /var/webmin/miniserv.pid
   group webmin
   start program = "/etc/init.d/webmin start"
   stop  program = "/etc/init.d/webmin stop"
   if failed host 127.0.0.1 port 8080 then restart
   if 5 restarts within 5 cycles then timeout
 
 check file webmin_rc with path /etc/init.d/webmin
   group webmin
   if failed checksum then unmonitor
   if failed permission 755 then unmonitor
   if failed uid root then unmonitor
   if failed gid root then unmonitor

În final pornim serviciul de monitorizare

/etc/init.d/monit start
Starting daemon monitor: monit.

8 comentarii la “Monitorizarea și repornirea automată a serviciilor pe un server Linux cu monit

  1. E bun. Il folosesc de ceva vreme pe serverele de hosting. Sistemul de monitorizare din cPanel nu prea ma multumeste. E bun, dar monit il completeaza destul de bine prin posibilitatea de a monitoriza diferiti parametri, cum ar fi incarcarea generala. De vreo jumatate de an am pus pe un server monit care schimba cu renice prioritatea tuturor proceselor apache cand incarcarea serverului e mai mare de 5. Functioneaza impecabil :-)
    .-= Agkelos a scris pe blog ultima dată Conexiune securizata pentru orice aplicatie cu SSH =-.

  2. Vad cum acest program ar fi foarte util in cazul homeuserilor sau serverelor cu putini useri dar nu cred ca ar fi indicat sa se foloseasca pe un server web ce gazduieste de exemplu mii de siteuri. Un restart de apache desi nu ar dura asa mult ar putea cauza multe complainturi. Da, chiar si pentru cateva secunde de down time. In orice caz, m-am uitat si eu sa vad mai multe despre monit si pare foarte util in rest.

  3. @mutari Tocmai din cauză că e foarte flexibil poți să scoți acele opțiuni în care să închidă serverul web sau să mărești timpul, adică dacă e supra-solicitat mai mult de o jumătate de oră de exemplu. Tocmai pe serverele cu trafic mare e indicat să detecezi că serverul web nu rulează și să-l pornești.

    @Agkelos Eu folosesc virtualmin, și acesta are opțiune de repornire automată a serviciilor însă serviciul de colectare a informațiilor consumă foarte multe resurse(verifică prea multe informații, inclusiv că vhost-urile sunt corecte) și atunci nu e fiabil. Monit a venit ca o soluție foarte bună.

  4. am facut exact cum zice in tutorial.. In /etc/default/monit zice sa configurez CHECK_INTERVALS=180 in /etc/monit/monitrc si acolo nu gasesc asa ceva. cand dau sa pornesc zice : Starting daemon monitor: empty config, please edit /etc/monit/monitrc. .. deci ma poate ajuta si pe mine cineva ?

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile necesare sunt marcate *

*

Poți folosi aceste etichete HTML și atribute: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">