2013年6月21日金曜日

【chef】ZabbixでApacheを監視する方法

■環境
CentOS 6.2 64bit
Zabbix Server 2.0.7
Apache 2.2.15

またインストールはすべてchefで実施しているものとする
 http://kakakikikeke.blogspot.jp/2013/05/opscodecookbooks.html
python はデフォルトで CentOS 6.2 にインストールされているものを使用します

■mods_statusを有効にする(apacheサーバ側設定)
vi /etc/httpd/mods-available/status.conf
ExtendedStatus On
On に変更します
一旦 httpd を再起動してください
そもそも/etc/httpd/mods-available/に対してstatus.confとstatus.loadのシンボリックリンクがない場合は以下を実行してリンクを作成してください
cd /etc/httpd/mods-available/
ln -s /etc/httpd/mods-available/status.conf status.conf
ln -s /etc/httpd/mods-available/status.load status.load

デフォルトでは「Allow from localhost ip6-localhost」でローカルからのみアクセスできるようになっています
curl http://localhost/server-status
で Forbidden 等でなくサーバの情報が返ってくることを確認しましょう
逆にローカルじゃない環境からブラウザ等でアクセスしてステータス画面が表示されないことを確認します

■監視スクリプト配備(apacheサーバ側設定)
mkdir /root/zabbix_apache_watch
cd zabbix_apache_watch
wget https://raw.github.com/gpmidi/zabbix-apache-stats/master/bin/fetch.py
python fetch.py --help
でヘルプが表示されることを確認します
(python の syntacs エラー等にならないことを確認します)

crontab -e
* * * * * /usr/bin/python /root/zabbix_apache_watch/fetch.py -c localhost -z [ZabbixサーバのIPまたはホスト名] > /dev/null 2>&1
1分おきにZabbixサーバに送信するように設定します
pythonのPATHが不明なときは「which python」でPATHを調べておいてください

vi fetch.py
でzabbix_senderのパスを187行目あたりの以下で管理しているのでchefでインストールしたパスに変更します
default = "/usr/bin/zabbix_sender"
↓
default = "/opt/zabbix/bin/zabbix_sender"

■スクリプト動作確認(apacheサーバ側)
telnet 等を使ってzabbixサーバと10051で通信できるか確認します
通信が確認できたら実際にpythonスクリプトを実行してみましょう
/usr/bin/python /root/zabbix_apache_watch/fetch.py -c localhost -z [ZabbixサーバのIPまたはホスト名]

zabbix_sender [6393]: DEBUG: answer [{
"response":"success",
"info":"Processed 0 Failed 19 Total 19 Seconds spent 0.000377"}]
info from server: "Processed 0 Failed 19 Total 19 Seconds spent 0.000377"
sent: 19; skipped: 0; total: 19
上記のようにsenderの出力結果が表示されればOKです

■Zabbixサーバテンプレート登録(zabbixサーバ側)
https://www.zulukilo.com/svn/pub/zabbix-apache-stats/trunk/zabbix_export.xml
からXMLのテンプレートをダウンロードしてください
リンクが存在しない場合は以下の参考サイトにあるページにXMLが書いてあるのでコピペして保存します

保存したらZabbixのWebインタフェースから
設定→テンプレート→インポートの順に進みます(インポートボタンは画面右上にあります)
インポートするファイルで先ほどダウンロードしたファイルを選択します
「インポートに成功しました」と表示されたら、テンプレートの一覧に「Template_App_Apache_Stats」があることを確認します

■テンプレートとホストの紐付け(zabbixサーバ側)
設定→テンプレートで「ホスト/テンプレート」から紐付けしたいホストを選択します
設定→ホストで紐付けしたホストでアイテムを見ると「Template_App_Apache_Stats」のアイテムが紐付ていることがわかります

■サンプルグラフの作成(zabbixサーバ側)
設定→テンプレート→「Template_App_Apache_Stats」のグラフからグラフの作成を実施します
グラフの名前を「apache総リクエスト数の推移」などとしてグラフタイプを積算グラフにします
追加するアイテムは以下を追加します(色は適当に決めてください)
Template_App_Apache_Stats: Apache - Total Accesses
上記でapacheの総アクセス数を取得することができるようになります

■参考サイト
https://www.zabbix.com/wiki/templates/apache
今回はzabbix_senderを使用した監視方法を紹介しましたが、上記ページでは他のpythonスクリプトやbashスクリプトを使った監視方法も紹介してます

■Tips
・server-statusを閲覧するための専用のVirtualHostを作成する
すでにVirtualHostの設定で複数のドメインを受けるようになっていたり、80番や443番のポートを使用している場合に同じVirtualHostの設定ファイルにserver-statusの設定を書くとapacheのログにserver-stautusともともと設定してあったログが混在して見づらくなります
なので8001番ポートで受けることができる<VirtualHost>の定義をすることでserver-statusを8001番で受けることができます
具体的には以下のような設定ファイルを作成すると個別のポートで受けることが可能になります
vim /etc/httpd/sites-enabled/8001_localhost.conf
<VirtualHost *:8001>
        <Location /server-status>
                SetHandler server-status
                Order allow,deny
                allow from all
        </Location>

        ErrorLog /var/log/httpd/apache_status.log
        LogLevel warn
        CustomLog /var/log/httpd/apache_status.log combined
        ServerSignature On
</VirtualHost>

また合わせて「/etc/httpd/ports.conf」に8001をLISTENする設定も記載してください
Listen 8001
NameVirtualHost *:8001

・シェルスクリプトを使って監視する
今回はpythonスクリプトを使って監視する方法を紹介しましたが、pythonスクリプト方式の場合スクリプトからzabbix_senderを使ってデータを送信しているためpush型の監視になっています
zabbixのpush型監視の場合はzabbixエージェントをactiveモードにしなければいけないほか今回の場合はzabbixサーバ側のログに以下のようなログが出続けてしまうそうです(解決できませんでした)
10714:20131129:164402.604 item [localhost:apache[localhost,WaitingforConnection]] became supported
10715:20131129:164437.619 item [localhost:apache[localhost,WaitingforConnection]] became not supported: ZBX_NOTSUPPORTED
自分の場合30秒起きに出力されてました、なのでこれを解決するためにシェルスクリプトによるapacheの監視方法も簡単に紹介します
基本は同じですが、大きく違うのはpull型の監視でUserParameterを使ってZabbixサーバが値を取得する関し方式になります(pull型は通常のZabbixの監視方式)
  1. https://www.zabbix.com/wiki/templates/apache の一番下にある method3 のシェルスクリプトをコピペしてサーバ上に配置
  2. 同様にZabbixのテンプレートのXMLファイルもあるのでコピペし適当にテキストに保存したあとZabbixのWebUIからテンプレートをインポート(インポート後は適当にホストを紐付けてください)
  3. UserParameter=apache[*],sh /zabbix_script/zapache.sh localhost:8001 $1 のユーザパラメータを「/etc/zabbix/zabbix_agentd.conf」に追記
  4. service zabbix_agentd restart
とするとこれまでのZabbix同様のpull型で監視することが可能です
また、ログにもZBX_NOTSUPPORTEDが出なくなります、zabbix_agentもactiveモードにする必要はありません
どちらも監視できる項目に違いはないのでどちらでやっても問題ないです、UserParameterに慣れている人はシェルスクリプトの方が簡単かもしれません

・おすすめグラフ設定
以下のアイテムを一つのグラフで積算で見ると稼働中のapacheの全プロセス数の数がわかります
  • Apache/ClosingConnection.
  • Apache/DNSLookup.
  • Apache/GracefullyFinishing.
  • Apache/IdleWorkers.
  • Apache/KeepAlive.
  • Apache/Logging.
  • Apache/ReadingRequest.
  • Apache/SendingReply.
  • Apache/StartingUp.
  • Apache/WaitingForConnection.
上記のアイテムをすべて足しあわせた値をトリガーとして設定してapacheに設定してあるMaxCilentの値付近になったらアラートをあげるアクションを登録しておくといいと思います

・リアルタイムでリクエスト数を監視する方法
デフォルトのテンプレートに「apache[ReqPerSec]」というキー名のアイテムがあり、/server-statusから取得しているのですが、
この値は瞬間的なリクエスト数ではなく「apacheが起動してからこれまでのリクエスト数の平均」の値となります
なので例えば瞬間的に1000req/secがあってもこの値で1000は取れません
運用する上でどうしてもリアルタイムなリクエスト数は見えたほうがいいのでそれを取得する方法を紹介します
使うキーは「apache[TotalAccesses]」を使用します
このキーはapacheが起動してから現在までのアクセス数の総数を取得することができます
すでに登録されているapache[TotalAccesses]のアイテムの設定で保存時の計算という項目があります、これを「差分」に変更します
差分に変更することで前回の値を引いた値がアイテムの値として保存されます
apache[TotalAccesses]はこれまでの全アクセス数なので、前回の値を引くことで加算されたアクセス数を取得することができます
取得間隔がデフォルトでは60秒なので60秒の場合は60秒間でのアクセス数を取得することができます
なのでこの値を1秒にすることで限りなくリアルタイムにアクセス数を監視することができるようになります

0 件のコメント:

コメントを投稿