CentOS
monit

CentOS 6.5にmonitをインストールしてプロセス監視をする

More than 3 years have passed since last update.


インストール

細かい監視などはzabbixでやるとして、障害発生時の自動復旧などを実施するためにmonitの設定をしました。


インストール

$ sudo yum -y install monit

$ rpm -q monit
monit-5.1.1-4.el6.x86_64
$ rpm -ql monit
/etc/logrotate.d/monit
/etc/monit.conf
/etc/monit.d
/etc/monit.d/logging
/etc/rc.d/init.d/monit
/usr/bin/monit
/usr/share/doc/monit-5.1.1
/usr/share/doc/monit-5.1.1/CHANGES.txt
/usr/share/doc/monit-5.1.1/COPYING
/usr/share/doc/monit-5.1.1/LICENSE
/usr/share/doc/monit-5.1.1/PLATFORMS
/usr/share/doc/monit-5.1.1/README
/usr/share/doc/monit-5.1.1/README.DEVELOPER
/usr/share/doc/monit-5.1.1/README.SSL
/usr/share/man/man1/monit.1.gz
/var/log/monit
$ monit -V
This is monit version 5.1.1
Copyright (C) 2000-2010 by Tildeslash Ltd. All Rights Reserved.

今回は余りバージョンなどは気にしなかったので、インストールされた5.1.1をこのまま使います。


初期設定


インストールされた設定の確認

デフォルトの設定ファイル類を眺めてみますが…


/etc/monit.conf

# set daemon mode timeout to 1 minute

set daemon 60
# Include all files from /etc/monit.d/
include /etc/monit.d/*


/etc/monit.d/logging

# log to monit.log

set logfile /var/log/monit


/etc/logrotate.d/monit

/var/log/monit {

missingok
notifempty
size 100k
create 0644 root root
postrotate
/sbin/service monit condrestart > /dev/null 2>&1 || :
endscript

}


監視周期が60秒で、ログ出力のみ&ローテート設定ありの最低限の設定は出来ている様です。

メールでの通知機能などは使わないので、このまま使います。


プロセス監視の設定


/etc/monit.d/crond.rc

check process crond

with pidfile "/var/run/crond.pid"
start program "/etc/init.d/crond start"
stop program "/etc/init.d/crond stop"

動作確認も兼ねて、とりあえずcrond辺りの設定を追加してみます。


monit設定確認

$ cd /etc/monit.d

$ sudo cp ~/monit.rc/crond.rc .
$ ls
crond.rc logging
$ sudo service monit start
monit を起動中: monit: generated unique Monit id XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX and stored to '/root/.monit.id'
[ OK ]
$ tail -f /var/log/monit &
[1] xxxx
[JST Jul dd hh:mm:ss] info : monit: generated unique Monit id XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX and stored to '/root/.monit.id'
[JST Jul dd hh:mm:ss] info : 'XXXXXXXXXX' Monit started
$ sudo service crond stop
$ [JST Jul dd hh:mm:ss] error : 'crond' process is not running
[JST Jul dd hh:mm:ss] info : 'crond' trying to restart
[JST Jul dd hh:mm:ss] info : 'crond' start: /etc/init.d/crond
[JST Jul dd hh:mm:ss] info : 'crond' process is running with pid xxxx
$ service crond status
crond (pid xxxx) を実行中...

後は、時折ポート監視などの設定も追加しつつ、監視したいサービス(デーモン)単位で設定を追加していきます。


/etc/monit.d/sshd.rc

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 restart within 5 cycles then timeout

※ここでポートは22にしていますが、実際にはポート番号は違う番号に換えているので適時書き換えて使用しています。


自動起動設定

適時動作確認をしつつ追加して、全てが終わったら、自動起動設定を入れておきます。


自動起動設定

$ sudo chkconfig --list monit

monit 0:off 1:off 2:off 3:off 4:off 5:off 6:off
$ sudo chkconfig monit on
$ sudo chkconfig --list monit
monit 0:off 1:off 2:on 3:on 4:on 5:on 6:off

ここでの自動起動は、OS再開時の設定なので、monit自身が異常終了した場合などは意味ないのですけどね(^_^;)

※inittabに入れた方が良いのかもしれないけど、inittab自体のメンテナンスを余りしたくないという…


追加設定


Webインタフェースでの動作確認

念のためのWebインタフェースも用意して動作確認をしておきます。


/etc/monit.d/monit-web.rc

set httpd port 2812 and address localhost

allow admin:password

2812番ポートをiptablesで開けるよりもnginxでproxyしちゃった方が早いかなぁという(^_^:)


/etc/nginx/conf.d/monit.conf

server {

server_name monit.example.org;
location / {
proxy_pass http://127.0.0.1:2812;
}
}

上記設定をnginxに追加して、アクセス確認をしておきました。

確認が終わったら、nginx側の設定は不要です。


CUIで確認

$ sudo monit status

The Monit daemon 5.1.1 uptime: 0m
()
Process 'crond'
status running
monitoring status monitored
pid 1234
parent pid 1
uptime 24m
children 0
memory kilobytes 1268
memory kilobytes total 1268
memory percent 0.0%
memory percent total 0.0%
cpu percent 0.0%
cpu percent total 0.0%
data collected Sat Jul dd hh:mm:ss yyyy

System 'xxxx.example.org'
status running
monitoring status monitored
load average [0.00] [0.00] [0.00]
cpu -1.0%us -1.0%sy -1.0%wa
memory usage 475376 kB [25.4%]
data collected Sat Jul dd hh:mm:ss yyyy
$ sudo monit unmonitor crond
$ sudo monit status
()
Process 'crond'
status not monitored
monitoring status not monitored
data collected Sat Jul dd hh:mm:ss yyyy
$ sudo monit monitor crond
$ sudo monit status
()
Process 'crond'
status initializing
monitoring status initializing
data collected Sat Jul dd hh:mm:ss yyyy
$ sudo monit status
()
Process 'crond'
status running
monitoring status monitored
pid 1234
parent pid 1
uptime 28m
children 0
memory kilobytes 1268
memory kilobytes total 1268
memory percent 0.0%
memory percent total 0.0%
cpu percent 0.0%
cpu percent total 0.0%
data collected Sat Jul dd hh:mm:ss yyyy


webインタフェースがあると、CUIからでも操作可能なのでメンテナンス時などに便利です。


zabbixでのmonitプロセス監視

ここまでで簡単な自動復旧の環境はできましたが、そもそもmonitが落ちてしまっていたらそれも叶わないので、monitについてはzabbix側でプロセス監視をしておきます。


アイテム設定

項目
設定

名前
Process monitor daemon running

タイプ
Zabbixエージェント

キー
proc.num[monit]

データ型
数値(整数)


トリガー設定

項目
設定

名前
Process monitor daemon down

条件式
{Zabbix server:proc.num[monit].last()}=0

深刻度
軽度の障害

上記のアイテム&トリガー追加をして、イザという時にはzabbix側で通知が出るようにしておきました。

深刻度は「警告」でも良いのですが、プロセス監視の本体側だし、monitそのものは自動起動しないので、「軽度の障害」にしておきました。

今後暇なときにでもmonitで監視しているプロセスの障害設定を追加しておこうと思っているのですが、それらの場合は「警告」にしようかなぁと思っています。


zabbixでのmonitログ監視

ついでに、何か障害があった場合(monitで自動復旧したとしても)についても、念のためzabbix側のイベントに出力するように設定しておきます。


アイテム設定

項目
設定

名前
Process monitor daemon log

タイプ
Zabbixエージェント(アクティブ)

キー
log[/var/log/monit,error]

データ型
ログ


トリガー設定

項目
設定

名前
Process monitor daemon error

条件式
(({Zabbix server:log[/var/log/monit,error].regexp(error)})#0)&({Zabbix server:log[/var/log/monit,error].nodata(300)}=0)

深刻度
警告

単純にerrorだけ引っかけて見れるようにすれば最低限かな…と。


cron停止時のエラーログ

$ tail -f /var/log/monit

[JST Jul dd hh:mm:ss] error : 'crond' process is not running
[JST Jul dd hh:mm:ss] info : 'crond' trying to restart
[JST Jul dd hh:mm:ss] info : 'crond' start: /etc/init.d/crond
[JST Jul dd hh:mm:ss] info : 'crond' process is running with pid xxxxx

この状態でzabbix側のイベントとして[JST Jul dd hh:mm:ss] error : 'crond' process is not runningが登録されるようになります。


参考