
対象環境: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導入により、音付き通知・スマホ即受信・履歴管理も可能。
サーバー運用を自動化し、ダウン検知まで完全無人で行える体制が完成した。


コメント