Quantcast
Channel: 64 Blog
Viewing all articles
Browse latest Browse all 45

Webロールに Application Initialization Module for IIS 7.5 を設定(半自動化)

$
0
0

昨年 取り掛かりそうで取り掛からなかったネタです。

このモジュールの簡易的な説明や、類似するそれっぽい投稿は下記をご覧ください。
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もターミナルも少し待つ必要がありますが、数十秒ほど待てばどちらもアクセス可能になります。

 

ということで…。
インスタンスが上がったことを検出して、停止 -> 開始 を組み込むような仕組みを作っておけば [自動化] することもできるかな。と思うだけ思って [半自動化] で、今回のネタは終わります。


Viewing all articles
Browse latest Browse all 45

Trending Articles