📝

IISにASP.NET Coreアプリをアウトプロセスでデプロイする

2024/01/27に公開

はじめに

通常、ASP.NET CoreアプリをIISにデプロイするとデフォルトではインプロセスで処理されます。
インプロセスで処理する利点はパフォーマンスです。
インプロセスはASP.NET CoreアプリはIISワーカープロセスと同じプロセスで動きます。そのため要求がループバックアダプターを介してプロキシーされることがないからです。

一方、アウトプロセスでは、ASP.NET CoreアプリはIISワーカーアプリとは独立したプロセスで実行されます。
プロセス管理は、ASP.NET Coreモジュールによって処理されます。タスクマネージャーでみるとdotnet.exeというプロセスが起動してます。最初の要求が届いたときにこのプロセスが起動されプロセスがシャットダウン・クラッシュしたときにアプリが再起動されます。

汎用ホスト(Generic Host)のアプリケーション構成

IISIntegrationコンポーネントを有効にする

通常、テンプレートをそのまま使用している場合は有効になっているはずです。
CreateHostBuilderを使ってIHostを構築します。

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        ...

プロジェクトファイルの設定

これは必ず設定する必要があります。
何も設定がない場合はデフォルトインプロセスになっています。

<PropertyGroup>
  <AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel>
</PropertyGroup>

以上によって、CreateDefaultBuilderによってUseIISIntegrationが呼び出されKestralサーバが使用され、ASP.NET Coreモジュールの背後で実行するときにサーバーがリッスンするポートとベースパスを構成しスタートアップエラーをキャプチャーするホストを構成します。

やってみた

インプロセス時の挙動

IISのプロセスメモリ使用量は18MB

dotnet.exeプロセスはいない(プロセス名でソート)

アウトプロセス時の挙動

IISのプロセスめもり使用量は5MB程度

dotnet.exeプロセスが動作している

まとめ

アウトプロセスで動かすことによってIISのプロセスからアプリケーションを外に出すことができます。これによってアプリケーションのクラッシュをほかに影響を与えにくくする効果があるのではないかと考えています。
また、別のプロセスを使用することで同じアプリプールから複数のアプリをホストすることが可能になります。

Discussion