Monit はサービスが動いていることを見張り、倒れたら起こします。最初にもっともな問いが出ます。systemd が Restart=always の一行で同じことをするのに、なぜ必要なのか?

その答えが組み方すべてを決めます。systemd はプロセスが終了したのを見て、もう一度起動します。しかしサービスがリクエストに応答しているかどうかは知りません。プロセス数の上限に達した PHP-FPM は systemd から見れば元気に生きていて、その一方でサイトは 502 を返しています。ディスクが尽きた MySQL はプロセスとしては動き続け、クエリを一つも実行しません。一方で Monit が確認するのはプロセスの存在ではなく、その振る舞いです。ポートは応答するか、HTTP のリクエストは何を返すか、メモリはどれだけ使っているか。

ここから規則が出ます。systemd はそのままにしておき、機能面の確認のために Monit を足す。落ちたプロセスの再起動という仕事を二重にする意味はありません。

組み方

sudo apt install monit

主要なファイルは /etc/monit/monitrc。自分の確認は別ファイルとして /etc/monit/conf.d/ へ置きます。よくある書き出し:

set daemon 60
set logfile /var/log/monit.log
set mailserver localhost
set alert admin@example.com

一分に一度の巡回が妥当な釣り合いです。これより頻繁だと負荷が増え、一秒の遅れで誤って再起動する危険が高まります。

Web 画面:ローカルのみ

Monit には内蔵の Web ページがあり、たいてい最初に見つかった手引きが示すとおり——すべてのアドレスで——有効にされます。その結果はインターネットから届くサーバーのサービス管理画面です。正しい書き方は:

set httpd port 2812 and
    use address localhost
    allow localhost
    allow admin:'a-long-password'

外部からのアクセスは SSH トンネル経由で:

ssh -L 2812:localhost:2812 user@203.0.113.25

その後、ページは自分のパソコンの localhost:2812 で開き、外には何も向きません。

意味のある確認

Web サーバー——プロセスの存在ではなく、その応答で:

check process nginx with pidfile /run/nginx.pid
    start program = "/bin/systemctl start nginx"
    stop program  = "/bin/systemctl stop nginx"
    if failed host 127.0.0.1 port 80 protocol http
        request "/" status = 200
        for 3 cycles then restart
    if 3 restarts within 10 cycles then unmonitor

ここでは三つの行が他より重要です。

protocol http ... status = 200 こそ、この一式を組んだ目的そのものです。サーバーはページを返さねばならず、ポートを開けているだけでは足りません。

for 3 cycles は、一度きりの失敗には反応するなという意味です。これが無いと Monit は負荷時の一度の遅い応答でサービスを再起動し、それは事態を悪くするだけです。

if 3 restarts within 10 cycles then unmonitor は必須の一行です。設定の誤りでサービスが立ち上がらないなら、Monit は永遠に再起動を続け、負荷を増やしログを埋めます。この行はこう言います。三度の失敗、そこで止まってメッセージを残せ、と。次に必要なのは人であり、自動化はもう助けになりません。

ディスク容量は自動処理を一切伴わず、ただの警告として確認します。

check filesystem rootfs with path /
    if space usage > 85% then alert
    if inode usage > 85% then alert

inode の行は別途必要です。それらは容量とは独立に尽き、これが無ければその状況は気づかれないまま過ぎます。

設定の確認

sudo monit -t
sudo systemctl reload monit
sudo monit summary
sudo monit status

monit -t は適用前に構文を確認します。monit summary は状態の短い表を出します——どんな問題を調べるときも、そこから始める場所です。

そしてメールが送れているかも確認してください。Monit は出来事をメールで報告しますし、配送が設定されていなければ通知は一切ありません。サービスは再起動し、あなたはそれを知らない——ところが再起動の繰り返しこそが主要な合図なのです。それらはログでも見られます:/var/log/monit.log

Monit がしないこと

原因は取り除きません。再起動は先延ばしであり、絶えず再起動されるサービスは、どこかでメモリが足りない、容量が尽きかけている、アプリケーションが漏らしている、のいずれかを意味します。そしてこのツールの価値は再起動ではなくカウンタにあります。一日に nginx が三度再起動したというのは、サイトはずっと動いていたせいで他の方法では気づかれずに過ぎたはずの診断です。

ですから見るべきは現在の状態ではなく——それはほぼ常に緑です——履歴です。この一週間で何度、何かがひとりでに起き上がったのか。それが一つのページでどう見えるかは下のデモで。