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 の偏りで負荷種類を切り分け

関連記事:

お気軽にご相談ください

お見積りへ お問い合わせへ