オルタナティブ・ブログ > ビジネスをデザインするブログ >

事業開発ほどクリエイティブな行為は他に無いと思いこんでいる人間の日常

Webサーバ監視ツールを自作してみる (Windowsサービス編)

»

  Webサーバの稼働監視をしないといけない状況が発生。

まあ、通常であれば無料の監視ツールを設定して終了!なのですが、今回は、サーバのステータスコード「401」以外をエラーとしなければならないような少々特殊なケース。

無料ツールをいじってみるも、無料ツールや無料の範囲というのは、PING、80ポートの導通監視のみというものが多く、目的のツールが見つからず・・・。

仕方がないので、プログラマくずれの悲しい性・・・。

「自作するか・・・」

という運び。

とりあえず、Windows Service として実装してみることにする。

今となってはWindwos Service を作る方法はあまり解説されることもないのでメモ。

仕様は以下の通り、

  1. Windows Serviceとして実装
  2. 監視対象にリクエストを投げHTTP Response のステータスコードを抽出
  3. 監視はTimerのElapsedイベント(Tickじゃない)により定期的に行う
  4. 適切なコード以外(普通は200以外)ならエラーメールを送信

と、こんな感じ。Windows7とかのII7.0か7.5からSMTPが付かなくなったので、SMTPはhotmailのものを使用することにします。

まず、VSを起動してWindows Service プロジェクトを選択します。

私の開発環境は英語なんですが、まあ、日本語でもほぼ同じです。ちなみに英語になっているのは、Windows Phone7 開発環境が日本語環境と相性悪いからしぶしぶです。

開発環境ですが、

  • OS : Windows7 x64
  • IDE : VS2010
  • 言語 : C#

です。

以下、解説は英語、日本語ごちゃまぜ、画像トリミングなし・・・ですが、あらかじめご了承ください。

では、改めまして・・・開発スタート。Windows Service を選択。

001

プロジェクト名は、WebWatcher と名前を付けました。

002

プロジェクトのテンプレートが生成される。Service1ってのがプログラム本体。本当は、名前を変えた方がいいのですが、めんどいのでそのまま。

「さあコーディング!」と行きたいところですが、まず、installer オブジェクト追加します。ここで追加するInstaller オブジェクトは、いわゆるSetupプロジェクトではなく、Windows Service をサービスとしてインストールするための基本情報を保有するオブジェクトです。何をするものかは設定すればわかります。

デザイン画面上で右クリックし、Add Installer を選択。

003

serviceProcessInstaller1とserviceInstaller1の2つが追加されます。

で、まず、seviceProcessInstallerから設定。サービスの実行ユーザを設定します。ここではUserをLocalSystemに変更します。

004_2

次にserviceInstaller の設定。ここでは、サービスの名前や説明文、自動起動が手動起動かなど、Windows Service おなじみのパラメータを設定。

Installer まわりの設定はひとまず完了。

次に定期監視のためのイベントを発生されるためのTimerコントロールを追加します。ここで注意が必要なのは、通常のTimerはWindows Form (GUIあり)向けなので、ここでは、System.Timers.Timerを利用します。デフォルトではツールボックスにないので追加します。

005

追加は、ツールボックスの適当な場所を右クリックし、Choose Item(日本語だと、なんでしょ、アイテムを選択かな?)を選択すると開くダイアログから行います。

007

Timerが追加されました。とりあえずEnabledをfalseに。Interval を10000(10秒)に設定しました。Intervalは実際はもっと長い方がいいでしょう。

で、やっとコーディング。

008

OnStart()で、TimerのEnabledをtrueに。OnStop()でTimerのEnabledをfalseに設定。

そして、Timer のElapsed イベントに主ロジックを実装します。Timerと言えばTickイベントがふつうですが、System.Timers.TimerにはTick イベントが無く、Elapseが同等の機能を提供します。

コードはこんな感じ。

------------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;

namespace WebWatcher
{
    public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            timer1.Enabled = true;
        }

        protected override void OnStop()
        {
            timer1.Enabled = false;
        }

        private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            //サーバにリクエストを投げてStatusCodeを取得

            string url = "http://localhost/";
            string code = "000";

            System.Net.HttpWebRequest webreq = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
            System.Net.HttpWebResponse webres = null;

            //正常の時(200)
            try
            {
                webres = (System.Net.HttpWebResponse)webreq.GetResponse();
                //標準だと文字列(Not Found)なので、404とかの数字するする。
                code = webres.StatusCode.ToString("d");
            }
            //異常の時(たぶん200以外)
            catch (System.Net.WebException ex)
            {
                if (ex.Status == System.Net.WebExceptionStatus.ProtocolError)
                {
                    System.Net.HttpWebResponse errres = (System.Net.HttpWebResponse)ex.Response;
                    //標準だと文字列(Not Found)なので、404とかの数字するする。
                    code = errres.StatusCode.ToString("d");
                }
            }
            finally
            {
                if (webres != null)
                    webres.Close();
            }

            //メール送信(SMTPとしてhotmailを利用)

            if (code != "200")
            {
                //メールの文章を生成
                System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage();

                msg.From = new System.Net.Mail.MailAddress("alert@hoge.com");
                msg.To.Add(new System.Net.Mail.MailAddress("acount1@hoge.com"));
                //msg.To.Add(new System.Net.Mail.MailAddress("acount2@hoge.com"));
                msg.Subject = "WebServer Alert";
                msg.Body = "サーバが停止しているようです。";

                //SMTPの設定と送信

                System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient();
                smtp.Host = "smtp.live.com";
                smtp.Port = 25;
                smtp.Credentials = new System.Net.NetworkCredential("liveacount", "livepassword");
                smtp.EnableSsl = true;
                smtp.Send(msg);

                msg.Dispose();
            }

        }
    }
}

------------------------------------------------------------------

赤字の個所は、変更してください。

で、普通のアプリならこれで完成!「F5」で動作確認!なのですが、なんせWindows Service なのでここからがちとめんどい。

以前は、ここからBin以下に生成されたEXEをinstallutilコマンドでインストールし、動作確認・・・と進んでいたのですがVista以降、普通の設定だとセキュリティー問題でけられてしまうので、ここでは一気にSetupプロジェクトを追加し、インストーラを作ってしまいます。これは、冒頭で追加したInstallerとは違います。

009

ソリューションにプロジェクトを追加します。

010

開いたダイアログから、Setup Project を選択して追加します。

011

Setup Project に含ませる内容を追加します。Setup Project を選択、右クリックし、追加からProject Output を選択します。

012_2

開いたダイアログでPrimary output を選択します。

013

次に、Setup Project を選択、右クリックし、View からCustom Actions を選択し表示します。

014

表示されたCustom Actions を選択、右クリックし、Add Custom Action..を選択します。

015

開いたダイアログで、先ほど追加したPrimary output を選択します(Application Folderを選択すると出てきます)。

016

各場所にPrimary output が追加されました。基本、これで完了です。

017

ここでSetup Project をビルドします。もし、一度もメインプロジェクトの方をビルドしてないなら、事前にビルドしておきます。

018

ビルドが完成すると、Setup Project を右クリックしたときに表示されるInstall がEnable になり、選択できるようになります。

で、Install を選択します(その下にUninstallもあります。Uninstall もここからできます)。

019

普通にWindows Installer が起動されインストールされます。

020

管理ツールからサービスを見てみると、WebWatcher というのが追加され、説明文も表示されています。起動設定はManual にしてあったので、起動はしていません。クリックして、サービスを起動させます。

021_2

監視対象はとりあえずlocalhost にしましたが、IISがふつうに普通に動いているので、監視ツールは何もアクションしません。起動しているかどうかもわからにので、通常はEventログに「起動」とか「終了」をか出力するようにしたりします。

022

IISを停止するか、Defalt.html を削除してみましょう。

023

メーラーを確認してみると、Alert メールが届いています(Gmailなのはご愛嬌・・・)。10秒に1回監視してるので、メール爆弾状態ですが・・・。

なんとかうまく動いているようです。

監視したいStatusCodeやInterval 等を適度に設定すれば完成です。

024

通常のInstaller でインストールされているので、Uninstall はコントロールパネルからも行えます。

しかし、スマフォンやSNSの話題で持ちきりのIT業界ですが、Windows Service も覚えとくと何かと役に立つ便利なツールだなあ・・・と改めて思いました。

Comment(0)