monitとは
サーバに常駐してプロセス監視(pid,file,tcp/udp port checkなど)を行い、必要ならプロセス再起動とかしてくれるめちゃ便利なデーモン。
で、公式の例のような感じでこんな風に設定してるとする。
check process apache with pidfile /usr/local/apache2/logs/httpd.pid group www start program = "/etc/init.d/httpd start" stop program = "/etc/init.d/httpd stop" if failed host localhost port 80 protocol HTTP request /monit/token then restart if 5 restarts within 5 cycles then timeout
monitがしてること
- http://localhost:80/monit/tokenにhttpリクエスト投げて、失敗(80番ポートに接続できない,40x/50xのstatusが返ってきたなど)すれば再起動(stop, start)する。
- 5サイクル内に5回再起動した場合はtimeout(unmonitor)
timeoutとなる例は、ネットワーク障害/アクセス集中による高負荷などで連続してモニタに失敗した場合など。で、こうなると、monit status*1のコマンド打ったときに
# monit status (中略) Process 'apache' status not monitored monitoring status not monitored data collected Sun Jul 19 18:54:17 2009
こうなっていて、以後apacheがモニタされなくなる。
対策
monit再起動(monit reloadではなく、停止/起動で)、monit monitor allなどのコマンドを実行する。でもうっかり忘れると困る。というわけでタイトルのようにcronで
*/30 * * * * /usr/sbin/monit monitor all
等のような設定を入れておいたほうが良いんじゃないか、と思ったのでこのエントリを書いた。
追記: set httpdについて
monit管理用のhttpdの設定。monit status, monit monitor allなどのコマンドを使う場合は、設定が必要。(monitの命令がhttp経由で実行されるので)
ここで設定するhttpdは通常のブラウザからでもアクセスできて、監視対象デーモンの再起動なども出来る。Basic認証で制限できるとはいえ、ブラウザ経由でそんなことするの怖い、というのであれば
set httpd port 2812 and use address localhost allow localhost # Allow localhost to connect
というように設定しておけばlocalhostでのみlistenする。
リモートからアクセスする場合はIPとBasic認証かける。read-onlyの設定が入っているユーザは、statusを確認できるけどデーモン再起動などはできない。
set httpd port 2812 and use address localhost allow 192.168.0.1/24 allow admin:Monit # Allow Basic Auth allow user:pass read-only # Allow Basic Auth (read-only)
あと、sampleではhttpdのportが2812だけど、覚えにくいので自分が使うときは別のportに変えています(割とどうでもよい)。
ちなみにmonitのhttpdにアクセスするとこんな画面になる。
追記 monitor時のメール送信について
monit ver.5 からmonitor したときにメール飛んでくるようになったのでこのままではとてもうざいですね。メールの設定で
set alert address@example.com but not on { action }
などと書いておくとよいでしょう。