Apache のモニタリングと言えば mod_status
を有効にして /server-status?auto
にアクセスする方法が一般的にだと思います。
これは簡単でよいのですが MaxClients
いっぱいまでリクエストが入ってこれ以上リクエストを受け付けられないような状態になると /server-status?auto
にアクセスできずにモニタリングそのものができなくなります。(そもそもそういう状況を作ってはならないのですが、まあそれはとりあえず。)
server-status
用にワーカーを1つ予約できれば簡単なのですが、そういう設定は Apache にはないようです。もう少し探していると ScoreBoardFile
という設定があることに気づきました。この設定にファイルを指定すれば、他のプロセスから統計情報にアクセスできるようです。
実際に FableTech Server Status for Apache というものがあり、これを使えば統計情報の内容を出力してくれます。ただ、これは C 言語で書かれて出力はもう少し加工したいので Python でアクセスするスクリプトを書いてみました。
https://github.com/jun66j5/apache-scoreboard/raw/master/apache-scoreboard.py
Apache の統計情報には ScoreBoardFile
に指定したファイ名を apr_shm_attach()
に渡すことで共有メモリにアクセスできます。このあたりは ctypes
ライブラリを用いています。
スクリプトを試す前に以下のような設定を行いましょう。
LoadModule status_module modules/mod_status.so ExtendedStatus On ScoreBoardFile run/httpd.scoreboard
実際に試してみます。このスクリプトでは /server-status?auto
と同じ出力が得られるようにしてあります。
$ sudo python ./apache-scoreboard.py /etc/httpd/run/httpd.scoreboard Total Accesses: 2147 Total kBytes: 17961 Uptime: 5641 ReqPerSec: 0.380555 BytesPerSec: 3260.07 BytesPerReq: 8566 BusyWorkers: 0 IdleWorkers: 50 Scoreboard: ................................................................_________________________......................................................................................................._________________________.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
比較用に /server-status?auto
の出力も上げておきます。
$ curl 'http://127.0.0.1/server-status?auto' Total Accesses: 2148 Total kBytes: 17970 CPULoad: .0266784 Uptime: 5660 ReqPerSec: .379505 BytesPerSec: 3251.11 BytesPerReq: 8566.7 BusyWorkers: 1 IdleWorkers: 49 Scoreboard: ................................................................__W______________________......................................................................................................._________________________.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
もっと細かい出力や監視サーバにデータを投げたい場合などは show_scoreboard()
を変更するとよいです。