HTTP Proxy経由でのweb監視について

はじめまして、佐藤と申します。
お世話になっております。

監視設定について質問があります。
ご協力いただけますと幸いです。

【背景】
HTTP Proxy経由でweb監視をしたいと思っております。

【参考資料】
下記ページ等を参考に試行錯誤してみましたが上手くいきません。

9. WEB監視
http://www.zabbix.com/documentation/jp/1.8/manual/web_monitoring

proxyサーバー経由でのURL監視について
http://www.zabbix.jp/modules/newbb/viewtopic.php?topic_id=176&forum=6

Web monitoring via a proxy
http://www.zabbix.com/forum/showthread.php?t=11475

【施策状況】
(施策1)Zabbixユーザにhttp_proxy環境変数を設定
 (シェルはnologinから試験的にbashに変更しています。)
# finger zabbix
Login: zabbix Name: Zabbix Monitoring System
Directory: /var/lib/zabbix Shell: /bin/bash

# tail -1 /etc/bashrc
export http_proxy="http://localhost:3128/"

(施策2)UserParameterを設定
# tail -1 /etc/zabbix/zabbix_agentd.conf
UserParameter=url[*],http_proxy="http://localhost:3128" wget -T 3 --spider $1; echo "$?

(結果)施策1、施策2とも接続エラーになりました
# tail -1 /var/log/zabbix/zabbix_server.log
12896:20100930:085145.920 Error doing curl_easy_perform [a timeout was reached]

【質問事項】
(質問1)
/etc/bashrcに指定しても反映されないのでしょうか。
http_proxy環境変数の設定箇所をご教授願えますでしょうか。

(質問2)
UserParameterの設定値等についてご教授願えますでしょうか。

【Proxy環境】
ProxyサーバはSquidを使用して自前(ZABBIXと同じサーバ)で立てています。
Proxy認証はなく、以下のコマンドで接続確認できています。
$ lynx http://(監視先webアドレス)
$ curl http://(監視先webアドレス)

【web監視】
Proxyを経由しないで別サーバへのweb監視は問題なく出来ています。

【環境】
Cent OS 5.5 (2.6.18-194.11.4.el5)
ZABBIX 1.8.3-1.el5.JP

# yum list installed | grep zabbix
zabbix.x86_64 1.8.3-1.el5.JP installed
zabbix-agent.x86_64 1.8.3-1.el5.JP installed
zabbix-jp-release.noarch 5-3 installed
zabbix-server.x86_64 1.8.3-1.el5.JP installed
zabbix-server-mysql.x86_64 1.8.3-1.el5.JP installed
zabbix-web.x86_64 1.8.3-1.el5.JP installed
zabbix-web-mysql.x86_64 1.8.3-1.el5.JP installed

以上、よろしくお願いいたします。

コメント表示オプション

お好みのコメント表示方法を選び「設定の保存」をクリックすると変更が反映されます。
ユーザー TNK の写真

細かいことですが、最後の「"」が足りていないということはありませんか?
<code>
UserParameter=url[*],http_proxy="http://localhost:3128" wget -T 3 --spider $1; echo "$?"
</code>
あと、こののUserParameterを利用して起動されるものを手動で実行して確認されましたか?

もしかしたら、以下のようにwgetコマンドの出力を/dev/nullに送らないと駄目かもしれません。
<code>
UserParameter=url[*],http_proxy="http://localhost:3128" wget -T 3 --spider $1 > /dev/null 2>&1; echo "$?"
</code>

ユーザー ken16 の写真

TNK様

ご回答いただき、ありがとうございます。
返信が遅くなり申し訳ありませんでした。

> 細かいことですが、最後の「"」が足りていないということはありませんか?
> UserParameter=url[*],http_proxy="http://localhost:3128" wget -T 3 --spider $1; echo "$?"

申し訳ありません。ご指摘の通り、最後の「"」が足りていませんでした。
しかし、最後の「"」を追加しても接続できません。

> あと、このUserParameterを利用して起動されるものを手動で実行して確認されましたか?

はい。コマンドライン上から以下のように試してみましたら、取得できました。(注釈1)

$ http_proxy="http://Proxyサーバ名:ポート番号/" wget --proxy-user="Proxyユーザ名" --proxy-password="Proxyユーザのパスワード" -T 3 --spider http://(監視先webアドレス); echo "$?"
スパイダーモードが有効です。リモートファイルが存在してるか確認します。
--2010-10-01 18:22:54-- http://(監視先webアドレス)
Proxyサーバ名:ポート番号 に接続しています... 接続しました。
Proxy による接続要求を送信しました、応答を待っています... 200 OK
長さ: 1113 (1.1K) [text/html]
リモートファイルが存在し、さらなるリンクもあり得ますが、再帰が禁止されています -- 取得しません。

0

> もしかしたら、以下のようにwgetコマンドの出力を/dev/nullに送らないと駄目かもしれません。
> UserParameter=url[*],http_proxy="http://localhost:3128" wget -T 3 --spider $1 > /dev/null 2>&1; echo "$?"

以下のように設定してみましたが、接続できません。

$ tail -1 /etc/zabbix/zabbix_agentd.conf
UserParameter=url[*],http_proxy="http://Proxyサーバ名:ポート番号/" wget --proxy-user="Proxyユーザ名" --proxy-password="Proxyユーザのパスワード" -T 3 --spider $1 > /dev/null 2>&1; echo "$?"

また、試しに以下のように設定してみましたが、同様に接続できません。

$ tail -1 /etc/zabbix/zabbix_agentd.conf
UserParameter=url[*],wget -e 'http_proxy=http://Proxyサーバ名:ポート番号/' --proxy-user="Proxyユーザ名" --proxy-password="Proxyユーザのパスワード" -T 3 --spider $1 > /dev/null 2>&1; echo "$?"

以上、引き続きアドバイス等を頂けますと幸いです。
お手数をおかけしますが、よろしくお願いいたします。

----------------------------------------------------------------------------------------------------
(注釈1)
コマンドライン上からwgetを試してみたところ、ローカルのProxyサーバ経由では
以下のように上手く接続できませんでしたので、別のProxyサーバ経由(要認証)に変更しました。

# http_proxy="http://localhost:3128" wget -T 3 --spider http://(監視先webアドレス)
スパイダーモードが有効です。リモートファイルが存在してるか確認します。
--2010-10-01 18:40:43-- http://(監視先webアドレス)
localhost をDNSに問いあわせています... 127.0.0.1
localhost|127.0.0.1|:3128 に接続しています... 接続しました。
Proxy による接続要求を送信しました、応答を待っています... ヘッダ内で読み込みエラー(接続が タイムアウトしました)です
再試行しています。

lynxの場合には、以下のようにローカルのProxyサーバ経由でも接続できたのですが、wgetでは上手く接続できませんでした。
wgetとlynxで接続/設定方法に何か違いがあるのでしょうか…本件とは別の問題になってきますが。

# http_proxy="http://localhost:3128" lynx http://(監視先webアドレス)

ユーザー TNK の写真

申し訳ありませんが、「接続できません」と書かれていますが、何がどう接続されないのか、どのような現象が確認できているのかが全くわかりません。
もう少し具体的に、どのような現象が発生しているのかお教え下さい。

私の方でも実際に、認証はありませんがProxy経由で確認するようUserParameterを以下のように設定して確認してみました。
<code>
UserParameter=url[*],http_proxy="http://Proxyサーバ名:ポート番号" wget -T 3 --spider $1 > /dev/null 2>&1; echo "$?"
</code>
これで、アイテムのキーに、
<code>
url[http://www.google.co.jp/]
</code>
を指定することで引数を変更して正常に取得できるときは「0」、取得できないときは「1」という整数値が取ることができています。

ここまで、ken16さんはアイテムに関して何も書かれていませんが、アイテムにはどのように設定されているのですか?

# wgetとlynxの違いに関してはわかりません。

ユーザー ken16 の写真

TNK様

早速のご回答、ありがとうございます。
現象等について詳細をお伝えしておらず、申し訳ありませんでした。

現象としては、最初の問合せの時に記載しましたが
Zabbixサーバのログに以下のように出力されます。

# tail -1 /var/log/zabbix/zabbix_server.log
12896:20100930:085145.920 Error doing curl_easy_perform [a timeout was reached]

また、Web画面上では、「ステータス」が以下になります。

失敗 - エラー: couldn't connect to server

シナリオの定義は以下です。
 Basic認証:なし
 エージェント:Internet Explorer 6.0 on Windows XP SP2 with .NET Framework 2.0 installed
 変数:(空欄)
 ステップ
  URL:http://(監視先webアドレス)
  POST:(空欄)
  要求文字列:(空欄)
  ステータスコード:200

TNK様の環境では出来ているということですので、こちらの環境依存で
上手く設定できていないということですね。

ユーザー TNK の写真

申し訳ありません。最初のご質問にあった「背景」を読み違えておりました。

シナリオということは、Web監視(「設定」->「ウェブ」の画面で設定するもの)ですね?
Web監視と私が設定したUserParameterは全く別物です。
UserParameterを利用して監視するのは、ホストに対応付けて利用する「アイテム」で利用するためのものです。

Web監視の際にProxy経由で行うのであれば、以下のURLにもある通り、http_proxy環境変数の設定が必要です。
http://www.zabbix.com/documentation/jp/1.8/manual/web_monitoring

UserParameterは、全く関係ありません。

ということで、

(施策1)Zabbixユーザにhttp_proxy環境変数を設定

を実現することが必要になります。

具体的な手順は実際に確認できていません。
環境が用意できたらちょっとやってみます。

ユーザー ken16 の写真

TNK様

早速のご回答ありがとうございます。

シナリオということは、Web監視(「設定」->「ウェブ」の画面で設定するもの)ですね?

はい。「設定」->「ウェブ」の画面で設定しております。

Web監視と私が設定したUserParameterは全く別物です。
UserParameterを利用して監視するのは、ホストに対応付けて利用する「アイテム」で利用するためのものです。

こちらとしましてもZABBIXに関して詳しく理解できておらず、お手数をおかけして申し訳ありませんでした。

具体的な手順は実際に確認できていません。
環境が用意できたらちょっとやってみます。

環境変数の設定が必要とのこと、了解しました。
色々とご協力いただき、大変ありがとうございます。

ユーザー TNK の写真

いくつか設定方法を試してみましたが、/etc/init.d/zabbix-server の最初の方に、
<code>
export http_proxy=http://localhost:3128/
</code>
を追記してzabbix_serverを再起動することで、Web監視(「設定」->「ウェブ」の画面で設定するもの)がHTTP Proxy経由でチェックを行うようになりました。

あまり綺麗な方法ではないかもしれませんが、こういう方法もあるということでご報告致しました。

蛇足になってしまうかもしれませんが、ユーザIDとパスワードを入力して、次の画面に遷移するためのパラメータを送信して次の画面に遷移してというようなシナリオを必要としないようなレベルでの監視の場合は、Web監視以外にもいくつかの方法で監視する方法があります。

簡単にいくつか挙げておくと、

 ・httpdのプロセスが起動している
 ・httpdにアクセスするための80番ポートにTCPで接続できる
 ・httpdにアクセスして静的ページを取得する

というような方法です。
詳細は、Zabbixの書籍やZabbixの紹介記事などをご参照ください。

ユーザー ken16 の写真

TNK様

度々のご回答ありがとうございます。
ご連絡が遅くなり、申し訳ありませんでした。

TNK様の提示頂きましたように「/etc/init.d/zabbix-server」に
環境変数設定したところ、HTTP Proxy経由で正常にウェブ監視接続できました。
大変ありがとうございました。

また、代替監視方法をご教授いただき、ありがとうございます。

実のところ、ZABBIXを使用するのは今回が初めてのため、
書籍やWEB等で勉強したいと思います。

色々とありがとうございました。

ユーザー heya の写真

こんにちは。

とりあえずは目的は果たせているようなのですが、少し気になったことを。

/etc/init.d/zabbix-serverを書き換えたのであれば、Zabbixをバージョンアップしたらおそらくこのファイルも更新されるので、そのときは再度同様に書き換える必要がある、ということを頭の隅に置いておいてください。

それから、/etc/bashrcに書いたが反映されないということについて。
試したわけではないのですが、zabbixユーザーのホームディレクトリ(CentOSで、yumでインストールしたなら/var/lib/zabbix?)内の.bachrcか.bash_profileで設定すればいいんじゃないかと思います(違っていたらごめんなさい)。普通はユーザーのホームディレクトリには.bashrcが存在していて、その中に<code>if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi</code>と書かれているので/etc/bashrcの内容も読み込まれるわけですが、/var/lib/zabbixには.bashrcなど存在していない(というか、このディレクトリ自体存在していなかったような・・・)ので/etc/bashrcももちろん読まれない、ということではないかと思っています。

ついでにいうと、.bash_profileには<code>if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi</code>と書かれていることが多いです。

Web監視の場合は、.bashrcと.bash_profileどっちが読まれるんでしょうね。その辺はよく分かりません。あと、シェルがnologinならどうなんだろう?とか。時間があるならあれこれ試してみるのもいいかもしれません。

ユーザー TNK の写真

heyaさんが書かれている通り、RPMでインストールされたものを手で変更すると、今後のアップデートでそのファイルが更新されなかったりするのでご注意下さい。
# なので変更しない方法を模索したのですが.....。:-(

試したわけではないのですが、zabbixユーザーのホームディレクトリ(CentOSで、yumでインストールしたなら/var/lib /zabbix?)内の.bachrcか.bash_profileで設定すればいいんじゃないかと思います(違っていたらごめんなさい)。

とりあえず覚えている範囲で状況をお伝えしておきます。

まず、/var/lib/zabbixというディレクトリがなかったので作成し、ログインシェルをデフォルトの/sbin/nologinから/bin/bashに変更した状態で.bash_profileに環境変数を設定する記述を行いましたが反映されませんでした。
.bashrcでもやってみますか。

--- 追記 ---
zabbixユーザのシェルを/bin/bashにして、ホームディレクトリに.bashrcを配置し、その中に環境変数を設定してみましたが駄目でした。

/etc/profile.dディレクトリ以下に、zabbix.shという環境変数を設定するスクリプトを作成して配置してみましたが、全ユーザで環境変数に初期設定されるようにはなったようですが、zabbix_serverのWeb監視にはききませんでした。

ユーザー heya の写真

だめなのか・・・。

TNKさん、試してくださったんですね、ありがとうございます。
で、よくよく起動スクリプトを見てみると、suとかでユーザーを変更して起動しているわけではなさそうです。そして、ソースを見てみると、src/libs/zbxnix/daemon.cの中にsetuidとかseteuidとかいう文字があります。つまり、zabbixユーザーでログインしているわけではなく、起動スクリプトを実行したときの環境変数がそのまま引き継がれそうな気がします。
なので、やはり起動スクリプト内で設定するか、それか起動スクリプトを実行するrootの環境変数で設定するのでもいいんじゃないかなと思いました(試したところボツになりましたが・・・)。

案1:起動スクリプトでは/etc/sysconfig/networkを読み込んでいるようなので、ここに書いてみる
→他のプログラムにも影響を与える可能性あり

案2:/root/.bashrcに書いてみる
→.bashrcを読み込みなおしてから手動で/etc/init.d/zabbix-serverを実行したら大丈夫そう、マシンの再起動時はだめっぽい(ログインという操作が無いので.bashrcなども読まれないのかな)
→initとか/etc/rcとかその辺りが関係しそうだが、下手にいじりたくないのでこの案はボツ

案3:バージョンアップのたびに書き換えるのでいいから、やっぱり/etc/init.d/zabbix-serverに書く

案4:環境変数を設定してから引数をそのまま起動スクリプトに渡すzabbix-server2みたいな起動スクリプト(※)を作り、zabbix-serverの代わりにそれを起動させる・・・こんな感じ
root# vi /etc/init.d/zabbix-server2
root# chmod a+x zabbix-server2
root# chkconfig zabbix-server off
root# chkconfig zabbix-server2 on
↓↓zabbix-server2の例↓↓
<code>#! /bin/sh
# chkconfig: - 85 15
# description: zabbix server daemon

### BEGIN INIT INFO
# Provides: zabbix
# Required-Start: $local_fs $network
# Required-Stop: $local_fs $network
# Default-Start:
# Default-Stop: 0 1 2 3 4 5 6
# Short-Description: start and stop zabbix server
# Description: Zabbix Server
### END INIT INFO

export http_proxy=http://localhost:3128/
/etc/init.d/zabbix-server $*</code>
※要はラッパーです。END INIT INFOまではオリジナルのコピーです。

でも、実際どうするのが一般的なんでしょうかね。

<以下余談>
http://jo1upk.blogdns.net/linux/?Linux%2F%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%81%AE%E8%A8%AD%E5%AE%9A#n9c0f4ad
ここによると、
/etc/bash_profile→/etc/profile.d/*.sh→/etc/bashrc→~/.bash_profile→~/.bashrc
の順に読み込むと書いてあります。そいうものなのか、と思って今度はman bashを見ると、
/etc/profile→~/.bash_profile→~/.bash_login→~/.profile→~/.bashrc
という流れのようです(ログインの場合)。そして/etc/bashrcの中を見ると、/etc/profile.d/*.shを順番に読み込んでいくようになっています。/etc/bashrcや/etc/bash_profileは読まない???
うーん、ややこしい・・・。