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


## インストール

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

```bash:インストール
$ 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をこのまま使います。

## 初期設定

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

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

```profile:/etc/monit.conf
# set daemon mode timeout to 1 minute
set daemon 60
# Include all files from /etc/monit.d/
include /etc/monit.d/*
```

```profile:/etc/monit.d/logging
# log to monit.log
set logfile /var/log/monit
```

```profile:/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秒で、ログ出力のみ＆ローテート設定ありの最低限の設定は出来ている様です。

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

### プロセス監視の設定

```profile:/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辺りの設定を追加してみます。

```bash: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) を実行中...
```

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

```profile:/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にしていますが、実際にはポート番号は違う番号に換えているので適時書き換えて使用しています。

## 自動起動設定

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

```bash:自動起動設定
$ 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インタフェースも用意して動作確認をしておきます。

```profile:/etc/monit.d/monit-web.rc
set httpd port 2812 and address localhost
	allow	admin:password
```

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

```nginx:/etc/nginx/conf.d/monit.conf
server {
	server_name	monit.example.org;
	location / {
		proxy_pass http://127.0.0.1:2812;
	}
}
```

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

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

```bash: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だけ引っかけて見れるようにすれば最低限かな…と。

```bash: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`が登録されるようになります。

## 参考

- [monitで落ちたら困るデーモンを監視する](http://devslog.com/article/20121213080039.html)
- [15分で始めるmonitによるサーバ監視](http://shanon-tech.blogspot.jp/2011/11/15monit.html)
- [便利！プロセス監視をしてくれるサーバ監視ツールmonitの設定方法](http://ex-cloud.jp/techblog/?p=28)
- [monit について調べたのでメモ](http://inokara.hateblo.jp/entry/2013/12/06/142258)
- [システムマネジメントツール(Monit)の導入](http://www.aconus.com/~oyaji/suse9.3/monit.htm)