Loading... <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span> 上周用monit搭建或者说定制了一个监控系统,来监控服务器发生事情。当然了主要是监控异常,因为我们的产品属于服务器类型,很多进程都daemon,要不停的运行。我们搭建监控目的不过是出现问题能够及时的知道,平时可从web UI上看到整个系统的状况,同时它本身要轻量级,不要影响性能。当然了类似的产品很多了,比如Ganglia,我在老科长波哥曾经搭建过一个Ganglia系统监控科室十几台服务器,让我很是崇拜。本文重点介绍monit。</span><br /> <span> </span><span><img src="//cto.wang/usr/uploads/2016/07/20160703165620-59.png" alt="" width="290" height="172" /></span><br /> <span> monit是一个可以监控系统,进程,文件系统,目录,设备的监控软件,可以自动唤起那些异常退出的进程,还可定制你想监控的东西。同时monit提供了内置的WEB UI的功能,可以一目了然地了解监控项的情况。其中正常项为绿色,异常项为红色,很方便的告警,另外,monit还提供了发邮件通知的功能,对于紧急的异常情况可以发送邮件到指定邮箱。比如发生了coredump,发生了DB corrupt,daemon进程异常重启,可以第一时间邮件通知到管理员,呵呵很强大吧。片汤话我们不多讲,讲讲怎么用monit搭建一个监控系统。</span><br /> <span> monit是一个很轻量级的程序,只需要一个可执行程序monit,一个配置文件monitrc即可工作,当然了我们还是要讲讲安装过程:</span><br /> <span> Ubuntu系统下,安装一如既往的方便:</span> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span> </span> </p> <pre class="prettyprint lang-xml"> sudo agt-get install monit</pre> <p></p> <p> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span> CentOS系统下也是一样</span> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span> </span> </p> <pre class="prettyprint lang-xml">yum install monit</pre> <p></p> <p> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span> 我比较喜欢源码安装,原因是我喜欢看下源码:</span> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span> </span> </p> <pre class="prettyprint lang-xml"> wget http://mmonit.com/monit/dist/monit-5.5.tar.gz tar zxvf monit-5.5.tar.gz cd monit-5.5 ./configure --prefix=/usr make make install</pre> <p></p> <p> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span> 注意configure的时候可能会报错:</span> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span> </span> </p> <pre class="prettyprint lang-xml">checking for pam_start in -lpam... no configure: error: PAM enabled but headers or library not found, install the PAM development support or run configure --without-pam</pre> <p></p> <p> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span> 当然了你可以加上–without-pam这个选项绕过这个问题,这个问题在Ubuntu下的解决办法是:</span> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span> </span> </p> <pre class="prettyprint lang-xml">apt-get install libpam0g-dev</pre> <p></p> <p> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span> 这个问题过后,再次执行./configure又会出现SSL的报错:</span> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span> </span> </p> <pre class="prettyprint lang-xml">checking for SSL library directory... Not found Couldn't find your SSL library files. Use --with-ssl-lib-dir option to fix this problem or disable the SSL support with --without-ssl </pre> <p></p> <p> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span> 解决办法是:</span> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span> </span> </p> <pre class="prettyprint lang-xml">sudo apt-get install libssl-dev</pre> <p></p> <p> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span> 安装了libssl之后,configure仍然报错,原因是它找不到libssl.so,你可以手工搜索libssl.so的位置,然后用 –with-ssl-lib-dir告知configure。</span><br /> <span> 比如在我的ubuntu下:</span> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span> </span> </p> <pre class="prettyprint lang-xml">root@manu:/usr/lib/i386-linux-gnu# find / -name libssl.so /usr/lib/i386-linux-gnu/libssl.so</pre> <p></p> <p> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span> 那么可以执行:</span> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span> </span> </p> <pre class="prettyprint lang-xml">./configure --prefix=/usr --with-ssl-lib-dir=/usr/lib/i386-linux-gnu/</pre> <p></p> <p> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span> OK,configure之后,可以执行make 和 make install 了。make install之后,将源码路径下的配置文件monitrc拷贝到/etc目录下:</span> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span> </span> </p> <pre class="prettyprint lang-xml">mv monitrc /etc/monitrc chown root:root /etc/monitrc chmod 0700 /etc/monitrc</pre> <p></p> <p> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span> 这些事情做好之后,monit就安装完毕了。我们尝试启动monit</span> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span> </span> </p> <pre class="prettyprint lang-xml">root@manu:~/code/c/classical/monit-5.5# monit monit: generated unique Monit id 66c0021758d07ecffedadfa0bf5f768d and stored to '/root/.monit.id' Starting monit daemon with http interface at [localhost:2812]</pre> <p></p> <p> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span> 前文讲过,monit内置了一个http,可以通过browser查看,我们先看下monitrc配置文件的http相关配置: </span> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span> </span> </p> <pre class="prettyprint lang-xml">set httpd port 2812 and use address localhost # only accept connection from localhost allow localhost # allow localhost to connect to the server and allow admin:monit # require user 'admin' with password 'monit' allow @monit # allow users of group 'monit' to connect (rw) allow @users readonly # allow users of group 'users' to connect readonly</pre> <p></p> <p> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span> 这部分内容是http相关的配置,port 2812是端口号,localhost是访问IP,allow localhost表示只允许本机访问,用户名密码是:admin/monit。这不太符合我们的需求,比如我们不可能每次都在服务器上用浏览器查看服务器的状态,这太假了,如果我们有闲情逸致登上服务器,何必要我们的监控系统。我们将此处的配置改为</span> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span> </span> </p> <pre class="prettyprint lang-xml">set httpd port 2812 and use address 10.64.74.99 allow 0.0.0.0/0.0.0.0 allow manu:manu </pre> <p></p> <p> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span> 我们可以用chrome浏览器输入 http://10.64.74.99:2812去查看输出。第三行的意思是我们允许任何机器登录我们UI,访问我们monit的数据,第四行表示登录需要用户名和密码:manu/manu。此时我们的monit监控系统如下所示:</span><br /> <span> <img src="//cto.wang/usr/uploads/2016/07/20160703165620-100.png" alt="" width="700" height="198.816568047" /></span><br /> <span> 此时还比较单薄,啥东西也没有,我们继续讲如何配置monitrc。</span> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span> </span> </p> <pre class="prettyprint lang-xml">set daemon 60</pre> <p></p> <p> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span> 这个比较简单,多久检测一次。我们监控条目有若干,我们不能时时刻刻都做一遍检查,那就成了死循环了,对系统性能损耗太大了。60秒表示每60秒检查一次配置文件里面配置的监控项。这个好理解不多说。 </span> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span> </span> </p> <pre class="prettyprint lang-xml">set logfile /var/log/monit.log</pre> <p></p> <p> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span> 这个配置项表示monit进程本身的log记录在/var/log/monit.log。</span><br /> <span> <img src="//cto.wang/usr/uploads/2016/07/20160703165620-19.png" alt="" width="600" height="91" /></span><br /> <span> 在web UI上也可以查看monit的log。点击monit首页的runnning,</span><br /> <span> <img src="//cto.wang/usr/uploads/2016/07/20160703165620-68.png" alt="" width="400" height="100" /></span><br /> <span>进入</span><span>monit running status页面,</span><span><span>然后点击最右下角的的view log。这个也不多说了。<img src="//cto.wang/usr/uploads/2016/07/20160703165620-100-1.png" alt="" width="700" height="93.6170212766" /></span><br /> <span> <br /> 我们讲述发mail的配置:</span></span> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span><span> </span></span> </p> <pre class="prettyprint lang-xml"> set mailserver xxx.xx.xxx.xxx port 25 with timeout 15 seconds set mail-format { from: BETA_SERVER_128@trend.com subject: monit alert -- $EVENT $SERVICE message: $EVENT Service $SERVICE Date: $DATE Action: $ACTION Host: $HOST Description: $DESCRIPTION Your faithful employee, bean } set alert xxxx@trendmicro.com.cn # receive all alerts 设置收件人</pre> <p></p> <p> </p> <div id="codeText" class="codeText" style="color:#333333;margin:0px;padding:0px;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <div style="margin:0px;padding:0px"> </div> </div> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span><span> 有很多人发不出邮件的关键不在monit程序,而在于没有一个SMTP Server,帮助你转发Mail,用所谓的163 或者google的SMTP Server始终没有成功过。我开始也是发不出Mail,后来有了一个不需要用户名密码的SMTP Server之后,自然就能发出邮件通知了。如何搭建一个SMTP Server这是另外一个话题了,我按下不表。我用的是我们公司内部的一个SMTP Server。收到的Mail如下图所示:</span><br /> <span> <img src="//cto.wang/usr/uploads/2016/07/20160703165620-92.png" alt="" width="700" height="227.963176064" /><br /> <br /> </span><span><span>发Mail问题解决之后,我们就能专注于定制我们自己需要的监控项了。</span></span></p> <p><span>============================华丽的分割线=========================================</span></p> <p></span> </p> <h2> <span><strong><span> </span></strong><strong><span>1 监控进程</span></strong><strong><span> </span></strong><span> </span></span><br /> </h2> <p><span> <span><span> 比如我们服务器上有Apache,我们要监控Apache的情况,如果Apache异常重启,需要Mail通知。</span></span></span></p> <p> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span><span><span> </span></span></span> </p> <pre class="prettyprint lang-xml">check process apache with pidfile /var/run/httpd.pid start program = "/etc/init.d/rcWebServer.sh start https" stop program = "/etc/init.d/rcWebServer.sh stop https" if changed pid then alert</pre> <p></p> <p> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span><span><span> </span><span>所有进程类的监控是一类,以check process abc</span></span><span>打头,其中with pidfile是指进程的PID记录在/var/run/httpd.pid。我们知道apache的PID记录在/var/run/httpd.pid之中,monit通过这个pid文件就可以明白,我们要求它监控那个进程了。</span><br /> <span><span> </span><span>没有PID文件的进程咋办?</span></span><br /> <span><span> </span><span>这是个好问题,毕竟大多数的进程都是没有PID文件的。比如你的进程叫做test_abc,是你通过./test_abc叫起的进程,</span></span><span>如何告诉monit我要监控这个进程。monit提供了新的方法。MATCHING,就是进程cmdline匹配到了test_abc,我就监控这个进程,监控项叫test_abc</span><span> </span></span> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span><span> </span></span> </p> <pre class="prettyprint lang-xml">check process test_abc with MATCHING test_abc if changed pid then alert</pre> <p></p> <p> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span><span> <span> 我们新增了监控进程,看下WEB UI的变化:</span></span><br /> <span> <img src="//cto.wang/usr/uploads/2016/07/20160703165621-34.png" alt="" width="700" height="49" /></span><br /> <span> 点击apache,可以看详细情形,这里就不赘述了。</span><br /> <span> </span><strong> </strong><br /> </span> </p> <h2> <span><strong><span> 2</span></strong><strong><span> 监控文件系统或者监控设备<br /> </span></strong></span><br /> </h2> <p><span><strong><span> </span></strong><span>我们一般有存放数据的分区,也有存放日志的分区,如果日志分区使用空间到了90%,我们认为这是出了问题了,我们要注意这种事件的发生:</span></span></p> <p> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span><span> </span></span> </p> <pre class="prettyprint lang-xml">check device VAR_LOG with path /var/log if space usage > 85% then alert check filesystem tmpfs with path /var if space usage > 80% then alert</pre> <p></p> <p> </p> <div id="codeText" class="codeText" style="color:#333333;margin:0px;padding:0px;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <div style="margin:0px;padding:0px"> </div> </div> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span><span> <span> 上述语句表明tmpfs 挂载在/var目录下,如果空间使用了80%,表明出现了异常,需要发mail通知到管理员。</span><br /> <span> </span></span><span>新增了文件系统监控项后,UI上会增加如下显示:</span><br /> <span> <img src="//cto.wang/usr/uploads/2016/07/20160703165621-58.png" alt="" width="700" height="54" /></span><br /> <span> 点击tmpfs 或者VAR_LOG可以进入二层页面看下文件系统的详细信息,我也不赘述了。<br /> </span><span><br /> </span></span> </p> <h2> <span><span> </span><strong><span> 3 </span></strong><strong><span>监控文件 <br /> <span> </span></span></strong></span><br /> </h2> <p><span><strong><span> <span> </span></span></strong><span>monit也可监控某个文件,监控文件的属性,比如我们的文件permission 是700,如果发生变化则发邮件通知:</span></span></p> <p> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span><span> </span></span> </p> <pre class="prettyprint lang-xml">check file monit_target with path /var/log/monit_target if failed permission 700 then alert if size > 1000 MB then exec "/usr/local/bin/rotate /var/log/monit_target</pre> <p></p> <p> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span> 假如我们关注的事情发生了,我们需要执行自己的脚本,可以用 then exec “your_action”的方式处理。<br /> <span> </span><strong><span> <br /> </span></strong></span> </p> <h2> <span><strong><span> 4 </span></strong><strong><span>监控program<br /> <span> </span></span></strong></span><br /> </h2> <p><span><strong><span> <span> </span></span></strong><span>有很多的情况,不好归类,比如,我的系统里面如果产生coredump,我希望可以检测到,同时在WEB UI上显示并且给我发Mail。我可以自己写个查看有没有coredump的脚本,告诉monit系统,我期待的结果,如果执行脚本与我期待的结果不同,那么表示本监控项出了异常</span></span></p> <p> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span><span> </span></span> </p> <pre class="prettyprint lang-xml">check program COREDUMP_EXIST with path "/var/log/tool/coredump_exist.sh" if status != 0 then alert #告诉monit 我们期待结果是0 ,如果返回值不是 0 ,那么表示出了异常 #!/bin/sh corefile_num=`ls /home/manu/core/core* 2>/dev/null| wc -l` if [ $corefile_num -eq 0 ] then exit 0 else exit 1 fi</pre> <p></p> <p> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span> 我们前面一直没提到,如果监控项为异常,WEB UI该项为红色,否则,该项为绿色。我们现在看下监控program之COREDUMP_EXIST:<br /> <img src="//cto.wang/usr/uploads/2016/07/20160703165621-71.png" alt="" width="700" height="54" /><br /> 因为我们有coredump文件,所以该项为红色。</p> <p></span> </p> <h2> <span><strong><span> 5</span></strong><strong><span> </span></strong><strong><span>监控主机 </span></strong><strong><span> </span></strong></span><br /> </h2> <p><span><span> 我们还可以监控其他host,比如我们可见ping某台host,如果多次没有回应,那么邮件通知我</span></span></p> <p> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span><span> </span></span> </p> <pre class="prettyprint lang-xml">check host my_brother with address XX.XX.XX.XX if failed icmp type echo count 3 with timeout 3 seconds then alert</pre> <p></p> <p> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span><strong><span> <span> </span></span></strong><span>介绍了很多</span><span>用法,但是挂一漏万,终极的学习方法还是看手册 </span><span>http://mmonit.com/monit/documentation/monit.html#connection_testing</span><span>。这个基本介绍的很详细,我遇到的一些问题,也是从这里找的答案。</span></span> </p> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span><span><br /> </span></span> </p> <h2 style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span><span>原文链接:http://www.haodaima.net/art/2648169</span></span><br /> </h2> <p style="color:#333333;font-family:Arial, 宋体, sans-serif;font-size:16px;background-color:#FFFFFF"> <span><span></span></span></p> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信