Zabbix で マルチスレッドな Apache のリクエスト数を監視する方法

Zabbix
Zabbix
スポンサーリンク

Zabbix で Apache httpd のプロセス数をリクエスト数の目安として監視することがあります。これは1つのプロセスで1つのリクエストを処理する prefork で Apache httpd を動作させている場合では有効なのですが、1つのプロセスで複数のリクエストを処理するマルチスレッドな worker や event の場合は、リクエスト数の目安とはなりません。そこで今回は、Zabbix で マルチスレッドな Apache httpd のリクエスト数を監視する方法をまとめてみました。

prefork と event のプロセス数の違い

下はとある WEBサーバーの httpd プロセス数の監視データです。Apache httpd の動作モードを prefork から event に変更した後はプロセス数がほぼ一定になりますので、これをリクエスト数の目安とすることはできなくなります。

httpd プロセス数の監視データ

server-status の設定

Apache httpd の活動状況と性能に関する情報を提供してくれる server-status から、リクエスト数を取得できますので、こちらを利用します。

mod_status の有効化

まず server-status を動作させるために必要な mod_status(モジュール識別子:status_module)が有効なことを確認します。

$ httpd -M | grep status_module
status_module (shared) ←有効

有効になっていない場合は、Apache の設定ファイルで mod_status を読み込むように設定します。

#LoadModule status_module modules/mod_status.so
  ↓
LoadModule status_module modules/mod_status.so

server-status の出力設定

server-status をローカルホストからのみ取得できるように設定します。

バーチャルホストを使っている場合は、下のコードを先頭のバーチャルホストとして httpd.conf 設定ファイルに追加します。(バーチャルホストを使っていない場合は Location ディレクティブの部分のみ追加してください)

・Apache 2.4 用

ExtendedStatus Off
<VirtualHost *:80>
    ServerName server-status
    <Location /server-status>
        SetHandler server-status
        Require ip 127.0.0.1
        Require all denied
    </Location>
</VirtualHost>

・Apache 2.2 用

ExtendedStatus Off
<VirtualHost *:80>
    ServerName server-status
    <Location /server-status>
        SetHandler server-status
        Order deny,allow
        Deny from all
        Allow from localhost
    </Location>
</VirtualHost>

Apache を再起動します。

$ sudo systemctl restart httpd

server-status を取得してみます。

$ curl http://127.0.0.1/server-status?auto
 
BusyWorkers: 1
IdleWorkers: 9
Scoreboard: __W_______....................

出力の意味は次の通りです。BusyWorkers の値がリクエスト数の目安になります。

BusyWorkers
 リクエスト処理実行中のプロセスもしくはスレッド数

IdleWorkers
 リクエスト処理待ち状態のプロセスもしくはスレッド数

Scoreboard
 サーバーの稼働状況

今回は ExtendedStatus を「OFF」にしているため、取得できる項目が少ないですが、これを「ON」にすると、下のような情報も取得することができます。(ただしサーバーの動作を遅くする可能性があります)

参考資料:https://httpd.apache.org/docs/2.4/en/mod/core.html#extendedstatus

・ExtendedStatus が「ON」の場合

$ curl http://127.0.0.1/server-status?auto
 
Total Accesses: 2
Total kBytes: 1
Uptime: 16
ReqPerSec: .125
BytesPerSec: 64
BytesPerReq: 512
BusyWorkers: 1
IdleWorkers: 9
Scoreboard: _____W____...........

server-status 取得スクリプト作成

続いて server-status の情報を Zabbix で取得するためのスクリプトを作成し、それをユーザーパラメータとして登録します。スクリプトは server-status の出力設定を行った 監視される側のサーバーに作成します。

スクリプトの作成

適当な場所にスクリプトの保存先を作成します。

$ sudo mkdir /etc/zabbix/bin

server-status の情報を取得するスクリプトを作成します。
sudo vi /etc/zabbix/bin/get_server_status.sh

#!/bin/sh -
export PATH="/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin"
export LANG=C
curl -s http://127.0.0.1/server-status?auto | grep "${1}" | awk -F':' '{print$2}'
exit 0

オーナーを zabbix に変更して、実行権限を付けます。

$ sudo chown zabbix /etc/zabbix/bin/get_server_status.sh
$ sudo chmod 700 /etc/zabbix/bin/get_server_status.sh

スクリプトの動作を確認します。引数に取得したい server-status の項目名を指定してください。

$ sudo -u zabbix /etc/zabbix/bin/get_server_status.sh BusyWorkers
1 ←(なにかしら値が表示されればOK)

ユーザーパラメータの登録

作成したスクリプトを Zabbixエージェントの設定ファイルに、ユーザーパラメータ(UserParameter)として登録します。

sudo vi /etc/zabbix/zabbix_agentd.conf
(最終行に下記を追加)

UserParameter=apache.server_status[*],/etc/zabbix/bin/get_server_status.sh "$1"

ユーザーパラメータの構文については「4 ユーザーパラメータ | Zabbix Documentation 2.2」をご参照ください。

Zabbixエージェントを再起動します。

$ sudo systemctl restart zabbix-agent

Zabbixサーバー上で zabbix_get コマンドを実行して server-status の値が取得できることを確認します。

$ zabbix_get -s <監視ホストのIPアドレス> -k apache.server_status["BusyWorkers"]
1 ←(なにかしら値が表示されればOK)

server-status 監視テンプレートの作成

続いて、Zabbix の管理画面でテンプレートを作成します。このテンプレートのアイテムに先ほど設定したユーザーパラメータ「apache.server_status」を登録します。

テンプレート名など、各種の名称は任意です。ご自身が分かりやすい名称を設定してください。

テンプレートの作成

[設定]→[テンプレート]→[テンプレートの作成]をクリックします。

[テンプレート]タブを選択 適当なテンプレート名とグループを入力または選択し、下の方にある「追加」ボタンをクリックしてテンプレートを作成します。


 ↓

アイテムの作成

作成したテンプレートにアイテムを追加します。今回は server-status の「BusyWorkers」と「IdleWorkers」の値を取得するアイテムを設定します。

[設定]→[テンプレート] 「My Template Apache ServerStatus」行の「アイテム」をクリックします。

「アイテムの作成」をクリックします。

以下を設定し「追加」をクリックします。キーに渡す引数「BusyWorkers」は、「"」ダブルクオートで囲ってください。(シングルクオートは文字として扱われます)また、名前の「$1」には、キーに渡す引数「BusyWorkers」が表示されます。


---(設定箇所)---------------------------
名前:Apache server-status $1
タイプ:Zabbixエージェント
キー:apache.server_status["BusyWorkers"]
データ型:数値(整数)
更新間隔(秒):60
------------------------------

同様に「IdleWorkers」を取得するアイテムを作成します。同じようなアイテムを作成する場合は、先に作成したアイテムを複製して異なる部分のみ設定するのが便利です。

---(設定箇所)---------------------------
名前:Apache server-status $1
タイプ:Zabbixエージェント
キー:apache.server_status["IdleWorkers"]
データ型:数値(整数)
更新間隔(秒):60
------------------------------

グラフの作成

BusyWorkers アイテムを表示するグラフを作成します。

[設定]→[テンプレート] 「My Template Apache ServerStatus」行の「グラフ」をクリックします。

「グラフの作成」をクリックします。

適当なグラフ名を入力し、アイテムの「追加」をクリックします。

「Apache server-status BusyWorkers」アイテムを選択し「選択」をクリックします。

グラフの形式や色などを調整して「追加」ボタンをクリックします。


---(設定箇所)---------------------------
名前:Apache server-status BusyWorkers
アイテム:Apache server-status BusyWorkers
グラフの形式:グラデーションライン
色:F63100
------------------------------

同様に IdleWorkers アイテムを表示するグラフを作成します。

---(設定箇所)---------------------------
名前:Apache server-status IdleWorkers
アイテム:Apache server-status IdleWorkers
グラフの形式:グラデーションライン
色:1A7C11
------------------------------

テンプレートの適用

最後に監視対象のホストに作成したテンプレートを適用します。

[設定]→[ホスト] 監視対象のホスト名をクリックします。

「テンプレート」タブを選択し、「新規テンプレートをリンク」枠の「選択」をクリックします。

先ほど作成した「My Template Apache ServerStatus」テンプレートにチェックを入れて「選択」ボタンをクリックします。

「新規テンプレートをリンク」枠の「追加」をクリックします。

「テンプレートとのリンク」枠に「My Template Apache ServerStatus」が表示されたことを確認し「更新」をクリックします。

以上でホストにテンプレートが適用されました。しばらく待って server-status の各種値が取得できていればOKです。

[監視データ]→[概要] タイプ「データ」を選択

BusyWorkers(リクエスト数)と httpd プロセス数のグラフを比較してみると、1つのプロセスで複数のリクエストを処理していることがよくわかります。

おわりに

Apache httpd で HTTP/2 を使う場合は prefork が使えないこともあって、ここ最近マルチスレッドな event を使うことが多くなってきました。Zabbixの監視設定も対応しておきたいですね。

コメント

タイトルとURLをコピーしました