如何借助Monit搭建服務(wù)器監(jiān)控系統(tǒng)?
譯文許多Linux管理員依賴一種集中式遠(yuǎn)程監(jiān)控系統(tǒng)(比如Nagios或Cacti),檢查網(wǎng)絡(luò)基礎(chǔ)設(shè)施的健康狀況。雖然集中式監(jiān)控系統(tǒng)為管理員在處理許多主機(jī)和設(shè)備時(shí)簡(jiǎn)化了工作,但專(zhuān)用的監(jiān)控設(shè)備顯然成了單一故障點(diǎn);要是監(jiān)控設(shè)備出現(xiàn)故障或者由于其他原因(比如硬件壞掉或網(wǎng)絡(luò)停運(yùn))而聯(lián)系不上,你就失去了可見(jiàn)性,無(wú)法了解整個(gè)基礎(chǔ)設(shè)施的狀況。
想為監(jiān)控系統(tǒng)增添冗余機(jī)制,一個(gè)辦法就是起碼在網(wǎng)絡(luò)上任何關(guān)鍵/核心服務(wù)器上安裝獨(dú)立的監(jiān)控軟件(作為一條退路)。那樣萬(wàn)一集中式監(jiān)控系統(tǒng)壞掉,你仍能夠通過(guò)備用的監(jiān)控工具,保持可見(jiàn)性,了解核心服務(wù)器的狀況。
Monit簡(jiǎn)介
Monit是一種跨平臺(tái)的開(kāi)源工具,可用于監(jiān)控Unix/Linux系統(tǒng)(比如Linux、BSD、OSX和Solaris)。Monit安裝起來(lái)極其容易,也非常輕型(大小只有500KB),并不需要任何第三方程序、插件或代碼庫(kù)。不過(guò),Monit有助于提供成熟的監(jiān)控功能,具有進(jìn)程狀態(tài)監(jiān)控、文件系統(tǒng)變化監(jiān)控、電子郵件通知、針對(duì)核心服務(wù)的可定制操作等功能。Monit集安裝簡(jiǎn)易、輕量級(jí)實(shí)現(xiàn)和功能強(qiáng)大等優(yōu)點(diǎn)于一身,因而是一款再理想不過(guò)的備用監(jiān)控工具。
好幾年來(lái)我一直在多個(gè)主機(jī)上使用Monit,對(duì)它一貫以來(lái)的可靠表現(xiàn)非常滿意。即使作為一款成熟的監(jiān)控系統(tǒng),Monit對(duì)任何Linux管理員來(lái)說(shuō)也非常實(shí)用、非常強(qiáng)大。我在本教程中將演示如何在本地服務(wù)器上搭建Monit(作為備用監(jiān)控工具),以監(jiān)控常見(jiàn)服務(wù)。該系統(tǒng)搭建起來(lái)后,我將僅僅介紹Monit強(qiáng)大功能的皮毛。
將Monit安裝到Linux上
大多數(shù)Linux發(fā)行版已經(jīng)在其軟件庫(kù)中含有Monit。
在Debian、Ubuntu或Linux Mint上:
$ sudo aptitude install monit
在Fedora或CentOS/RHEL上:
在CentOS/RHEL上,你必須先啟用EPEL或Repoforge軟件庫(kù)。
# yum install monit
Monit隨帶一個(gè)文檔很齊全的配置文件,有許多示例。主配置文件位于Fedora/CentOS/RHEL中的/etc/monit.conf,或位于Debian/Ubuntu/Mint中的/etc/monit/monitrc。Monit配置有兩個(gè)部分:“全局”部分和“服務(wù)”部分。#p#
全局配置:Web狀態(tài)頁(yè)面
Monit可以使用幾種郵件服務(wù)器用于通知,以及/或者HTTP/HTTPS狀態(tài)頁(yè)面。不妨從滿足下列要求的Web狀態(tài)頁(yè)面入手。
•Monit偵聽(tīng)端口1966。
•對(duì)Web狀態(tài)頁(yè)面的訪問(wèn)用SSL加密。
•登錄需要monituser/romania作為用戶/密碼。
•只允許從本地主機(jī)、myhost.mydomain.ro和內(nèi)部局域網(wǎng)(192.168.0.0/16)進(jìn)行登錄。
•Monit以pem格式存儲(chǔ)SSL證書(shū)。
至于隨后的步驟,我將使用基于紅帽的系統(tǒng)。類(lèi)似步驟適用于基于Debian的系統(tǒng)上。
首先,生成一個(gè)自簽名的證書(shū)(monit.pem),并存儲(chǔ)在/var/cert中。
# mkdir /var/certs # cd /etc/pki/tls/certs # ./make-dummy-cert monit.pem # cp monit.pem /var/certs # chmod 0400 /var/certs/monit.pem
現(xiàn)在,將下列代碼片段放入到Monit的主配置文件。你可以從空的配置文件入手,也可以拷貝一份原始文件。
set httpd port 1966 and SSL ENABLE PEMFILE /var/certs/monit.pem allow monituser:romania allow localhost allow 192.168.0.0/16 allow myhost.mydomain.ro
#p#
全局配置:電子郵件通知
下一步,不妨在Monit中建立電子郵件通知機(jī)制。我們至少需要一臺(tái)活動(dòng)的SMTP服務(wù)器,它能夠從Monit主機(jī)發(fā)送郵件。類(lèi)似下列的信息就可以了(針對(duì)你的具體情況稍作調(diào)整):
•郵件服務(wù)器主機(jī)名:smtp.monit.ro
•Monit所使用的發(fā)送者電子郵件地址:monit@monit.ro
•誰(shuí)將收到來(lái)自monit守護(hù)程序的郵件:guletz@monit.ro
•郵件服務(wù)器使用的SMTP端口:587(默認(rèn)端口是25)
有了上述信息,電子郵件通知可以配置成這樣:
set mailserver smtp.monit.ro port 587 set mail-format { from: monit@monit.ro subject: $SERVICE $EVENT at $DATE on $HOST message: Monit $ACTION $SERVICE $EVENT at $DATE on $HOST : $DESCRIPTION. Yours sincerely, Monit } set alert guletz@monit.ro
正如你所見(jiàn),Monit提供了幾個(gè)內(nèi)置變量($DATE、$EVENT和$HOST等),你可以定制電子郵件消息,以滿足自己的需要。如果你想從Monit主機(jī)本身發(fā)送郵件,就需要一個(gè)已經(jīng)安裝的與sendmail兼容的程序(比如postfix或ssmtp)。#p#
全局配置:Monit守護(hù)程序
下一個(gè)部分是設(shè)置monit守護(hù)程序。我們將按如下方式設(shè)置它。
•120秒過(guò)后執(zhí)行***檢查。
•每隔3分鐘檢查一次服務(wù)。
•使用syslog用于記錄日志。
放入下面這個(gè)代碼片段,獲得上述設(shè)置。
set daemon 120 with start delay 240 set logfile syslog facility log_daemon
我們還必須定義“idfile”和“eventqueue”,前者是monit守護(hù)程序使用的獨(dú)特ID,后者是monit發(fā)送郵件的路徑,但由于SMTP/網(wǎng)絡(luò)錯(cuò)誤而無(wú)法送達(dá)。證實(shí)路徑(/var/monit)已經(jīng)存在。下列配置就行。
set idfile /var/monit/id set eventqueue basedir /var/monit
#p#
測(cè)試全局配置
現(xiàn)在,“全局”部分已完成。Monit配置文件看起來(lái)就像這樣:
# 全局部分
# status webpage and acl's set httpd port 1966 and SSL ENABLE PEMFILE /var/certs/monit.pem allow monituser:romania allow localhost allow 192.168.0.0/16 allow myhost.mydomain.ro # mail-server set mailserver smtp.monit.ro port 587 # email-format set mail-format { from: monit@monit.ro subject: $SERVICE $EVENT at $DATE on $HOST message: Monit $ACTION $SERVICE $EVENT at $DATE on $HOST : $DESCRIPTION. Yours sincerely, Monit } set alert guletz@monit.ro # 延遲檢查 set daemon 120 with start delay 240 set logfile syslog facility log_daemon # idfile和郵件隊(duì)列路徑 set idfile /var/monit/id set eventqueue basedir /var/monit
現(xiàn)在是時(shí)候檢查我們完成的步驟了。你可以測(cè)試現(xiàn)有的配置文件(/etc/monit.conf),只要運(yùn)行:
# monit -t Control file syntax OK
如果Monit報(bào)告任何錯(cuò)誤,請(qǐng)?jiān)俅伍喿x配置文件。幸好,錯(cuò)誤/警告信息量很豐富。比如說(shuō):
monit: Cannot stat the SSL server PEM file '/var/certs/monit.pem' -- No such file or directory /etc/monit/monitrc:10: Warning: hostname did not resolve 'smtp.monit.ro'
一旦你驗(yàn)證了配置語(yǔ)法,就啟動(dòng)monit守護(hù)程序,等兩三分鐘:
# service monit start
如果你使用systemd,運(yùn)行:
# systemctl start monit
現(xiàn)在打開(kāi)瀏覽器窗口,進(jìn)入到https://
請(qǐng)注意:如果你有一個(gè)自簽名的SSL證書(shū),會(huì)在瀏覽器中看到警告信息。
你完成登錄后,肯定會(huì)看到下面這一頁(yè)。
在教程的其余部分,我將介紹如何監(jiān)控本地服務(wù)器和常見(jiàn)服務(wù)。你會(huì)在官方維基頁(yè)面上看到許多有用的示例(http://mmonit.com/wiki/Monit/ConfigurationExamples)。大多數(shù)示例可以拷貝粘貼!#p#
服務(wù)配置:處理器/內(nèi)存監(jiān)控
不妨先監(jiān)控本地服務(wù)器的處理器/內(nèi)存使用情況。將下列代碼片段拷貝到配置文件。
check system localhost if loadavg (1min) > 10 then alert if loadavg (5min) > 6 then alert if memory usage > 75% then alert if cpu usage (user) > 70% then alert if cpu usage (system) > 60% then alert if cpu usage (wait) > 75% then alert
很容易解讀上述配置。每個(gè)監(jiān)控周期(在全局部分中被設(shè)為120秒),針對(duì)本地主機(jī)執(zhí)行上述檢查。要是符合條件,monit守護(hù)程序就會(huì)通過(guò)電子郵件發(fā)送提醒。
如果某些屬性不需要每個(gè)周期都加以監(jiān)控,你可以使用下列格式。比如說(shuō),這將每隔一個(gè)周期(也就是每隔240秒)監(jiān)控平均負(fù)載。
if loadavg (1min) > 10 for 2 cycles then alert
#p#
服務(wù)配置:SSH服務(wù)監(jiān)控
不妨檢查我們是否將sshd二進(jìn)制文件安裝在/usr/sbin/sshd中:
check file sshd_bin with path /usr/sbin/sshd
我們還想檢查sshd的init腳本是否存在:
check file sshd_init with path /etc/init.d/sshd
***,我們想檢查sshd守護(hù)程序是否安裝并運(yùn)行起來(lái),是否偵聽(tīng)端口22:
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 if 5 restarts within 5 cycles then timeout
更具體地說(shuō),我們可以解讀上述配置,如下所示。我們檢查一個(gè)名為sshd的進(jìn)程和pidfile(/var/run/sshd.pid)是否存在。要是這其中一個(gè)都不存在,我們就使用init腳本重啟sshd守護(hù)程序。我們檢查偵聽(tīng)端口22的進(jìn)程是否支持SSH協(xié)議。要是不支持,我們就重啟sshd守護(hù)程序。要是在最近5個(gè)監(jiān)控周期(即5 x 120秒)里面至少有5次重啟,sshd守護(hù)程序就宣布失效,我們并不試圖再次檢查。
服務(wù)配置:SMTP服務(wù)監(jiān)控
現(xiàn)在檢查遠(yuǎn)程SMTP郵件服務(wù)器(比如192.168.111.102)。假設(shè)SMTP服務(wù)器通過(guò)其局域網(wǎng)接口,運(yùn)行SMTP、IMAP和SSH。
check host MAIL with address 192.168.111.102 if failed icmp type echo within 10 cycles then alert if failed port 25 protocol smtp then alert else if recovered then exec "/scripts/mail-script" if failed port 22 protocol ssh then alert if failed port 143 protocol imap then alert
我們檢查遠(yuǎn)程主機(jī)是否響應(yīng)ICMP。要是我們沒(méi)有在10個(gè)周期內(nèi)收到ICMP響應(yīng),就發(fā)送提醒。要是SMTP協(xié)議測(cè)試在端口25上失敗,我們就發(fā)送提醒。要是測(cè)試失敗后測(cè)試又成功了,我們就運(yùn)行腳本(/scripts/mail-script)。要是SSH和IMAP協(xié)議測(cè)試分別在端口22和端口143上失敗,我們就發(fā)送提醒。
結(jié)束語(yǔ)
我在本教程中演示了如何在本地服務(wù)器上搭建Monit。就Monit的功能而言,我在這里介紹的僅僅是冰山一角。不妨花點(diǎn)時(shí)間閱讀關(guān)于Monit的參考手冊(cè)頁(yè)。Monit的語(yǔ)法非常通俗易懂,為任何Linux管理員提供了許多功能。如果你結(jié)合集中式遠(yuǎn)程監(jiān)控工具和Monit為己所用,就會(huì)擁有一個(gè)更可靠的監(jiān)控系統(tǒng)。你覺(jué)得Monit怎么樣?
英文:How to set up server monitoring system with Monit