Zabbixを使ってエージェント無しで単純な Webサイト監視だけを行う最短の方法

Zabbixを使ってサーバを監視するには原則として監視対象サーバに専用エージェントをインストールする必要があるが、単純な Webサイト監視であればエージェントをインストールしなくても出来るようになっている。

Zabbixは誰でも無料でインストールして利用できるオープンソースの強力なサーバー監視ツール。 <a href="http://www.zabbix.com/jp/">Zabbix日本語公式サイト</a> Webサイトが正常に閲覧可能な状態かどうかだけひとまず監視したいという需要が世の中にはそれなりにあるはずなのだが、Zabbixのように高機能な監視システムをそういった単純な用途に使おうとして情報収集をしてもなかなかストレートに目的へ辿り着くことが出来ない。そこで、カジュアルなWeb監視用途に Zabbixを使おうとする人のための最短手順をまとめて公開することにした。 ### エージェント監視とWeb監視 Zabbixエージェントを使った監視と Web監視の違いについて解説する。これらはどちらかだけ行うことも両方行うこともできるが、__この記事では後者のみを取り扱う__。 #### エージェントを使った監視 ![エージェント接続図解](chart-agent-monitoring.png?classes=img-fluid,mx-auto,d-block) Zabbixエージェントは監視対象サーバで稼働し続け、負荷状況などの詳細情報を収集する。これによって監視対象サーバの詳しい状況が手に取るようにわかるわけだが、 - 対象サーバに Zabbixエージェントデーモンをインストールして動作させる必要がある - Zabbixサーバがエージェントと通信するためのポート(デフォルトでは10050番)を利用できるようファイアウォールに例外設定を追加する必要がある のような要件が大人の事情その他によってクリアできない場合もあろうかと思う(後者にはエージェントをアクティブモードにして運用するという方法があるが)。 #### Web監視 Web監視(Web Monitoring) は、Zabbixサーバーが一般の Webサイト訪問者に扮して監視対象サーバにアクセスすることでサイトが正常に見られる状態かどうかをチェックする方式である。 ![Web監視図解](chart-web-monitoring.png?classes=img-fluid,mx-auto,d-block) エージェント監視と違って監視対象サーバの内部状態に関する情報まで収集することはできないが、この方式を利用した監視を行うだけであれば対象のサーバーに Zabbixエージェントをインストールする必要はない。 ### Zabbixのインストール ・・・については本記事では取り扱わないので各自で済ませて頂きたい。 ### Zabbixへのログインとメニューの操作法 Zabbixのデフォルトユーザー名は __admin__、パスワードは __zabbix__となっている。実際の運用ではデフォルトの adminユーザーを無効にして実作業用のユーザーを別に作るべきだが、この記事では省略して adminユーザーのまま作業を続けることにする。 <div class="alert alert-warning">言うまでもないが実運用では少なくともパスワードだけは変えること</div> ![ログイン画面](login.png?classes=img-fluid,mx-auto,d-block) Zabbixの管理画面では、画面左上にメインメニューとサブメニューが表示される。原則としてメインメニュー→サブメニューの順にクリックして作業を選択するのだが、メインメニューはクリックしなくてもマウスポインタをあてがうだけで選択された状態になる。おそらくこれはクリックの回数をなるべく減らそうという考えによるものだと思うが、慣れないうちは戸惑いやすいので注意してほしい。 ![Zabbixのメニュー構成](menu.png?classes=img-thumbnail,mx-auto,d-block) サブメニューの下に表示されているリンクの並びは今までに訪れたページの履歴であり、階層をナビゲーションするいわゆる「パンくずリスト」ではないことにも注意されたい。そうだと思って操作すると大変混乱することになる。 ### アラートメール送信用のSMTP設定 Zabbixが障害を検知したとき、つまり監視対象の Webサイトが落ちた時には然るべき人員に通知(アラート)が送信されるのが望ましい。 Zabbixではアラートの送信媒体(メディア)として標準で Email, Jabber, SMSが用意されているが、ここでは最も簡単で身近な Emailを使うことにする。 メール送信の設定をするには「管理」「メディアタイプ」から Emailを選択する。 ![メディアタイプ設定画面](mediatype.png?classes=mx-auto,d-block) Zabbixサーバからメールを送信させるにはSMTPサーバが必要である。Zabbixが動いているサーバがSMTPサーバを兼ねているのであれば<strong>SMTPサーバー</strong>の欄には localhost を、そうでない場合は SMTPサーバーのホスト名を入力する。 __SMTP helo__欄にはSMTPサーバーに対して名乗る自分のドメイン名(自分が所有している正式なドメイン名を名乗ることが望ましいが特に無ければ localhostでも何でも良い)、__送信元メールアドレス__欄にはアラートメールの送信元(メールのFrom欄)として記載したいメールアドレスを入力し、保存ボタンをで設定を保存する。 ![メールメディアタイプの設定画面](mediatype-email.png?classes=mx-auto,d-block) <div class="alert alert-warning">Zabbixは認証や暗号化を必要とするSMTPサーバとの通信に対応していないので、そのようなSMTPサーバを用いる必要がある場合はリレー用のSMTPサーバを設けるかカスタムスクリプトを作成する必要がある。</div> ### アラートメールの送信先設定 メールの送信方法を設定したら、次に送信先のアドレスを設定する。メニューの「管理」「ユーザー」から、Admin (Zabbix Administrator)ユーザーを選択してユーザー情報の編集画面を開く。 ![ユーザーの選択](select-user.png?classes=img-fluid,mx-auto,d-block) 「メディア」タブから「追加」をクリックし、 ![メディアの追加](add-media1.png?classes=img-fluid,mx-auto,d-block) __送信先__欄にアラートメールの送信先となるメールアドレスを入力し、「追加」ボタンで追加する。__有効な時間帯__はデフォルトで 1-7(月曜日から日曜日)の00:00-24:00(つまり24時間いつでも)となっているので24時間365日いつでも障害があればメールが送信されることになる(ご愁傷様です)が、必要ならば変更する。 ![メール送信先の入力](add-media2.png?classes=img-fluid,mx-auto,d-block) 「メディア」にメールアドレスが追加されたことを確認したら「保存」ボタンを押して変更を確定する(ここで保存ボタンを押すのを忘れやすいので注意)。 ![入力した情報の保存](save-user.png?classes=img-fluid,mx-auto,d-block) ここまでで、「Zabbixがアラートメールを送信する方法」と「アラートのメールが送信される宛先」が設定された。 ### アラート送信の有効化 デフォルトでは、障害発生時にアラートを送信するアクションは無効になっているのでこれを有効にする。「設定」「アクション」「イベントソース=トリガー」で、<strong>"Report problems to Zabbix administrators"</strong> という名前のアクションを見つけ、デフォルトで「無効」になっているステータスを「有効」に切り替える。 ![アクションの有効化](action.png?classes=img-fluid,mx-auto,d-block) ここまでで、「監視対象に何らかの障害があった場合には adminユーザーのメールアドレスにアラートメールが送信される」状態となった。 ### 監視対象ホストの追加 アラート送信の設定が出来たところで、次に監視対象のホストを登録する。メニューから「設定」「ホスト」を辿り、「ホストの作成」ボタンを押す。 ![ホストの作成](create-host1.png?classes=mx-auto,d-block,img-thumbnail) 「ホスト」タブで__ホスト名__(監視対象が http://www.walbrix.co.jp/ なら www.walbrix.co.jp)、__表示名__(表示用の名前を任意に付けることが出来る)を入力し、__所属グループ__には Zabbixにデフォルトで用意されているグループから適当なものを選ぶ(例では Linux serversというグループを選んでいるが、グループ名はただの名前でしかないので対象ホストは Linuxでなくても良い)か、新しいグループを作成する。 下の方に「エージェントのインターフェース」欄があり、ここに Zabbixエージェントの接続情報を入力する必要がある。Web監視だけしか行わないのであればエージェントの設定は本来不要なはずだが、Zabbixの仕様上使わない場合でも入力しておく必要があるようなので __DNS名__にホスト名を入力して接続方法を「DNS」にだけしておく。 ![新規ホストの設定](create-host2.png?classes=mx-auto,d-block,img-thumbnail) 「ホスト」タブの入力を終えてもまだ下の「保存」ボタンはクリックせず「テンプレート」タブに移り、この監視対象ホストを __"Template App HTTP Service"__ テンプレートに紐づける。__新規テンプレートをリンク__欄にテンプレート名の一部(例えば "HTTP")を入力すると候補が表示されるのでそこから目的のテンプレートを選択する。 ![テンプレートをリンク](create-host3.png?classes=mx-auto,d-block,img-thumbnail) テンプレートを選択したら「追加」をクリックするのを忘れないこと。これを忘れるとせっかく選択したテンプレートはホストに紐付けされない。 ![追加ボタンを押す](create-host4.png?classes=mx-auto,d-block,img-thumbnail) テンプレートがホストに紐付けされたら、「保存」ボタンをクリックして監視対象ホストの登録を完了する。 ![保存ボタンを押してホストの登録を完了](create-host5.png?classes=mx-auto,d-block,img-thumbnail) 監視対象ホストの登録を完了すると、ホスト一覧が表示されここに新しく追加されていることが確認できる。 ![ホスト一覧の確認](create-host6.png?classes=img-fluid,mx-auto,d-block) ### 監視対象の状態を確認 監視対象のホストが登録されるとすぐに Zabbixサーバーは監視を開始する。監視対象がどのような状態か確認するには、メニューから「監視データ」「最新データ」をたどってグループ・ホストを絞り込む。(監視対象が一つしか無いうちは絞り込むまでもないが) ![監視対象を絞り込む](data1.png?classes=img-fluid,mx-auto,d-block) 今回登録したホストには "Template App HTTP Service" テンプレートが適用されているため、HTTP Serviceなるアイテム(監視項目)が監視されている。"HTTP service is running" の「最新の値」が Up(1) になっていれば、監視対象のサーバーで Apacheなどの Webサーバーが起動しているということになる。__試しに対象サーバの Apacheを停止してみる__と値が Down(0)になり、障害を通知するメールが先刻設定したメールアドレス宛に飛ぶはずだ。 もし Zabbix上でのメール関連設定が正しいのにメールが届かない場合は迷惑メール扱いになっていないか確認した上で SMTPサーバのログをチェックして問題を解決する必要がある。また SMTPサーバがOP25Bを実施しているインターネットプロバイダに接続されている場合にはメールが飛ばないだろう。 OP25B対策についての参考記事: [OP25Bを回避するため Postfixのリレー先を gmailに設定する方法](../gentoo-postfix-relay-gmail.html) ![監視データの確認](data2.png?classes=img-fluid,mx-auto,d-block) 障害が発生するとこのように Zabbixのトップページにもオレンジ色で警告が表示される。 ![障害発生時の表示](fail.png?classes=img-fluid,mx-auto,d-block) 試しに落とした監視対象ホストの Apacheを起動しなおすと警告は表示されなくなり、復帰を知らせるアラートメールが送信される。 ### Webシナリオの登録 ここまでの設定だけでは、監視対象のWebサーバが HTTPのポート(80番)で待ち受けをしているかどうかの監視しか出来ない。具体的には、設定不備やアプリケーションサーバのクラッシュでページが 500 Internel Server Errorになっていたり、ファイルを謝って削除して 404 Not Foundになっていたり、アクセス集中でページの表示に何十秒もかかるような状態になっていたりしても Webサーバ自体が落ちていない限り障害として検知されない。 それらのような障害も検知するには、監視対象ホストに Webシナリオを登録する必要がある。 #### Webシナリオとは Webシナリオとは、Zabbixサーバが監視対象のWebサーバを巡回する一連の手順をいう。Zabbixサーバはシナリオに記された URLに上から順にアクセスし、途中でひとつでも異常があればそれを障害として検知する。 ![Webシナリオの流れ](web-scenario.png?classes=img-fluid,mx-auto,d-block) 本記事では例としてサイトのトップページにだけアクセスする最も簡単なシナリオを作る。 #### Webシナリオの新規作成 メニューから「設定」「ホスト」でホスト設定画面へ行き、対象のサーバを見つけ出して「ウェブ」をクリックする ![Webシナリオ新規作成への入り口1](web-monitoring1.png?classes=mx-auto,d-block,img-thumbnail) 「ウェブ監視の設定」画面になるので「シナリオの作成」をクリック ![Webシナリオ新規作成への入り口2](web-monitoring2.png?classes=mx-auto,d-block,img-thumbnail) シナリオに__名前__を付け、__アプリケーション__には "HTTP service" を選択する(Zabbixでいうところの「アプリケーション」とは監視項目のグループといった意味で、ここではそれ以上の深い意味はない)。__更新間隔__はこのシナリオを実行して対象のWebサイトをチェックする間隔で、デフォルトは60秒となっているが、これは60秒おきに対象Webサーバのログにアクセス記録が残ることを意味するのでログファイルをあまり汚したくない場合などはもっと長い間隔を指定すると良い。 この時点ではまだ「保存」ボタンを押さないこと。 ![シナリオに名前を付ける](web-monitoring3.png?classes=mx-auto,d-block,img-thumbnail) #### Webシナリオにステップを追加 「ステップ」タブを選択し、「追加」をクリックする ![ステップの追加開始](web-monitoring4.png?classes=mx-auto,d-block,img-thumbnail) ステップに適当な__名前__をつけ、__URL__を入力する。 タイムアウト(デフォルトで15秒)は、その時間内にサーバーが応答を返さなければ障害扱いにする。 __要求文字列__を指定すると、その URLにアクセスしたときにサーバーから返ってくる内容にその文字列が入っていることをチェックし、入っていない場合はそれも障害扱いとする。空欄にしておけば応答内容のチェックは行われない。 __要求ステータスコード__には通常 200 を入れておけば良い。200 OK以外のHTTP応答コードを期待するような特殊なURLではそれ以外の値を入力することもできる。 ステップの項目を入力し終えたら「追加」ボタンをクリックする。 ![ステップの追加完了](web-monitoring5.png?classes=img-fluid,mx-auto,d-block) 必要な全てのステップを追加し終えたら「保存」を押して Webシナリオの作成を完了し、一覧に新しいシナリオが追加されていることを確認する。 ![Webシナリオ作成完了](web-monitoring6.png?classes=mx-auto,d-block,img-thumbnail) ![Webシナリオの存在を確認](web-monitoring7.png?classes=img-fluid,mx-auto,d-block) #### Webシナリオの実行状況を確認 メニューから「監視データ」「ウェブ」を開くと、ウェブシナリオの実行状況を確認することができる。シナリオ名をクリックするとサイトの応答時間がグラフで表示される。 ![Webシナリオの監視データを確認](web-monitoring8.png?classes=mx-auto,d-block,img-thumbnail) ![応答時間のグラフ](web-monitoring9.png?classes=img-fluid,mx-auto,d-block) 「設定」「ホスト」画面から監視対象サーバーの「ウェブ」を選択することでシナリオを修正できるので、サイトのトップページ以外のURLもシナリオに追加してみて、わざとそのページのHTMLファイルを削除するなどしてシナリオの実行が正しく失敗扱いになるか確認すると良いだろう。 ### Webシナリオにトリガーを設定する トリガーとは、ご存じのとおり日本語に直訳すると「引き金」である。Webシナリオを作っただけだと、シナリオの実行に失敗しても Zabbixサーバーはそれをまだ正式に「障害」とは認識しない(ので障害通知のアラートメールも飛ばない)。Webサイトに障害が発生した際にアラートメールが飛ぶようにするには、「Webシナリオの失敗→障害」という引き金を定義してやらなくてはならない。 トリガーを作成するにはメニューから「設定」「ホスト」で監視対象ホストを表示し、「トリガー」を開いて「トリガーの作成」をクリックする。 ![トリガー設定画面へ移動](trigger1.png?classes=mx-auto,d-block,img-thumbnail) ![トリガーの作成](trigger2.png?classes=img-fluid,mx-auto,d-block) トリガーに適当な__名前__を付け、「追加」ボタンでトリガー発動の__条件式__を入力(後述)し、__深刻度__を選択して「保存」する ![トリガー設定入力画面](trigger3.png?classes=mx-auto,d-block,img-thumbnail) 条件式にはは式を直接入力することも出来るが、「追加」ボタンで開くウィンドウから選択して入力したほうが簡単だ。__アイテム__として "Failed step of scenario..." を、__関数__には「最新(T秒前/T個前)の値 NOT N」</p>を選択して「挿入」ボタンで条件式を挿入する。この条件式は「直近に行ったWebシナリオの実行が失敗した」という意味になる。 ![トリガー条件式の挿入](trigger4.png?classes=img-fluid,mx-auto,d-block) これでWebシナリオにトリガーが設定され、障害検知(サイトの閲覧が正しく出来ない状態になった)時(と復旧時)にアラートメールが送られるようになったはずだ。