Monitorowanie pracy kluczowych usług serwera przy wykorzystaniu pakietu Monit
Jak monitorować poprawność pracy kluczowych usług serwera (sshd, Bind, syslog, postfix, courier-imap, mysql, apache, vsftpd, MRTG, clamd, amavisd, vixie-cron) przy użyciu pakietu Monit.
Każdy administrator lubi mieć świadomość tego w jakim stanie znajdują się jego serwery. Kiedy liczba tych serwerów rośnie monitorowanie ich pracy staje się nieco męczącym zadaniem. Na szczęście nie na Linuksie. Mamy przecież wiele usług, które mogą zając się monitowaniem serwera i informowaniem administratora o potencjalnych problemach. Na moich serwerach typu LAMP wykorzystuje pakiet nazwany Monit, który pomaga mi utrzymywać moje serwery we właściwym stanie. Monit może monitorować obciążenie serwera i informować administratora kiedy staję się ono zbyt wielkie. Monit posiada także możliwość monitorowania kluczowych usług serwera i restartowania ich jeśli są one przeciążone lub kiedy z jakiegoś powodu ulegną awarii. Monit jest świetnym zabezpieczeniem na wypadek awarii.
Postaram się tutaj podzielić konfiguracją pakietu Monit pochodzącą z moich serwerów LAMP i serwerów pocztowych, mając nadzieję, że ktoś uzna te informacje za użyteczne. Zamieszczona tutaj konfiguracja Monita powinna dać się zastosować do dowolnej dystrybucji Linuksa ale instrukcje instalacji są specyficzne dla Gentoo Linuksa, które używam na swoich serwerach.
Pierwszą rzeczą jaką należy zrobić to zainstalować Monita na naszym serwerze. W Gentoo Linuksie możemy to zrobić w nasŧepujący sposób:
emerge -av app-admin/monit
Konfiguracja Monita jest niezwykle prosta, zabiera ona nie więcej niż 15 minut czasu. Monit pozwoli nam monitorować cały serwer i wybrane jego usługi. Twoja konfiguracja Monita powinna odzwierciedlać listę usług pracujących na twoim serwerze. Na moich serwerach typu LAMP używam ssh, serwra DNS Bind, serwera bazy danych MySQL, serwera WWW Apache, serwera FTP Vsftpd i serwera systemu kontroli wersji Subversion. Na moich serwerach pocztowych dodatkowo używam serwerów pocztowych Postfix i Courier-Imap, antywirusa Clam i programu sprawdzającego zawartość Amavisd. Wykorzystuję także Monit dodatkowo do monitorowania demonów Syslog-Ng, MRTG i Vixie-cron. Aby stworzyć konfigurację Monita w Gentoo Linuksie musisz poddać edycji plik /etc/monitrc. Możesz także stworzyć katalog nazwany /etc/monit.d i przechowywać w nim pliki z osobną konfiguracją Monita. Tak naprawdę tego typu konfiguracja jest domyślna dla wielu dystrybucji. Jeśli chcesz w ten sposób zarządzać konfiguracją upewnij się, że odkomentujesz następującą sekcję w pliku /etc/monitrc.
############################################################################### ## Includes ############################################################################### ## ## It is possible to include additional configuration parts from other files or ## directories. # # include /etc/monit.d/* # #
Ja zachowam konfigurację w jednym pliku. Poniżej znajdziesz najważniejsze elementy konfiguracji Monita pochodzące z obu typów serwerów. Ten przykładowy plik jest połączeniem co najmniej kilku plików pochodzących z różnych serwerów których używam:
############################################################################### ## Global section ############################################################################### ## ## Start Monit in the background (run as a daemon): # set daemon 300 # check services at 5-minute intervals with start delay 600 # optional: delay the first check by 10-minutes ## Set syslog logging with the 'daemon' facility. If the FACILITY option is ## omitted, monit will use 'user' facility by default. If you want to log to ## a stand alone log file instead, specify the path to a log file # set logfile syslog facility log_daemon ### Set the location of the Monit id file which stores the unique id for the ### Monit instance. The id is generated and stored on first Monit start. By ### default the file is placed in $HOME/.monit.id. # set idfile /var/monit/.monit.id ### Set the location of monit state file which saves the monitoring state ### on each cycle. By default the file is placed in $HOME/.monit.state. If ### state file is stored on persistent filesystem, monit will recover the ### monitoring state across reboots. If it is on temporary filesystem, the ### state will be lost on reboot. # set statefile /var/monit/.monit.state # Set the list of mail servers for alert delivery. Multiple servers may be ## specified using comma separator. By default monit uses port 25 - this ## is possible to override with the PORT option. # set mailserver primary_mail_server_address, # primary mailserver secondary_mail_server_address # fallback relay ## By default monit will drop alert events if no mail servers are available. ## If you want to keep the alerts for a later delivery retry, you can use the ## EVENTQUEUE statement. The base directory where undelivered alerts will be ## stored is specified by the BASEDIR option. You can limit the maximal queue ## size using the SLOTS option (if omitted, the queue is limited by space ## available in the back end filesystem). # set eventqueue basedir /var/monit # set the base directory where events will be stored slots 100 # optionaly limit the queue size ## You can set alert recipients whom will receive alerts if/when a ## service defined in this file has errors. Alerts may be restricted on ## events by using a filter as in the second example below. # set alert my_email@adress.org # receive all alerts ## Monit has an embedded web server which can be used to view status of ## services monitored and manage services from a web interface. See the ## Monit Wiki if you want to enable SSL for the web server. # set httpd port monit_web_port and allow login:password SSL ENABLE PEMFILE /etc/ssl/apache2/certifcate.pem CLIENTPEMFILE /var/certs/monit-client.pem ############################################################################### ## Services ############################################################################### ## ## 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 localhost if loadavg (1min) > 4 then alert if loadavg (5min) > 2 then alert if memory usage > 75% then alert if cpu usage (user) > 70% then alert if cpu usage (system) > 30% then alert if cpu usage (wait) > 20% then alert ################################################### ##Check ssh ################################################### check process sshd with pidfile /var/run/sshd.pid group system start program "/etc/init.d/sshd start" stop program "/etc/init.d/sshd stop" if failed port 22 protocol ssh then restart if 5 restarts within 5 cycles then timeout ################################################### #Check Bind ################################################### check process named with pidfile /chroot/dns/var/run/named/named.pid group dns start program = "/etc/init.d/named start" stop program = "/etc/init.d/named stop" if failed host 127.0.0.1 port 53 type tcp then restart if failed host 127.0.0.1 port 53 type udp then restart if 5 restarts within 5 cycles then timeout ################################################### #Check syslog-ng ################################################### check process syslog-ng with pidfile /var/run/syslog-ng.pid group system start program = "/etc/init.d/syslog-ng start" stop program = "/etc/init.d/syslog-ng stop" if 5 restarts within 5 cycles then timeout ################################################## #Check Vixie-cron ################################################## check process cron with pidfile /var/run/cron.pid group system start program = "/etc/init.d/vixie-cron start" stop program = "/etc/init.d/vixie-cron stop" if 5 restarts within 5 cycles then timeout ################################################## #Check postfix ################################################## 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 cpu > 40% for 2 cycles then alert if cpu > 60% for 5 cycles then restart if totalmem > 512 MB then restart if failed port 25 protocol smtp then restart if 5 restarts within 5 cycles then timeout ################################################## #Check POP3 ################################################## check process pop3 with pidfile /var/run/pop3d.pid group mail start program = "/etc/init.d/courier-pop3d start" stop program = "/etc/init.d/courier-pop3d stop" if failed port 110 then restart if 5 restarts within 5 cycles then timeout ################################################## #Check POP3-SSL ################################################## check process pop3-ssl with pidfile /var/run/pop3d-ssl.pid group mail start program = "/etc/init.d/courier-pop3d-ssl start" stop program = "/etc/init.d/courier-pop3d-ssl stop" if failed host localhost port 995 type tcpssl sslauto protocol pop then restart if 5 restarts within 5 cycles then timeout ################################################## #Check IMAP ################################################## check process imap-ssl with pidfile /var/run/imapd.pid group mail start program = "/etc/init.d/courier-imap start" stop program = "/etc/init.d/courier-imap stop" if failed host localhost port 143 protocol imap then restart if 5 restarts within 5 cycles then timeout ################################################## #Check IMAP SSL ################################################## check process imap-ssl with pidfile /var/run/imapd.pid group mail start program = "/etc/init.d/courier-imapd-ssl start" stop program = "/etc/init.d/courier-imapd-ssl stop" if failed host localhost port 993 type tcpssl sslauto protocol imap then restart if 5 restarts within 5 cycles then timeout ################################################## #Courier-Authlib ################################################## check process saslauthd with pidfile /var/run/authdaemon.pid group mail start program = "/etc/init.d/courier-authlib start" stop program = "/etc/init.d/courier-authlib stop" if 5 restarts within 5 cycles then timeout ################################################## #SASL Auth Deamon ################################################## check process saslauthd with pidfile /var/lib/sasl2/saslauthd.pid group mail depends on postfix start program = "/etc/init.d/saslauthd start" stop program = "/etc/init.d/saslauthd stop" if 5 restarts within 5 cycles then timeout ################################################## #Amavisd-new ################################################## check process amavisd with pidfile /var/amavis/amavisd.pid group mail start program = "/etc/init.d/amavisd start" stop program = "/etc/init.d/amavisd stop" if cpu > 40% for 2 cycles then alert if cpu > 60% for 5 cycles then restart if failed unixsocket /var/amavis/amavis.sock then restart if failed port 10024 then restart if 5 restarts within 5 cycles then timeout ################################################## #CLAM Antivirus ################################################## check process clamd with pidfile /var/run/clamav/clamd.pid group virus start program = "/etc/init.d/clamd start" stop program = "/etc/init.d/clamd stop" if cpu > 40% for 2 cycles then alert if cpu > 60% for 5 cycles then restart if failed unixsocket /var/run/clamav/clamd.sock then restart if 5 restarts within 5 cycles then timeout ################################################### #Check svnserve ################################################### check process svnserve with pidfile /var/run/svnserve.pid start program = "/etc/init.d/svnserve start" stop program = "/etc/init.d/svnserve stop" if failed host localhost port SVNSERVE_PORT then restart if 5 restarts within 5 cycles then timeout ################################################### #Check mysql ################################################### check process mysql with pidfile /var/run/mysqld/mysqld.pid group database start program = "/etc/init.d/mysql start" stop program = "/etc/init.d/mysql stop" if failed unix "/var/run/mysqld/mysqld.sock" then restart if 5 restarts within 5 cycles then timeout ################################################### #Check MRTG ################################################### check process mrtg with pidfile /var/run/mrtg.pid group monitoring start program = "/etc/init.d/mrtg start" stop program = "/etc/init.d/mrtg stop" if 5 restarts within 5 cycles then timeout ################################################### #Check apache2 ################################################### check process apache with pidfile /var/run/apache2.pid group www start program = "/etc/init.d/apache2 start" stop program = "/etc/init.d/apache2 stop" if failed host www.web_app_address.org port 80 protocol http and request "/monit/hello" then restart if failed host 127.0.0.1 port 80 protocol apache-status loglimit > 60% then restart if cpu > 60% for 2 cycles then alert if cpu > 80% for 5 cycles then restart if totalmem > 1024 MB for 2 cycles then alert if totalmem > 2048 MB for 5 cycles then restart if children > 500 then restart if loadavg(15min) 10 for 8 cycles then restart if 5 restarts within 5 cycles then timeout ################################################### #Check vsftpd ################################################### check process vsftpd with pidfile /var/run/vsftpd.pid group ftp start program = "/etc/init.d/vsftpd start" stop program = "/etc/init.d/vsftpd stop" if failed port 2122 protocol ftp then restart if 5 restarts within 5 cycles then timeout
Postaram się pokrótce wyjaśnić tę konfigurację. Pierwsza część pliku definiuje ogólną konfigurację usługi Monit. Wszystkie zdefiniowane zdarzenia monitorujące będą wykonywane w 5 minutowych odstępach, pierwsze sprawdzenie zostanie wykonane 10 minut po starcie usługi. Kolejną ważną rzeczą jest konfiguracja serwerów pocztowych. Jak widzisz zdefiniowałem zarówno serwer podstawowy jak i zapasowy. Nie jest dobrym pomysłem poleganie tylko na lokalnym serwerze pocztowym, jako że najprawdopodobniej będziesz monitorował poprawność jego pracy przy użyciu Monita. Upewnij się, że serwer zapasowy będzie miał możliwość przekazywania poczty przychodzącej z serwera, na którym pracuje Monit. Następne linie definiują kolejkę zdarzeń EVENTQUEUE, która będzie użyta do przechowywania zdarzeń Monita jeśli oba serwery pocztowe nie będą dostępne. Kolejną rzeczą jaką możesz dostrzec w pliku konfiguracyjnym jest definicja adresu odbiorczego. Ja używam jednego adresu ale Monit pozwala na bardzo zaawansowaną definicję odbiorców powiadomień. Na przykład można wysyłać maila do różnych odbiorców na podstawie typu zdarzenia. Monit posiada wbudowany serwer WWW. Moja konfiguracja pozwala na połączenia z tym serwerem oparte na zdefiniowanych nazwie użytkownika username i haśle password. Połączenie WWW będzie wymagało protokołu SSL na podanym numerze portu i dostęp będzie dozwolony tylko z przeglądarek posiadających odpowiedni certyfikat dostępu. Upewnij się, że otworzysz wymieniony port serwera WWW w firewallu dla połączeń TCP.
Najważniejszą częścią jest sekcja konfiguracji usług. Najpierw zdefiniowałem monitorowanie obciążenia serwera. Jak widzisz większość linii konfiguracyjnych mówi sama za siebie. Kolejna część to część definiująca monitorowanie poszczególnych usług. Każda z usług jest monitorowana przy użyciu pliku pid, następnie definiowane są komendy uruchomienia i zatrzymania usługi. Jak możesz zauważyć jeśli coś pójdzie nie tak Monit postara się zrestartować usługi 5 razy w ciągu 5 cykli, zanim założy, że nie można tego zrobić. Dla niektórych usług (ssh, Bind, postfix, pop3, pop3-ssl, imap, imap-ssl, amavisd, svnserve, vsftpd) wykorzystuję monitorowanie połączenia sieciowego dla innych (amavisd, clamd, mysql) wykorzystuję monitorowanie gniazda Uniksowego. Dodatkowo dla kluczowych usług (postfix, amavisd, apache2, clamd) mogących powodować duże obciążenie serwera stosuje monitorowanie ich obciążenia. Najpierw generowany jest alert, który zmusi Monita do wysłania mi maila i jeśli obciążenia wzrośnie Monit zrestartuje usługę. Najbardziej rozbudowaną definicję stworzyłem dla usługi Apache. Uwielbiam Monit za możliwość monitorowania pracy serwera WWW opartą na generowaniu odwołań do konkretnej aplikacji WWW.
Po stworzeniu konfiguracji Monita trzeba dodać usługę monit do domyślnego poziomu uruchamiania twojej dystrybucji. W Gentoo Linuksie posługujemy się w tym celu skryptem rc-update w następujący sposób:
rc-update add monit defualt
Następnie należy uruchomić usługę monit:
/etc/init.d/monit start
Jeśli napotkasz problemy i usługa nie będzię chciała się uruchomić, najprawdopodobniej popełniłeś błędy w pliku konfiguracyjnym. Najprostszą metodą aby znaleźć bląd jest wykonanie następującej komendy w shellu:
monit status
Przekonałem się, że zwraca ona szczegółowe informacje na temat błędów twojej konfiguracji.
Monit to niezwykle użyteczne narzędzie. Moja konfiguracja wykorzystuje jedynie część dostępnych opcji. Na przykład możesz dodatkowo monitorować pliki init i pliki wykonywalne usług wykorzystując ich sumy kontrolne. Nie korzystam z tego gdyż mam system wykrywania ataków AIDE, który zajmuje się przeprowadzaniem tego typu walidacji. Poniżej możesz zobaczyć zrzut ekranu interfejsu WWW Monita pochodzący z jednego z moich serwerów.
Przy użyciu interfejsu WWW możesz wyświetlać szczegółowe informacje na temat poszczególnych usług i uruchomić, zatrzymać lub wyłączyć ich monitorowanie. Poniżej możesz zobaczyć zrzut ekranu pokazujący interfejs monitorowania pojedynczej usługi.
Jeśli chciałbyś wykorzystać część z tej konfiguracji w innej dystrybucji niż Gentoo Linux upewnij się, że sprawdzisz poprawność nazw plików init a także położenie i nazwy gniazd i plików pid. Tego typu rzeczy mogą wyglądać nieco inaczej niż w Gentoo.
Źródła:
- Dokumentacja Monita
- man monit
GNU Free Documentation License or Creative Commons Share Alike
Jeśli znalazłeś jakieś błędy w powyższej informacji lub po prostu chcesz wypowiedzieć swoje zdanie na jej temat, będę wdzięczny za pozostawienie komentarza.
Wszystkie komentarze będą pokazywać się na stronie po tym jak zostaną zatwierdzone. Przepraszam za to ale chcę mieć pewność, że moja strona będzie wolna od obraźliwych lub wulgarnych treści. Nie mam nic przeciwko krytyce ale zrób to właściwie dobierając słowa.
Trwa przetwarzanie komentarza.