Monitの設定:深夜3時のLinuxサービス停止を自動復旧する「救世主」

Monitoring tutorial - IT technology blog
Monitoring tutorial - IT technology blog

深夜の悪夢:サーバーの「突然死」

想像してみてください。午前3時、電話が激しく鳴り響きます。ウェブサイトがダウンし、顧客からの電話が殺到しています。あなたは眠い目をこすりながら起き上がり、ノートPCを開いてサーバーにSSH接続し、たった一つのコマンドを打ち込みます:systemctl restart nginx。すべては元通りになりますが、あなたの睡眠時間は戻ってきません。

コンピュータが5秒で処理できることを、なぜ手動で行う必要があるのでしょうか?PrometheusやZabbixはグラフ作成やメトリクス収集に非常に強力ですが、これらは主に「事後診断」に長けています。Monitは違います。それは門の前に常駐する警備員のようなものです。サービスが「倒れている」のを見つけると、すぐに人工呼吸(再起動)を行い、即座に復旧させます。

Monitの最大の魅力はその軽量さにあります。消費メモリは2MB未満で、CPU負荷もほとんどありません。非力なVPSであっても非常に適しています。

5分でできるMonitのクイック導入

以下は、この「守護神」をUbuntu/DebianまたはCentOS/RHELで動作させるための手順です。

1. インストール

# Ubuntu/Debianの場合
sudo apt update && sudo apt install monit -y

# CentOS/RHELの場合
sudo yum install epel-release -y
sudo yum install monit -y

2. Webインターフェースの有効化

Webインターフェースを使用すると、コマンドを打たずにステータスを素早く確認できます。設定ファイル /etc/monit/monitrc (Ubuntu) または /etc/monitrc (CentOS) を開き、以下の行のコメントアウトを解除します:

set httpd port 2812 and
    use address 0.0.0.0     # 外部からのアクセスを許可
    allow admin:monit      # このユーザー名とパスワードはすぐに変更してください

3. サービスの起動

sudo systemctl enable --now monit
# Monitが正常に動作しているか確認
sudo monit status

なぜMonitはSystemdよりも優れているのか?

「Systemdに Restart=always があるのに、なぜわざわざMonitを入れる必要があるのか?」と疑問に思う方もいるでしょう。

実際、Systemdはプロセスが完全に消失した時にしか再起動を行いません. Monitはそれよりもスマートです。サービスの実際のヘルスステータスをチェックできます。例えば、Nginxは実行中(プロセスは存在)であっても、502エラーを返していたり、メモリを90%使い果たしていたりすることがあります。Systemdはただ見守るだけですが、Monitは設定した条件に基づいて即座に介入します。

実体験として、20台のサーバー群を管理していた際、Monitは第一防衛ラインとして機能しました。メモリ溢れやサービスのフリーズといった些細なトラブルの90%を処理してくれました。Monitで解決できない場合にのみ、Telegramで通知を受け取り、手動で対応するようにしています。

主要サービスの監視設定

メインファイルにすべて書き込むのではなく、管理しやすいように /etc/monit/conf-enabled/ 内に個別のファイルを作成しましょう。

Nginx (Webサーバー) の監視

/etc/monit/conf-enabled/nginx ファイルを作成します:

check process nginx with pidfile /run/nginx.pid
    start program = "/usr/bin/systemctl start nginx"
    stop program  = "/usr/bin/systemctl stop nginx"
    if failed port 80 protocol http then restart
    if failed port 443 protocol https then restart
    if 3 restarts within 5 cycles then alert

このスクリプトはポート80と443をチェックします。もしNginxがHTTP/HTTPSプロトコルに正しく応答しない場合、Monitは自動的に再起動します。3回再起動しても失敗する場合は、停止して管理者にアラートを飛ばします。

MySQL/MariaDB の監視

check process mysql with pidfile /var/run/mysqld/mysqld.pid
    if failed host 127.0.0.1 port 3306 protocol mysql then restart
    if cpu usage > 80% for 5 cycles then alert

システムリソースの監視

Monitはサーバーのリソース状態を監視することも可能です:

check system $HOST
    if loadavg (1min) > 4 then alert
    if memory usage > 85% then alert

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

カスタムスクリプトによる自動トラブルシューティング

これは非常に便利な機能です。例えば、アプリケーションのログファイルが急激に肥大化してディスクを圧迫した場合、Monitにクリーンアップスクリプトを自動実行させることができます:

check file app_log with path /var/log/myapp.log
    if size > 1 GB then exec "/usr/local/bin/cleanup_logs.sh"

導入時の重要な注意点

  • チェック周期を短くしすぎない: デフォルトではMonitは2分ごとにチェックします (set daemon 120)。5秒などの短すぎる設定は、サービスが完全に起動する前に「誤検知(false positive)」を引き起こす可能性があるため避けてください。
  • 常に構文チェックを行う: 設定を反映させる前に sudo monit -t を実行してください。設定ファイルの小さなミスが、監視システム全体の停止を招くことがあります。
  • 複数サーバーの場合は M/Monit を使用する: 5台以上のサーバーを管理する場合は、すべてを中央ダッシュボードに集約できる M/Monit の利用を検討してください。

Monitは専門的な監視システムを置き換えるものではありません。サーバー上でローカルに動作し、静かにエラーを修正する「最後の保険」です。「一度設定すればあとはお任せ」でサーバーを健全に保ちたいなら、Monitは最良の選択肢です。

Share: