2026年8月10日
2026年8月10日
Apacheのステータスを監視する方法
はじめに
Apache HTTP Server には標準で mod_status というモジュールがあり、稼働中のワーカー数・現在処理中のリクエスト・累計バイト数・スコアボード(W/K/R/D/C などのステータス)を HTTP 経由で公開できます。負荷の高騰原因を切り分けるとき、サーバーが「忙しい」のか「詰まっている」のかを判断する基本ソースになります。
スコアボードを定期的にスクレイピングすれば、Zabbix・Prometheus・Munin などの監視基盤と簡単に連携でき、軽量なメトリクス収集が可能です。
本記事では、mod_status の有効化からアクセス制御、server-status?auto でのスクリプト連携、しきい値ベースアラートまでを実用例とともに解説します。
症状・背景
Apache ステータス監視が必要な場面:
- 高負荷時にワーカープロセスが枯渇していないかを把握したい
- KeepAlive 状態のコネクションが詰まっているか調べたい
- リクエスト処理速度(req/sec, bytes/sec)のトレンドを取りたい
- mpm_prefork の MaxRequestWorkers 設定が適切か判断したい
手順・設定方法
ステップ1: mod_status を有効化
# Debian / Ubuntu
sudo a2enmod status
# RHEL系(標準で組み込み)
httpd -M | grep status_module
# 設定ファイルを作成
cat <<'EOF' | sudo tee /etc/apache2/conf-available/server-status.conf
<Location "/server-status">
SetHandler server-status
Require ip 127.0.0.1
Require ip ::1
</Location>
ExtendedStatus On
EOF
sudo a2enconf server-status
sudo systemctl reload apache2
ステップ2: ブラウザ/curl で状態を確認
# 人が見やすい HTML 版
curl -s http://127.0.0.1/server-status | head -40
# パース用の auto 版(スクリプト向け)
curl -s http://127.0.0.1/server-status?auto
# 主要指標だけ抽出
curl -s http://127.0.0.1/server-status?auto \
| grep -E '^(Total Accesses|Total kBytes|BusyWorkers|IdleWorkers|ReqPerSec|BytesPerSec)'
ステップ3: しきい値超過時にアラートを送る
cat <<'EOF' | sudo tee /usr/local/bin/apache_busy_check.sh
#!/bin/bash
THRESHOLD=80 # MaxRequestWorkers の80%
MAX=$(grep -E '^\s*MaxRequestWorkers' /etc/apache2/mods-enabled/mpm_*.conf | awk '{print $2}' | head -1)
BUSY=$(curl -s http://127.0.0.1/server-status?auto | awk -F': ' '/^BusyWorkers/ {print $2}')
PCT=$(( BUSY * 100 / MAX ))
if [ "$PCT" -ge "$THRESHOLD" ]; then
echo "Apache BusyWorkers ${BUSY}/${MAX} (${PCT}%)" \
| mail -s "[WARN] $(hostname) apache busy" admin@example.com
fi
EOF
sudo chmod +x /usr/local/bin/apache_busy_check.sh
echo '*/2 * * * * root /usr/local/bin/apache_busy_check.sh' | sudo tee /etc/cron.d/apache_busy
ステップ4: スコアボードの意味を確認する
# スコアボードの各文字の意味(公式ドキュメント準拠)
# _ : 待機 S : 起動中
# R : リクエスト読込 W : 応答送信
# K : KeepAlive D : DNS解決
# C : 切断中 L : ログ出力
# G : Gracefully 終了中 I : アイドル
# . : スロット未使用
# 例:W が多すぎる → 応答送信中のワーカが滞留 → バックエンド遅延を疑う
curl -s http://127.0.0.1/server-status?auto | grep '^Scoreboard:'
注意事項
/server-statusは社内/管理IPに限定する。インターネット公開は情報漏えいリスクExtendedStatus Onは CPU 負荷が増えるため、本番では計測したい期間に限定する選択肢もある- mpm_event と mpm_prefork でスコアボードの解釈が一部異なる
- リバースプロキシ配下では
127.0.0.1制限だと取れない場合があり、mod_remoteip等を併用する
まとめ
1. mod_status 有効化: a2enmod / httpd 設定で /server-status を公開
2. アクセス制御: 必ず IP / Basic認証で保護
3. auto 形式: スクリプト連携には ?auto が便利
4. BusyWorkers 監視: MaxRequestWorkers に対する比率でアラート
5. スコアボード: W/K/D の偏りで負荷種類を切り分け
関連記事: