質問
2013年11月1日金曜日 1:37
IISでASP.NETのアプリケーションを動作させている場合に、このWebアプリケーションを安全に停止させる方法はあるでしょうか?
ここでいう「安全に停止」とは、
・現在処理中のリクエストは処理を続行
・新規接続は受けつけない
・処理中のリクエストが全て完了次第サービス停止
というようなニュアンスです。
例えばサーバ自身を再起動させたい時に、リクエスト処理中にユーザを即時強制的に切断はせずに、緩慢に停止させる方法があるのかを知りたいです。
もちろん、現在処理中のリクエストは強制切断されずとも、次のアクセスでは接続できない動作にはなりますので、あくまで強制切断を避ける程度にしかならないのではありますが。
対象はIIS8の話なのですが、多分IIS7以降なら同じかなと思います(IIS8の新規機能であるとかならそれでもいいです)。
試してみたところ、IIS7.5上の話ですが、アプリケーションプールをリサイクルして即座に停止すれば、疑;的にそのような動作にできるようですが、まあ強引ですしタイミングに依存がありますし、動作の保;はないですので、きちんとした方法があればそちらを知りたいです。
※アプリケーションプールやサイトやIIS自体の単純な停止では、現在処理中のリクエストが強制的に切断されます。
すべての返信 (5)
2013年11月1日金曜日 7:05 ✅回答済み
そうでしたか…。Application Poolのgraceful shutdownで検索した際、このことに言及しているページが非常に少なかったので不審には感じていました。
直接の答えではないのですが、オート・スタートによるアプリケーションの初期化処理とメンテナンスページの後半、メンテナンスページの部分がある程度参考になるかもしれません。
ARR; Application Request Routingを使用してリクエストの処理条件を設定することで、メンテナンスページにリダイレクトすることができます。処理中のセッションが終了したら(どうやって判定する?)、停止できます。
2013年11月1日金曜日 2:54
追加です。
App_Offline.htm ファイルを作成してオフラインにし、処理中のリクエストがなくなった時点で手動で停止する、あるいはオフラインにした後リサイクルして停止するなどの合わせ技も考えたりしましたが、そもそもまっとうな方法があるのかをまず知りたいと思っています。
※上記のように、対症療法的な(試してみたところ一応実現はできそうな)手段は無いわけではないですが、いかにも強引です。
2013年11月1日金曜日 5:37
※アプリケーションプールやサイトやIIS自体の単純な停止では、現在処理中のリクエストが強制的に切断されます。
アプリケーションプールの停止でダメでしょうか?
構成ファイルのアプリケーション プールのプロセス モデル設定 <processModel>にはshutdownTimeLimitという項目があり、既定で90秒までは待ちます。
# ちなみにこのような「安全に停止」する動作のことを(IISやWindowsに関係なく)一般的に「graceful shutdown」と呼びます。
2013年11月1日金曜日 6:38 | 1 票
ありがとうございます。
アプリケーションプールの停止でダメでしょうか?
構成ファイルのアプリケーション プールのプロセス モデル設定 <processModel>にはshutdownTimeLimitという項目があり、既定で90秒までは待ちます。
この設定は確かにそういう目的に見えるのですが、どうもアプリケーションプールの「リサイクル」の際にしか効かないようなんですね。
元々デフォルトで90秒になっており、リサイクルした場合には、処理中のリクエストは90秒まで継続してくれるのですが、アプリケーションプールを「停止」した場合は、即座にクライアントが切断されてしまいます。
※ちなみに、質問で書いた回避策の「アプリケーションプールをリサイクルして即座に停止」という方法が、リサイクル時のこの動作を利用している感じです。
# ちなみにこのような「安全に停止」する動作のことを(IISやWindowsに関係なく)一般的に「graceful shutdown」と呼びます。
ありがとうございます。
何か用語があった気がしたんですが思い出せませんでした。
参考にさせていただきます。
2013年11月5日火曜日 0:02
そうでしたか…。Application Poolのgraceful shutdownで検索した際、このことに言及しているページが非常に少なかったので不審には感じていました。
直接の答えではないのですが、オート・スタートによるアプリケーションの初期化処理とメンテナンスページの後半、メンテナンスページの部分がある程度参考になるかもしれません。
ARR; Application Request Routingを使用してリクエストの処理条件を設定することで、メンテナンスページにリダイレクトすることができます。処理中のセッションが終了したら(どうやって判定する?)、停止できます。
ありがとうございます。
今回の目的だけで活用するにはやや大がかりっぽい感じではありますが、このページの内容はこれはこれで色々参考になりそうです。
graceful shutdownについてはちょっと検討してみることにします。
ありがとうございました。