locked
IIS7.5 Webサイトを停止・開始する際の動作について RRS feed

  • 質問

  • お世話になります。

    現在、IIS7.5の環境で以下のようにWebサイトを2つ用意し、同じ内容のWebアプリケーション(C#)を配置しています。

    ①Web Site A /APP_A

    ②Web Site B/APP_B

    ※アプリケーションプールは同一のものを適用


    夜間バッチ処理にて、WebサイトAの停止、起動を

    appcmd stop site /site.name:"Web Site A"

    appcmd start site /site.name:"Web Site A"

    のコマンドで実施しています。

    IISマネージャーで

    ・操作 - Webサイトの管理 - 停止・開始

    を実施した場合は、初回アクセス時に Application_Start() が実施されているようですが、

    コマンド実施を行うとアプリケーションに初回アクセスしても、Application_Start() が実施されず、

    同じ動きをするにはどのようなコマンドを実行すればよいか思案しております。

    (アプリケーションプールはWebサイトA、Bで共有していますが、WebサイトBは別途処理が実施されている可能性がある為、

    WebサイトAのみ再起動を実行させ、Application_Start() が実施されるようにしたいと考えております。)

    お手数ですが、よろしくお願い致します。

    2017年11月6日 9:48

回答

  • > IISマネージャーで
    > ・操作 - Webサイトの管理 - 停止・開始
    > を実施した場合は、初回アクセス時に Application_Start() が実施されているようですが、
    > コマンド実施を行うとアプリケーションに初回アクセスしても、Application_Start() が実施されず、

    実際に検証して調べたわけではないのですが、以下の記事によると IIS Manager でのWebサイトの管理 - 停止・開始とコマンドラインから appcmd stop/start site は同じことのように見えます。

    Start or Stop a Web Site (IIS 7)
    https://technet.microsoft.com/en-us/library/ea8d442e-9a0c-49bb-b940-50b22fa64dd4

    自分が持っている本「マイクロソフト公式解説書 一目でわかる IIS7.0」にも、

    "Web サイトに対して停止や再起動の操作を行っても、アプリケーションプールに依存するもの、つまりワーカープロセスには影響がない点に注意してください"

    とあります。

    なので、実は、 IIS Manager でのWebサイトの管理 - 停止・開始とコマンドラインから appcmd stop/start site どちらも Application_Start() は実行されてないと思われるのですが・・・

    > 夜間バッチ処理にて、WebサイトAの停止、起動を

    その目的が何だか分かりませんが、単に Application_Start() を定期的に実行させたいということであれば、アプリケーションプールのリサイクルで事足りるのではないでしょうか?

    アプリケーションプールのリサイクルは定期的(デフォルトで 1,740 分毎。決まった時間に行うことも可能です。下の画像参照)に行われ、リサイクルの後の最初のクライアントからの要求を受けた時点で Application_Start() は実行されます。

    オートスタートという方法もあって、最初のクライアントからの要求を待たずに Application_Start() を実行させることも可能です。

    IIS オート スタート設定による ASP.NET Web アプリケーションの初回実行時のパフォーマンス向上
    https://blogs.msdn.microsoft.com/chack/2013/09/25/iis-asp-net-web-2223/

    > アプリケーションプールはWebサイトA、Bで共有していますが

    その理由も何だか分かりませんが、何にせよアプリケーションプールは別々にしないと、片方だけ Application_Start() を実行させるこはできないような気がします。

    2017年11月7日 4:38

すべての返信

  • Y.KIKAWA さん、こんにちは。
    フォーラム オペレーターの立花楓です。

    このたびはご投稿いただきましてありがとうございます。

    今回、「Visual Studio 共通 フォーラム」 カテゴリに投稿いただいた内容ですが、「Internet Information Services」カテゴリにてご質問いただいたほうが情報が集まりやすいと思いましたので、移動させていただきました。

    MSDNフォーラム > Internet Information Services > Internet Information Services
    https://social.msdn.microsoft.com/Forums/ja-JP/home?category=iis&filter=alltypes&sort=lastpostdesc

    また、今後参考になる情報がありましたら、投稿者からの [回答としてマーク] をお願いいたします。

    よろしくお願いいたします。


    MSDN/TechNet Community Support 立花楓


    2017年11月7日 1:18
    モデレータ
  • > IISマネージャーで
    > ・操作 - Webサイトの管理 - 停止・開始
    > を実施した場合は、初回アクセス時に Application_Start() が実施されているようですが、
    > コマンド実施を行うとアプリケーションに初回アクセスしても、Application_Start() が実施されず、

    実際に検証して調べたわけではないのですが、以下の記事によると IIS Manager でのWebサイトの管理 - 停止・開始とコマンドラインから appcmd stop/start site は同じことのように見えます。

    Start or Stop a Web Site (IIS 7)
    https://technet.microsoft.com/en-us/library/ea8d442e-9a0c-49bb-b940-50b22fa64dd4

    自分が持っている本「マイクロソフト公式解説書 一目でわかる IIS7.0」にも、

    "Web サイトに対して停止や再起動の操作を行っても、アプリケーションプールに依存するもの、つまりワーカープロセスには影響がない点に注意してください"

    とあります。

    なので、実は、 IIS Manager でのWebサイトの管理 - 停止・開始とコマンドラインから appcmd stop/start site どちらも Application_Start() は実行されてないと思われるのですが・・・

    > 夜間バッチ処理にて、WebサイトAの停止、起動を

    その目的が何だか分かりませんが、単に Application_Start() を定期的に実行させたいということであれば、アプリケーションプールのリサイクルで事足りるのではないでしょうか?

    アプリケーションプールのリサイクルは定期的(デフォルトで 1,740 分毎。決まった時間に行うことも可能です。下の画像参照)に行われ、リサイクルの後の最初のクライアントからの要求を受けた時点で Application_Start() は実行されます。

    オートスタートという方法もあって、最初のクライアントからの要求を待たずに Application_Start() を実行させることも可能です。

    IIS オート スタート設定による ASP.NET Web アプリケーションの初回実行時のパフォーマンス向上
    https://blogs.msdn.microsoft.com/chack/2013/09/25/iis-asp-net-web-2223/

    > アプリケーションプールはWebサイトA、Bで共有していますが

    その理由も何だか分かりませんが、何にせよアプリケーションプールは別々にしないと、片方だけ Application_Start() を実行させるこはできないような気がします。

    2017年11月7日 4:38
  • サイトの停止は、アプリケーションのアンロードまで行うとは限らないという感じのなのですかね。

    もしかすると、単純に停止から再起動まで一定の時間を空ければ、アプリケーションも再起動する動きになるかもしれません。

    ※今はコマンド連続実行なのであれば

    デフォルトだとアプリケーションドメイン単位のアイドルタイムアウトもあった気がしますが、それはオフにしていますかね?(あるいはSurferOnWwwさんが書いているオートスタート設定でアプリが常駐状態になっているなど)

    アプリケーション内部からだと、HttpRuntime.UnloadAppDomainというメソッドを呼び出すことで、自らアプリケーション単位で終了することは可能ですが、外部から実行する方法は、少なくともappcmdの機能にはなさそうですね。

    なんにしても、個別に管理したいのであれば、すでに書かれていますがアプリケーションプール自体を分けるほうが簡単とは思います。(リソースを共有したいなど明確に目的があって同じにしているならまた話は別ですが)。

    ところで、アプリケーションを再起動したいそもそもの目的はなんでしょうか?

    2017年11月7日 6:41
  • SurferOnWww 様

    ご返信ありがとうございます。

    諸般の事情から、

    ・リサイクル⇒0(リサイクルしない)

    ・プロセスのタイムアウト⇒0(タイムアウトしない)

    という設定を行っており、規定時間の経過によるリサイクルができない状態となっております。

    何れにせよ、アプリケーションプールを別々にする構成を検討しようと思います。

    2017年11月7日 7:12
  • なちゃ 様

    ご返信ありがとうございます。

    SurferOnWww様からもご指摘頂きましたとおり、アプリケーションプールを分ける方向で検討しようと思います。

    なお、アプリケーションを再起動したい理由としましては、

    WebサイトAの停止後、WebサイトAのアプリケーションが使用するDBを別環境のDBバックアップで復元、

    WebサイトAを開始するというのを行っており、復元したDBからのデータでアプリケーションで使うデータを

    初期化することを目的としております。

    2017年11月7日 7:20