18 sierpień 2010
Wydrukuj tę stronę

Monitorowanie pracy kluczowych usług serwera przy wykorzystaniu pakietu Monit

Kategorie:  Server  Monitoring  Linux  Gentoo

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:

View the monitrc configuration file
  1. ###############################################################################
  2. ## Global section
  3. ###############################################################################
  4. ##
  5. ## Start Monit in the background (run as a daemon):
  6. #
  7. set daemon 300 # check services at 5-minute intervals
  8. with start delay 600 # optional: delay the first check by 10-minutes
  9. ## Set syslog logging with the 'daemon' facility. If the FACILITY option is
  10. ## omitted, monit will use 'user' facility by default. If you want to log to
  11. ## a stand alone log file instead, specify the path to a log file
  12. #
  13. set logfile syslog facility log_daemon
  14. ### Set the location of the Monit id file which stores the unique id for the
  15. ### Monit instance. The id is generated and stored on first Monit start. By
  16. ### default the file is placed in $HOME/.monit.id.
  17. #
  18. set idfile /var/monit/.monit.id
  19. ### Set the location of monit state file which saves the monitoring state
  20. ### on each cycle. By default the file is placed in $HOME/.monit.state. If
  21. ### state file is stored on persistent filesystem, monit will recover the
  22. ### monitoring state across reboots. If it is on temporary filesystem, the
  23. ### state will be lost on reboot.
  24. #
  25. set statefile /var/monit/.monit.state
  26. # Set the list of mail servers for alert delivery. Multiple servers may be
  27. ## specified using comma separator. By default monit uses port 25 - this
  28. ## is possible to override with the PORT option.
  29. #
  30. set mailserver primary_mail_server_address, # primary mailserver
  31. secondary_mail_server_address # fallback relay
  32. ## By default monit will drop alert events if no mail servers are available.
  33. ## If you want to keep the alerts for a later delivery retry, you can use the
  34. ## EVENTQUEUE statement. The base directory where undelivered alerts will be
  35. ## stored is specified by the BASEDIR option. You can limit the maximal queue
  36. ## size using the SLOTS option (if omitted, the queue is limited by space
  37. ## available in the back end filesystem).
  38. #
  39. set eventqueue
  40. basedir /var/monit # set the base directory where events will be stored
  41. slots 100 # optionaly limit the queue size
  42. ## You can set alert recipients whom will receive alerts if/when a
  43. ## service defined in this file has errors. Alerts may be restricted on
  44. ## events by using a filter as in the second example below.
  45. #
  46. set alert my_email@adress.org # receive all alerts
  47. ## Monit has an embedded web server which can be used to view status of
  48. ## services monitored and manage services from a web interface. See the
  49. ## Monit Wiki if you want to enable SSL for the web server.
  50. #
  51. set httpd port monit_web_port and
  52. allow login:password
  53. SSL ENABLE
  54. PEMFILE /etc/ssl/apache2/certifcate.pem
  55. CLIENTPEMFILE /var/certs/monit-client.pem
  56. ###############################################################################
  57. ## Services
  58. ###############################################################################
  59. ##
  60. ## Check general system resources such as load average, cpu and memory
  61. ## usage. Each test specifies a resource, conditions and the action to be
  62. ## performed should a test fail.
  63. #
  64. check system localhost
  65. if loadavg (1min) > 4 then alert
  66. if loadavg (5min) > 2 then alert
  67. if memory usage > 75% then alert
  68. if cpu usage (user) > 70% then alert
  69. if cpu usage (system) > 30% then alert
  70. if cpu usage (wait) > 20% then alert
  71.  
  72. ###################################################
  73. ##Check ssh
  74. ###################################################
  75.  
  76. check process sshd with pidfile /var/run/sshd.pid
  77. group system
  78. start program "/etc/init.d/sshd start"
  79. stop program "/etc/init.d/sshd stop"
  80. if failed port 22 protocol ssh then restart
  81. if 5 restarts within 5 cycles then timeout
  82.  
  83. ###################################################
  84. #Check Bind
  85. ###################################################
  86.  
  87. check process named with pidfile /chroot/dns/var/run/named/named.pid
  88. group dns
  89. start program = "/etc/init.d/named start"
  90. stop program = "/etc/init.d/named stop"
  91. if failed host 127.0.0.1 port 53 type tcp then restart
  92. if failed host 127.0.0.1 port 53 type udp then restart
  93. if 5 restarts within 5 cycles then timeout
  94.  
  95. ###################################################
  96. #Check syslog-ng
  97. ###################################################
  98.  
  99. check process syslog-ng with pidfile /var/run/syslog-ng.pid
  100. group system
  101. start program = "/etc/init.d/syslog-ng start"
  102. stop program = "/etc/init.d/syslog-ng stop"
  103. if 5 restarts within 5 cycles then timeout
  104.  
  105. ##################################################
  106. #Check Vixie-cron
  107. ##################################################
  108.  
  109. check process cron with pidfile /var/run/cron.pid
  110. group system
  111. start program = "/etc/init.d/vixie-cron start"
  112. stop program = "/etc/init.d/vixie-cron stop"
  113. if 5 restarts within 5 cycles then timeout
  114.  
  115. ##################################################
  116. #Check postfix
  117. ##################################################
  118.  
  119. check process postfix with pidfile /var/spool/postfix/pid/master.pid
  120. start program = "/etc/init.d/postfix start"
  121. stop program = "/etc/init.d/postfix stop"
  122. if cpu > 40% for 2 cycles then alert
  123. if cpu > 60% for 5 cycles then restart
  124. if totalmem > 512 MB then restart
  125. if failed port 25 protocol smtp then restart
  126. if 5 restarts within 5 cycles then timeout
  127.  
  128. ##################################################
  129. #Check POP3
  130. ##################################################
  131.  
  132. check process pop3 with pidfile /var/run/pop3d.pid
  133. group mail
  134. start program = "/etc/init.d/courier-pop3d start"
  135. stop program = "/etc/init.d/courier-pop3d stop"
  136. if failed port 110 then restart
  137. if 5 restarts within 5 cycles then timeout
  138.  
  139. ##################################################
  140. #Check POP3-SSL
  141. ##################################################
  142.  
  143. check process pop3-ssl with pidfile /var/run/pop3d-ssl.pid
  144. group mail
  145. start program = "/etc/init.d/courier-pop3d-ssl start"
  146. stop program = "/etc/init.d/courier-pop3d-ssl stop"
  147. if failed host localhost port 995 type tcpssl sslauto protocol pop then restart
  148. if 5 restarts within 5 cycles then timeout
  149.  
  150. ##################################################
  151. #Check IMAP
  152. ##################################################
  153.  
  154. check process imap-ssl with pidfile /var/run/imapd.pid
  155. group mail
  156. start program = "/etc/init.d/courier-imap start"
  157. stop program = "/etc/init.d/courier-imap stop"
  158. if failed host localhost port 143 protocol imap then restart
  159. if 5 restarts within 5 cycles then timeout
  160.  
  161. ##################################################
  162. #Check IMAP SSL
  163. ##################################################
  164.  
  165. check process imap-ssl with pidfile /var/run/imapd.pid
  166. group mail
  167. start program = "/etc/init.d/courier-imapd-ssl start"
  168. stop program = "/etc/init.d/courier-imapd-ssl stop"
  169. if failed host localhost port 993 type tcpssl sslauto protocol imap then restart
  170. if 5 restarts within 5 cycles then timeout
  171.  
  172. ##################################################
  173. #Courier-Authlib
  174. ##################################################
  175.  
  176. check process saslauthd with pidfile /var/run/authdaemon.pid
  177. group mail
  178. start program = "/etc/init.d/courier-authlib start"
  179. stop program = "/etc/init.d/courier-authlib stop"
  180. if 5 restarts within 5 cycles then timeout
  181.  
  182. ##################################################
  183. #SASL Auth Deamon
  184. ##################################################
  185.  
  186. check process saslauthd with pidfile /var/lib/sasl2/saslauthd.pid
  187. group mail
  188. depends on postfix
  189. start program = "/etc/init.d/saslauthd start"
  190. stop program = "/etc/init.d/saslauthd stop"
  191. if 5 restarts within 5 cycles then timeout
  192.  
  193. ##################################################
  194. #Amavisd-new
  195. ##################################################
  196.  
  197. check process amavisd with pidfile /var/amavis/amavisd.pid
  198. group mail
  199. start program = "/etc/init.d/amavisd start"
  200. stop program = "/etc/init.d/amavisd stop"
  201. if cpu > 40% for 2 cycles then alert
  202. if cpu > 60% for 5 cycles then restart
  203. if failed unixsocket /var/amavis/amavis.sock then restart
  204. if failed port 10024 then restart
  205. if 5 restarts within 5 cycles then timeout
  206.  
  207. ##################################################
  208. #CLAM Antivirus
  209. ##################################################
  210.  
  211. check process clamd with pidfile /var/run/clamav/clamd.pid
  212. group virus
  213. start program = "/etc/init.d/clamd start"
  214. stop program = "/etc/init.d/clamd stop"
  215. if cpu > 40% for 2 cycles then alert
  216. if cpu > 60% for 5 cycles then restart
  217. if failed unixsocket /var/run/clamav/clamd.sock then restart
  218. if 5 restarts within 5 cycles then timeout
  219.  
  220. ###################################################
  221. #Check svnserve
  222. ###################################################
  223.  
  224. check process svnserve with pidfile /var/run/svnserve.pid
  225. start program = "/etc/init.d/svnserve start"
  226. stop program = "/etc/init.d/svnserve stop"
  227. if failed host localhost port SVNSERVE_PORT then restart
  228. if 5 restarts within 5 cycles then timeout
  229.  
  230. ###################################################
  231. #Check mysql
  232. ###################################################
  233.  
  234. check process mysql with pidfile /var/run/mysqld/mysqld.pid
  235. group database
  236. start program = "/etc/init.d/mysql start"
  237. stop program = "/etc/init.d/mysql stop"
  238. if failed unix "/var/run/mysqld/mysqld.sock" then restart
  239. if 5 restarts within 5 cycles then timeout
  240.  
  241. ###################################################
  242. #Check MRTG
  243. ###################################################
  244.  
  245. check process mrtg with pidfile /var/run/mrtg.pid
  246. group monitoring
  247. start program = "/etc/init.d/mrtg start"
  248. stop program = "/etc/init.d/mrtg stop"
  249. if 5 restarts within 5 cycles then timeout
  250.  
  251. ###################################################
  252. #Check apache2
  253. ###################################################
  254.  
  255. check process apache with pidfile /var/run/apache2.pid
  256. group www
  257. start program = "/etc/init.d/apache2 start"
  258. stop program = "/etc/init.d/apache2 stop"
  259. if failed host www.web_app_address.org port 80
  260. protocol http and request "/monit/hello"
  261. then restart
  262. if failed host 127.0.0.1 port 80
  263. protocol apache-status loglimit > 60%
  264. then restart
  265. if cpu > 60% for 2 cycles then alert
  266. if cpu > 80% for 5 cycles then restart
  267. if totalmem > 1024 MB for 2 cycles then alert
  268. if totalmem > 2048 MB for 5 cycles then restart
  269. if children > 500 then restart
  270. if loadavg(15min) 10 for 8 cycles then restart
  271. if 5 restarts within 5 cycles then timeout
  272.  
  273. ###################################################
  274. #Check vsftpd
  275. ###################################################
  276.  
  277. check process vsftpd with pidfile /var/run/vsftpd.pid
  278. group ftp
  279. start program = "/etc/init.d/vsftpd start"
  280. stop program = "/etc/init.d/vsftpd stop"
  281. if failed port 2122 protocol ftp then restart
  282. 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.

Monit Web

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.

Monit Service Web

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:




Komentarze

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.

Pozostaw komentarz