web-dev-qa-db-ja.com

ケストレルとは(vs IIS / Express)

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でさえ混乱していますが、代替手段はないようです-最も単純なサンプルはケストレルを使用します。

122
Sean

ケストレルとは

本格的な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を使用する利点はまだあります。具体的には、セキュリティ構成、カーネルレベルのキャッシュなどを提供します。

96
vcsjones

WindowsとIISのみを使用している場合でも、Kestrelが登場する理由を理解できるように、いくつかの歴史を持つ別の回答を提供したいと思います。

2000年より前のASP.NET開発の最初の段階で、Microsoftは明らかにASP.NET WebFormsアプリをホストするために2つのピースを作成しました。

  • Cassiniは、後にVisual StudioのASP.NET開発サーバーになりました。 HttpListenerに基づいてC#で記述された完全に管理されたWebサーバーです。もちろん、開発専用であるため、多くの機能は実装されていません。 MicrosoftがCassiniのソースコードを公開したため、コードベースを分岐し、Cassiniファミリを開始した機能を追加したサードパーティがいます。
  • IIS(リビジョン1)でのASP.NETサポート。 IISは4.0および5.0/5.1であり、アプリケーションプールのようなものはなかったため、ASP.NETには独自のワーカープロセス(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.dllwebengine4.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ブラウザーからリクエストを取得し、バックグラウンドでアプリケーションサーバーに転送します。

  • IIS Express/IIS/nginx/Apacheはリバースプロキシサーバーです
  • Kestrel/NodeJS/Tomcatなどはアプリケーションサーバーです

別の回答では、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サポートと見なすことができます。

まあ、かなり長いですが、必要なものをすべてまとめて読んでください。

115
Lex Li

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に転送します。


更新:.netコア2.1、Kestrelはlibuvの場合、代わりにマネージドソケットを使用します

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ベースではなく、マネージドソケットベースになりました。

7
Max