KUSANAGI9環境での自動監視「落ちる前に再起動」「落ちた後も即検知(外部チェック)」とSlack通知構築手順

WordPress


対象環境:KUSANAGI 9(CentOS Stream 9 + nginx + php-fpm 8.1)

目的:FPM枯渇やサイトダウンを自動検知し、Slackに即通知+自動リロードで復旧する仕組みを構築する。

UptimeRobotよりSlackの方が通知がリアルタイムで早い。またスマホにSlackアプリを入れることで、サーバー障害だけSlackで通知音を出させたり差別化も楽。

1. PHP-FPM内部監視(自動リロード型)

概要
php-fpm error.log に「pm.max_children reached」が出力されたら、自動で php-fpm reload を実行し、同時にSlack通知を送る。

これにより、サイトを落とさずにFPMを再生成し、負荷を即リセットできる。

※〇〇〇〇は自分のプロファイル名
※△△△△はドメイン

スクリプト作成

cat <<'SH' >/usr/local/bin/fpm_monitor.sh
#!/usr/bin/env bash
LOG="/var/opt/kusanagi/log/php-fpm/error.log"
WEBHOOK="https://hooks.slack.com/services/(自分のWebhookURL)"

tail -Fn0 "$LOG" | while read line; do
if echo "$line" | grep -q "pm.max_children reached"; then
systemctl reload php-fpm
curl -X POST -H 'Content-type: application/json' \
--data "{\"text\":\"[〇〇〇〇] ⚠ php-fpm max_children reached → 自動リロード実行完了 ($(hostname))\"}" \
"$WEBHOOK"
fi
done
SH

chmod +x /usr/local/bin/fpm_monitor.sh
nohup /usr/local/bin/fpm_monitor.sh >/dev/null 2>&1 &

動作確認

テスト通知を送る:

echo "WARNING: [pool kusanagi] server reached pm.max_children reached (fake test)" >> /var/opt/kusanagi/log/php-fpm/error.log

Slackに「⚠ php-fpm max_children reached → 自動リロード実行完了」と表示されれば成功。

復旧コマンド(異常時)

pkill -f fpm_monitor.sh && systemctl restart php-fpm && nginx -t && systemctl reload nginx

2. 外部監視(HTTP応答確認/UptimeRobot代替)

概要

curl により1分ごとに https://△△△△.com/ をチェックし、
HTTP 200以外を検知したらSlackへ通知。
実際にサイトが落ちた時のアラートとして機能する。

スクリプト作成

cat <<'SH' >/usr/local/bin/site_watchdog.sh
#!/usr/bin/env bash
URL="https://△△△△.com/"
WEBHOOK="https://hooks.slack.com/services/(自分のWebhookURL)"

HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" "$URL")

if [ "$HTTP_CODE" != "200" ]; then
curl -X POST -H 'Content-type: application/json' \
--data "{\"text\":\"[〇〇〇〇] ⚠ サイト異常検知:$URL(HTTP $HTTP_CODE)\"}" \
"$WEBHOOK"
fi
SH

chmod +x /usr/local/bin/site_watchdog.sh

cron設定(1分間隔)

(crontab -l 2>/dev/null; echo "* * * * * /usr/local/bin/site_watchdog.sh >/dev/null 2>&1") | crontab -

テスト通知

 

URL="https://△△△△.com/"
WEBHOOK="https://hooks.slack.com/services/(自分のWebhookURL)"
curl -X POST -H 'Content-type: application/json' \
--data "{\"text\":\"[〇〇〇〇] ⚠ サイト異常検知テスト:$URL(HTTP 503 仮想テスト)\"}" \
"$WEBHOOK"

Slackに「⚠ サイト異常検知テスト」と表示されれば成功。

3. 運用結果

内部監視:FPMが限界に達した際、自動でリロード実行+Slack通知。
外部監視:HTTP応答が200以外のとき即座にアラート送信。
通知速度:平均遅延 1〜2秒(リアルタイム)。
負荷:1分間隔でもサーバーへの影響はほぼ0%。

4. まとめ

この2系統監視により、

「落ちる前に再起動(内部リカバリ)」
「落ちた後も即検知(外部チェック)」

が同時に成立する。

Slack導入により、音付き通知・スマホ即受信・履歴管理も可能。

サーバー運用を自動化し、ダウン検知まで完全無人で行える体制が完成した。

コメント

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