お手軽監視ツールで監視してみます。
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 アプリで 設定 > アプリ パスワード で検索すると出てきます

アプリ
アプリ名 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 の取得
- Slack の Incoming Webhooks にアクセスします。
- 通知させたいチャンネル(例:
#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
まとめ
| 通知先 | 通信プロトコル | 実装方法 |
| Gmail | SMTP (ポート 587) | Monit の set mailserver 設定を利用 |
| Slack | HTTP POST (Webhook) | Monit の exec アクションから curl スクリプトを呼び出し |
単一の監視ツールであっても、SMTPによるメール通知 と HTTP POST(Webhook)によるチャット通知 を組み合わせることで、強固で多層的なサーバー監視体制を構築できます。


コメント