2026年7月12日

2026年7月12日

Apacheのmod_statusでサーバー状態を確認する|有効化・アクセス制限・スコアボードの読み方

Apache の mod_status を有効にすると、/server-status というページで「今いくつのリクエストを処理中か」「空いている処理枠はいくつか」「どの URL に時間がかかっているか」をリアルタイムに確認できます。サイトが重くなったときに、原因が Apache の処理枠不足なのか、PHP やデータベースの遅さなのかを切り分ける最初の手がかりになります。この記事では、有効化の手順、公開してはいけない理由とアクセス制限、WordPress の .htaccess と衝突したときの対処、スコアボードの読み方を説明します。

mod_status で分かること

server-status ページには、主に次の情報が表示されます。

  • サーバーの稼働時間、累計アクセス数、1秒あたりのリクエスト数や転送量
  • 処理中のリクエスト数と、待機中(空き)のワーカー数
  • スコアボード:各処理枠(スロット)が今どの状態にあるかを1文字で並べた一覧
  • 個々の処理中リクエストの詳細:接続元 IP、VirtualHost、リクエストされた URL、経過時間など

最後の詳細表示は ExtendedStatus が On のときに出ます。Apache 2.4 では mod_status を読み込むと既定で On になりますが、明示的に書いておくと設定の意図が分かりやすくなります。なお ExtendedStatus は graceful(reload)では切り替わらないため、変更したときは restart が必要です。

有効化する

Debian/Ubuntu 系

多くの環境で、mod_status は最初から有効になっています。設定は /etc/apache2/mods-enabled/status.conf にあり、標準ではサーバー自身(localhost)からのアクセスだけが許可されています。

sudo a2enmod status
cat /etc/apache2/mods-enabled/status.conf

RHEL/AlmaLinux 系

モジュール自体は標準で読み込まれていることが多い一方、/server-status の URL は標準では用意されていないことが一般的です。/etc/httpd/conf.d/status.conf を作って次のように書きます。

ExtendedStatus On

<Location "/server-status">
    SetHandler server-status
    Require local
    # 管理用の固定IPから見る場合(例)
    # Require ip 203.0.113.10
</Location>

Require local はサーバー自身からの接続だけを許可します。社内の固定 IP から見たい場合は Require ip を加えます。変更後は構文を確認して反映します。

sudo apachectl configtest
sudo systemctl restart httpd   # Debian/Ubuntu系は apache2

アクセス制限を緩めてはいけない理由

server-status には、処理中のリクエストの URL、接続元 IP アドレス、VirtualHost 名が表示されます。URL のクエリ文字列に含まれる値や、公開していない管理画面のパス、サーバー上で動いている別サイトの存在も読み取れてしまいます。インターネット全体に公開するのは避け、許可する接続元を絞ります。

特に注意したいのが、同じサーバー上の Nginx などをリバースプロキシとして Apache の前に置いている構成です。この場合、Apache から見るとすべてのリクエストが 127.0.0.1 から来るため、Require local だけでは外部の訪問者にも server-status が見えてしまいます。前段のプロキシ側で /server-status への外部からのアクセスを拒否する、または Apache 側で管理専用のポートや VirtualHost に分けるといった対策を取ります。設定後は、外部の回線からアクセスして 403 や 404 になることを確かめておきます。

WordPress のサイトで 404 になる場合

WordPress をドキュメントルートに置いていると、/server-status を開いたのに WordPress の 404 ページが表示されることがあります。WordPress の .htaccess は「実在しないファイルやディレクトリへのリクエストを index.php に渡す」書き方になっており、server-status も実在するファイルではないため、WordPress 側に渡されてしまうのが原因です。

.htaccess の # BEGIN WordPress より前に、次の行を加えると server-status を書き換えの対象から外せます。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^server-status$ - [L]
</IfModule>

# BEGIN WordPress から # END WordPress の間は、パーマリンク設定を保存したときに WordPress が書き換えるため、その外に書きます。.htaccess を編集する前にはバックアップを取っておきます。

サーバー内から確認する

ブラウザで見る以外に、サーバーに SSH でログインして curl で取得できます。?auto を付けると、監視ツールで扱いやすい「項目名: 値」の形式で出力されます。

curl -s http://127.0.0.1/server-status?auto

ブラウザで見る場合は ?refresh=5 を付けると5秒ごとに自動更新されるため、負荷がかかっている間の変化を追いやすくなります。

Zabbix や Prometheus(apache_exporter)、Netdata などの監視ツールにも、mod_status の ?auto 出力を読み取って Apache の状態をグラフ化する仕組みがあります。テンプレートや設定の名称はツールのバージョンで変わるため、各ツールのドキュメントで確認してください(2026年10月現在)。

スコアボードの読み方

スコアボードは、処理枠1つにつき1文字で状態を表します。よく見る文字は次のとおりです。

  • _:接続待ち(空いている処理枠)
  • W:応答を送信中。PHP の処理を待っている間もこの状態になる
  • R:リクエストを読み込み中
  • K:KeepAlive で次のリクエストを待機中
  • C:接続を閉じている途中
  • G:graceful の再起動後、処理中のリクエストを終えるのを待っている
  • .:プロセスがまだ起動していない枠

空き(_)がほとんど無い

処理枠が足りていない状態です。エラーログに MaxRequestWorkers の上限に達したという内容のメッセージが出ていないかを確認します。

sudo grep -i "MaxRequestWorkers" /var/log/apache2/error.log   # RHEL系は /var/log/httpd/error_log

上限に達しているなら、メモリに余裕がある範囲で MaxRequestWorkers を見直します。ただし、処理枠を増やす前に、1件あたりの処理が遅くなっていないかを先に見ます。

W が多く、同じ URL に長い時間がかかっている

ExtendedStatus の詳細表示で、経過時間が長いリクエストの URL を確認します。WordPress なら、特定のページや管理画面の操作、xmlrpc.php や wp-login.php への大量のアクセスが原因になっていることがあります。PHP-FPM を使っている場合、Apache の W には FPM の処理待ちも含まれるため、PHP-FPM のステータスページやスローログもあわせて確認すると原因を絞り込めます。

K が大半を占めている(prefork の場合)

prefork MPM では、KeepAlive で待機している間も処理枠を1つ占有します。KeepAliveTimeout が長すぎると、実際には処理していない接続で枠が埋まります。KeepAliveTimeout を短くするか、event MPM への切り替えを検討します。

event MPM の場合

event MPM では、スコアボードに加えて接続の状態をまとめた表が表示されます。KeepAlive 中の接続は処理用のスレッドを占有しないため、prefork と同じ基準で K の数を判断しないよう注意します。

まとめ

  • mod_status を有効にすると /server-status で処理中のリクエスト数、空きワーカー数、スコアボードを確認できる
  • URL や接続元 IP が表示されるため、Require local や Require ip でアクセス元を絞る。前段にリバースプロキシがある構成では Require local だけでは不十分
  • WordPress の 404 になる場合は、.htaccess の WordPress ブロックより前で server-status を書き換えの対象から外す
  • ?auto で監視ツール向けの出力、?refresh=秒数 で自動更新ができる
  • 空きが無ければ処理枠不足、W が長ければ PHP やデータベース、prefork で K が多ければ KeepAliveTimeout を疑う

お気軽にご相談ください

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