Kestrel Webサーバーとは何ですか?IIS/IIS Expressとどのように関連していますか?
私はIIS Expressでアプリを開発し、IIS Webサーバーでホストしています。 ASP.NET Coreでは、Microsoft.AspNetCore.Server.Kestrel
に依存しており、スタートアップには.UseServer("Microsoft.AspNetCore.Server.Kestrel")
があります。しかし、Webサイトを実行すると、システムトレイにIIS Expressアイコンが表示されます。誰かが私にIIS ExpressまたはKestrelを使っているのかと尋ねましたが、何と言ったらいいのかわかりませんでした!
AzureのPCとホストで開発する際にクロスプラットフォームの要件はないため、need
Kestrelでさえ混乱していますが、代替手段はないようです-最も単純なサンプルはケストレルを使用します。
ケストレルとは
本格的なWebサーバーです。 Kestrelだけを使用してASP.NET Coreアプリケーションを実行できます。
しかし、Webサイトを実行すると、システムトレイにIIS Expressアイコンが表示されたままになります
ASP.NETアプリケーションでは、おそらくwwwroot
ディレクトリに、これを含むweb.configが表示されます。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<handlers>
<add name="httpPlatformHandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified"/>
</handlers>
<httpPlatform processPath="%DNX_PATH%" arguments="%DNX_ARGS%" stdoutLogEnabled="false" startupTimeLimit="3600"/>
</system.webServer>
</configuration>
これはHttpPlatformHandlerです。基本的に、これが行うことはall Kestrelへのリクエストの転送です。 IIS Express(およびその点でIIS)は、ASP.NET自体をもう実行しません。代わりに、それらは単にKestrelから要求と応答をやり取りするプロキシとして機能します。 IISを使用する利点はまだあります。具体的には、セキュリティ構成、カーネルレベルのキャッシュなどを提供します。
WindowsとIISのみを使用している場合でも、Kestrelが登場する理由を理解できるように、いくつかの歴史を持つ別の回答を提供したいと思います。
2000年より前のASP.NET開発の最初の段階で、Microsoftは明らかにASP.NET WebFormsアプリをホストするために2つのピースを作成しました。
HttpListener
に基づいてC#で記述された完全に管理されたWebサーバーです。もちろん、開発専用であるため、多くの機能は実装されていません。 MicrosoftがCassiniのソースコードを公開したため、コードベースを分岐し、Cassiniファミリを開始した機能を追加したサードパーティがいます。aspnet_wp.exe
)もあります。したがって、Webアプリを開発するには、Cassiniを使用し、展開するにはIISを使用します。
IIS 6にアプリケーションプールを導入するには、ASP.NET側でいくつかの変更が必要であったため、aspnet_wp.exe
は廃止され、aspnet_isapi.dll
に置き換えられました。これは、IISリビジョン2でのASP.NETサポートと見なすことができます。したがって、ASP.NETアプリはIISワーカープロセスw3wp.exe
でホストされています。
IIS 7以降での統合パイプラインの導入には、aspnet_isapi.dll
をwebengine4.dll
に置き換えるさらなる変更が必要でした。これは、IISリビジョン3でのASP.NETサポートと見なすことができます。ASP.NETとIISパイプラインは統合されています。
ASP.NETがはるかに複雑になり、IISと緊密に統合されたことがわかります。そのため、Cassiniはその年齢を示し始め、徐々にIIS Express(ユーザーモードライトIIS)に置き換えられました。
したがって、多くの場合、人々がIISが遅いと非難するとき、彼らは実際にASP.NETを非難すべきです。 ASP.NETなしのIIS自体は非常に高速で安定していますが、ASP.NETは十分なパフォーマンスメトリックを念頭に置いて開発されていません(WebFormsはかなりの生産性とRADに焦点を合わせているため)。
その後、2014年11月にASP.NET 5(後にASP.NET Coreに名前が変更されました)が発表され、クロスプラットフォームテクノロジになりました。明らかに、MicrosoftはWindows、macOS、およびLinuxをサポートする新しい設計を必要としていました。そこでは、IIS以外のすべての主要なWebサーバー、nginx/Apache(または他のWebサーバー)を考慮する必要があります。
MicrosoftはNodeJSから多くのことを学び、その後Kestrelを設計および開発した(最初はlibuv
に基づいていましたが、すぐに他の技術に移行するかもしれない)ことに多くの人が同意すると思います。最初はCassiniのような軽量のWebサーバーですが、後でさらに機能が追加されます(コメントされた別の回答のように、より多くの機能が完全なWebサーバーとして扱われます)。完全に管理されていますが(ネイティブの依存関係がいくつかあります)、CassiniのようなおもちゃのWebサーバーではなくなりました。
では、なぜケストレルを使用できないのですか?なぜIIS Expressおよび潜在的にIIS、nginx、またはApacheがまだ必要ですか?これは主に、今日のインターネットの実践の結果です。ほとんどのWebサイトは、リバースプロキシを使用してWebブラウザーからリクエストを取得し、バックグラウンドでアプリケーションサーバーに転送します。
別の回答では、Microsoftのドキュメントへのリンクが既に示されているので、ご覧ください。
マイクロソフトは、最初にIISをJava/Pythonなどの十分なリバースプロキシにするためにHttpPlatformHandlerを開発したため、ASP.NET Coreで使用する予定です。開発中に問題が発生し始めたため、後にMicrosoftはASP.NET CoreモジュールをASP.NET Core専用に作成しました。 IISリビジョン4でのASP.NETサポートです。
ASP.NET Core 2.2以降、IIS(バージョン2)用のASP.NET Core Moduleは、IISワーカープロセス(w3wp.exe
)内の.NET Core環境をホストできます。 ASP.NET 2.x/4.xに似ています。このモードは "IISインプロセスホスティング" と呼ばれます。 IISリビジョン5でのASP.NETサポートと見なすことができます。
まあ、かなり長いですが、必要なものをすべてまとめて読んでください。
Msドキュメントから: https://docs.Microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?tabs=aspnetcore2x
Kestrelは、クロスプラットフォームの非同期I/Oライブラリであるlibuvに基づいたASP.NET Core用のクロスプラットフォームWebサーバーです。 Kestrelは、デフォルトでASP.NET Coreプロジェクトテンプレートに含まれているWebサーバーです。
Kestrelは単独で使用することも、IIS、Nginx、Apacheなどのリバースプロキシサーバーで使用することもできます。リバースプロキシサーバーは、インターネットからHTTPリクエストを受信し、予備処理を行った後にそれらをKestrelに転送します。
Asp.net core 2.1のドキュメントから: https://docs.Microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-2.1#transport-configuration
ASP.NET Core 2.1のリリースにより、KestrelのデフォルトのトランスポートはLibuvベースではなく、マネージドソケットベースになりました。