昨年 取り掛かりそうで取り掛からなかったネタです。
このモジュールの簡易的な説明や、類似するそれっぽい投稿は下記をご覧ください。
・Application Initialization Module for IIS 7.5 をインストール
・Webロールで、初回リクエストの応答を早くする (たんたか さん)
まずは Application Initialization Module for IIS 7.5 をダウンロードします。
http://www.iis.net/downloads/microsoft/application-initialization
対象のフレームワークを .NET Framework 4 などにしたWebロールを含んだプロジェクトを作り、ダウンロードした [appwarmup_x64.msi] を出力ディレクトリに [常にコピーする] に設定して追加します。
ServiceDefitition.csdef を開いて管理者権限に設定します。
<Runtime executionContext="elevated"></Runtime>
ServiceConfiguration.Cloud(Local).cscfgファイルの osFamily が 2 に設定されていることを確認します。
参照設定に %windir%\system32\inetsrv にある Microsoft.Web.Administration を追加します。
WebRole.cs を下記のように編集します。
public class WebRole : RoleEntryPoint { public override bool OnStart() { // For information on handling configuration changes // see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357. var param = "\" /c msiexec.exe /i " + Environment.ExpandEnvironmentVariables(@"%RoleRoot%\approot\bin\Setup\appwarmup_x64.msi") + " /norestart /qn\""; ExecuteCommand("cmd.exe", param); InitAppHostConfig(); return base.OnStart(); } private void ExecuteCommand(string exe, string arguments) { using (var p = new Process()) { p.StartInfo.FileName = exe; p.StartInfo.Arguments = arguments; p.StartInfo.CreateNoWindow = true; p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardError = true; p.StartInfo.Verb = "RunAs"; p.Start(); var results = p.StandardError.ReadToEnd(); p.WaitForExit(60000); p.Close(); } } private void InitAppHostConfig() { using(var serverManager = new ServerManager()) { var site = serverManager.Sites[RoleEnvironment.CurrentRoleInstance.Id + "_Web"]; var app = site.Applications["/"]; app["preloadEnabled"] = true; var apppool = serverManager.ApplicationPools[app.ApplicationPoolName]; apppool["startMode"] = "AlwaysRunning"; serverManager.CommitChanges(); } } }
プロジェクトのルートにある web.config の system.webServer に下記の設定を追加します。
<applicationInitialization remapManagedRequestsTo="/" skipManagedModules="true"> <add initializationPage="/" /> </applicationInitialization>
あとはデプロイして正常に処理が行われれば、きっと500エラーが返ってきますので、例えば管理ポータルからインスタンスに対して次の操作を行います。
1:インスタンス停止
2:インスタンス開始
インスタンス開始直後はwebもターミナルも少し待つ必要がありますが、数十秒ほど待てばどちらもアクセス可能になります。
ということで…。
インスタンスが上がったことを検出して、停止 -> 開始 を組み込むような仕組みを作っておけば [自動化] することもできるかな。と思うだけ思って [半自動化] で、今回のネタは終わります。