Monitでプロセスの死活監視!Gmail&Slack通知の設定完全ガイド

Server

お手軽監視ツールで監視してみます。
ansibleで全サーバーに簡易チェックを入れました^^

Go製のバックエンドアプリ(umi-camera 等)や Nginx などのプロセス監視において、軽量かつ強力なツールの1つが Monit です。

本記事では、Linuxサーバーに Monit を導入し、プロセス障害時に ① Gmail(SMTP経由)② Slack(Webhook経由) の両方に通知を飛ばす設定手順を解説します。

1. Monit のインストールと基本設定

まずは Monit をインストールし、システム自動起動を有効化します。

インストール centos9

# 1. EPEL リポジトリをインストールして有効化
sudo dnf install -y epel-release

# 2. Monit をインストール
sudo dnf install -y monit

# 3. サービスの有効化(自動起動)と起動
sudo systemctl enable --now monit

インストール(Ubuntu / Debian の場合)

sudo apt update
sudo apt install monit -y
sudo systemctl enable --now monit

2. Gmail 通知(SMTP)の設定

Monit はプロセスの異常を検知した際、SMTPプロトコルを使用してメール(Gmail)を送信できます。

事前準備(Gmail側):

Gmailのセキュリティ設定から 2段階認証を有効化 し、「アプリパスワード」 を発行しておいてください(通常のログインパスワードでは送信できません)。

google アプリで 設定 > アプリ パスワード で検索すると出てきます

Screenshot

アプリ

アプリ名 monit_mail 等適当に
作成でパスワードが生成されました! 16桁のそれをスペース抜いてYOUR_APP_PASSWORDのところに。ちゃんとメール送信できました!

設定ファイルの編集

/etc/monit/monitrc(または /etc/monit/conf.d/mail.conf)に以下を追記します。Plaintext

# メールサーバーの設定(Gmail SMTP)
set mailserver smtp.gmail.com port 587
    username "YOUR_GMAIL_ADDRESS@gmail.com"
    password "YOUR_APP_PASSWORD" # 発行した16桁のアプリパスワード
    using tlsv12

# 通知メールの差出人と宛先
set mail-format {
    from: Monit Alert <YOUR_GMAIL_ADDRESS@gmail.com>
    subject: [Monit] $SERVICE $EVENT at $DATE
    message: Monit $ACTION $SERVICE at $DATE on $HOST: $DESCRIPTION
}

# デフォルトの通知先アドレス
set alert YOUR_GMAIL_ADDRESS@gmail.com

3. Slack 通知(Webhook)の設定

Monit には Slack 専用の送信機能はありませんが、障害検知時に 「外部の curl コマンドを実行する(汎用 Webhook)」 ことで Slack への通知を実現します。

① Slack Webhook URL の取得

  1. Slack の Incoming Webhooks にアクセスします。
  2. 通知させたいチャンネル(例: #alert)を選択し、Webhook URL(
    https://hooks.slack.com/services/xxx/yyy/zzz
    (https://hooks.slack.com/services/xxx/yyy/zzz)
    )を取得します。

② 通知用シェルの作成

Monit から呼び出すための軽量な通知スクリプトを作成します。Bash

sudo mkdir -p /usr/local/bin/monit-scripts
sudo nano /usr/local/bin/monit-scripts/slack-notify.sh

/usr/local/bin/monit-scripts/slack-notify.sh:Bash

#!/bin/bash

# Slack Incoming Webhook URL
WEBHOOK_URL="https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK_URL"

# Monitから渡される環境変数を使用してメッセージを作成
PAYLOAD=$(cat <<EOF
{
  "text": "🚨 *[Monit Alert]* $MONIT_SERVICE on $MONIT_HOST\n*Event:* $MONIT_EVENT\n*Description:* $MONIT_DESCRIPTION"
}
EOF
)

# SlackへHTTP POSTリクエストを送信
curl -X POST -H 'Content-type: application/json' --data "$PAYLOAD" "$WEBHOOK_URL"

実行権限を付与しておきます。Bash

sudo chmod +x /usr/local/bin/monit-scripts/slack-notify.sh

4. プロセス監視ルール(Goアプリ・Nginx)の設定

/etc/monit/conf.d/app.conf ファイルを作成し、実際の監視ルールを記述します。Bash

sudo nano /etc/monit/conf.d/app.conf

/etc/monit/conf.d/app.conf:Plaintext

# ==========================================
# 1. Nginx 監視
# ==========================================
check process nginx with pidfile /var/run/nginx.pid
    start program = "/systemctl start nginx"
    stop program  = "/systemctl stop nginx"
    # プロセスがダウンしたら自動再起動&メール・Slack通知を発動
    if failed host 127.0.0.1 port 80 protocol http then restart
    if restarted then exec "/usr/local/bin/monit-scripts/slack-notify.sh"

# ==========================================
# 2. Go バックエンドアプリ監視
# ==========================================
check process my_go_app matching "umi-camera-backend"
    # 落ちていたら自動再起動(systemd経由)
    start program = "/bin/systemctl start umi-camera"
    stop program  = "/bin/systemctl stop umi-camera"
    
    # プロセスが存在しない場合の通知&アクション
    if does not exist then alert # これでメール送信
    if does not exist then exec "/usr/local/bin/monit-scripts/slack-notify.sh"

5. 設定の反映と動作テスト

設定ファイルの構文チェック&リロード

Bash

# 構文にエラーがないか確認
sudo monit -t

# 構文が正常(Control file syntax OK)なら設定を反映
sudo monit reload

動作確認(疑似障害テスト)

実際にプロセスを停止させて、自動再起動・Gmail通知・Slack通知が正しく機能するか確認します。Bash

# Goアプリ(またはNginx)を意図的に停止させる
sudo systemctl stop umi-camera

# Monitのログを確認(デフォルトで数分おきにポーリング監視しています)
sudo tail -f /var/log/monit.log

数分以内に Monit がプロセスの停止を検知し、① プロセスの自動再起動② Gmail へのアラートメール③ Slack への Webhook 通知 が正しく実行されれば設定完了です!

$ sudo monit summary
Monit 6.0.0 uptime: 4m
┌─────────────────────────────────┬────────────────────────────┬───────────────┐
│ Service Name                    │ Status                     │ Type          │
├─────────────────────────────────┼────────────────────────────┼───────────────┤
│ i-14100000403049                │ OK                         │ System        │
├─────────────────────────────────┼────────────────────────────┼───────────────┤
│ nginx                           │ OK                         │ Process       │
├─────────────────────────────────┼────────────────────────────┼───────────────┤
│ storekit_api                    │ OK                         │ Process       │
├─────────────────────────────────┼────────────────────────────┼───────────────┤
│ monit_alert_check               │ Does not exist             │ Process       │
└─────────────────────────────────┴────────────────────────────┴───────────────┘

monit_alert_checkは即エラーになるように無効なものを入れています。

ちゃんとメールも届きました^^v

まとめ

通知先通信プロトコル実装方法
GmailSMTP (ポート 587)Monit の set mailserver 設定を利用
SlackHTTP POST (Webhook)Monit の exec アクションから curl スクリプトを呼び出し

単一の監視ツールであっても、SMTPによるメール通知HTTP POST(Webhook)によるチャット通知 を組み合わせることで、強固で多層的なサーバー監視体制を構築できます。

お気軽にコメントください!

スパム対応のためコメント認証に数日かかることがありますが、お気軽にコメントいただけると嬉しいです^^

コメント

タイトルとURLをコピーしました