ASP.NET Core での Web サーバーの実装Web server implementations in ASP.NET Core

作成者: Tom DykstraSteve SmithStephen HalterChris RossBy Tom Dykstra, Steve Smith, Stephen Halter, and Chris Ross

ASP.NET Core アプリは、インプロセス HTTP サーバー実装を使用して実行されます。An ASP.NET Core app runs with an in-process HTTP server implementation. サーバーの実装では、HTTP 要求がリッスンされ、HttpContext に構成された要求機能のセットとしてアプリに公開されます。The server implementation listens for HTTP requests and surfaces them to the app as a set of request features composed into an HttpContext.

KestrelKestrel

Kestrel は、ASP.NET Core のプロジェクト テンプレートに含まれる既定の Web サーバーです。Kestrel is the default web server included in ASP.NET Core project templates.

Kestrel を使用する:Use Kestrel:

  • これ自体で、インターネットを含むネットワークから直接要求を処理するエッジ サーバーとして。By itself as an edge server processing requests directly from a network, including the Internet.

    リバース プロキシ サーバーなしでインターネットと直接通信する Kestrel

  • インターネット インフォメーション サービス (IIS)NginxApache などのリバース プロキシ サーバーと共に。With a reverse proxy server, such as Internet Information Services (IIS), Nginx, or Apache. リバース プロキシ サーバーはインターネットから HTTP 要求を受け取り、これを Kestrel に転送します。A reverse proxy server receives HTTP requests from the Internet and forwards them to Kestrel.

    IIS、Nginx、または Apache などのリバース プロキシ サーバーを介してインターネットと間接的に通信する Kestrel

いずれのホスティング構成も、リバース プロキシ サーバーの有無に関わらず、ASP.NET Core 2.1 以降のアプリに対してサポートされます。Either hosting configuration—with or without a reverse proxy server—is supported for ASP.NET Core 2.1 or later apps.

Kestrel の構成ガイダンスおよびリバース プロキシ構成で Kestrel を使用するときの情報については、「ASP.NET Core への Kestrel Web サーバーの実装」をご覧ください。For Kestrel configuration guidance and information on when to use Kestrel in a reverse proxy configuration, see ASP.NET Core への Kestrel Web サーバーの実装.

ASP.NET Core には次のものが付属しています。ASP.NET Core ships with the following:

IIS または IIS Express を使用すると、アプリは次のどちらかで実行されます。When using IIS or IIS Express, the app either runs:

ASP.NET Core モジュールはネイティブの IIS モジュールであり、IIS とインプロセス IIS HTTP サーバーまたは Kestrel の間のネイティブ IIS 要求が処理されます。The ASP.NET Core Module is a native IIS module that handles native IIS requests between IIS and the in-process IIS HTTP Server or Kestrel. 詳細については、ASP.NET Core モジュール を参照してください。For more information, see ASP.NET Core モジュール.

ホスティング モデルHosting models

インプロセス ホスティング モデルを使用する場合、ASP.NET Core アプリはその IIS ワーカー プロセスと同じプロセスで実行されます。Using in-process hosting, an ASP.NET Core app runs in the same process as its IIS worker process. インプロセス ホスティングは、パフォーマンスの点でアウトプロセス ホスティングよりも優れています。要求がループバック アダプター (発信されたネットワーク トラフィックを同じコンピューターに送り返すネットワーク インターフェイス) を介してプロキシされることがないからです。In-process hosting provides improved performance over out-of-process hosting because requests aren't proxied over the loopback adapter, a network interface that returns outgoing network traffic back to the same machine. IIS では Windows プロセス アクティブ化サービス (WAS) を使用してプロセス管理が処理されます。IIS handles process management with the Windows Process Activation Service (WAS).

アウト プロセス ホスティングでは ASP.NET Core アプリは IIS ワーカー プロセスとは独立したプロセスで実行され、プロセス管理はモジュールによって処理されます。Using out-of-process hosting, ASP.NET Core apps run in a process separate from the IIS worker process, and the module handles process management. モジュールでは、最初の要求が届いたときに ASP.NET Core アプリのプロセスが開始され、プロセスがシャットダウンまたはクラッシュした場合はアプリが再起動されます。The module starts the process for the ASP.NET Core app when the first request arrives and restarts the app if it shuts down or crashes. この動作は、インプロセスで実行されるアプリであり、WAS (Windows プロセス アクティブ化サービス) によって管理されるアプリと基本的に同じです。This is essentially the same behavior as seen with apps that run in-process that are managed by the Windows Process Activation Service (WAS).

詳細および構成のガイダンスについては、次のトピックを参照してください:For more information and configuration guidance, see the following topics:

ASP.NET Core には次のものが付属しています。ASP.NET Core ships with the following:

IIS または IIS Express を使用すると、アプリは Kestrel サーバーを使用して IIS ワーカー プロセスとは異なるプロセス内で実行されます ("プロセス外")。When using IIS or IIS Express, the app runs in a process separate from the IIS worker process (out-of-process) with the Kestrel server.

ASP.NET Core アプリは IIS ワーカー プロセスとは独立したプロセスで実行されるため、プロセス管理はモジュールによって処理されます。Because ASP.NET Core apps run in a process separate from the IIS worker process, the module handles process management. モジュールでは、最初の要求が届いたときに ASP.NET Core アプリのプロセスが開始され、プロセスがシャットダウンまたはクラッシュした場合はアプリが再起動されます。The module starts the process for the ASP.NET Core app when the first request arrives and restarts the app if it shuts down or crashes. この動作は、インプロセスで実行されるアプリであり、WAS (Windows プロセス アクティブ化サービス) によって管理されるアプリと基本的に同じです。This is essentially the same behavior as seen with apps that run in-process that are managed by the Windows Process Activation Service (WAS).

次の図は、IIS (ASP.NET Core モジュール) とアウトプロセスでホストされるアプリとの間のリレーションシップを示しています。The following diagram illustrates the relationship between IIS, the ASP.NET Core Module, and an app hosted out-of-process:

ASP.NET Core モジュール

要求は、Web からカーネル モードの HTTP.sys ドライバーに到着します。Requests arrive from the web to the kernel-mode HTTP.sys driver. ドライバーは、Web サイトの構成ポート (通常は 80 (HTTP) または 443 (HTTPS)) で IIS への要求をルーティングします。The driver routes the requests to IIS on the website's configured port, usually 80 (HTTP) or 443 (HTTPS). モジュールでは、アプリのランダムなポート (ポート 80 または 443 ではありません) で Kestrel に要求が転送されます。The module forwards the requests to Kestrel on a random port for the app, which isn't port 80 or 443.

モジュールによってスタートアップ時に環境変数を介してポートが指定されると、IIS 統合ミドルウェアによって http://localhost:{port} をリッスンするようにサーバーが構成されます。The module specifies the port via an environment variable at startup, and the IIS Integration Middleware configures the server to listen on http://localhost:{port}. 追加のチェックが実行され、モジュールから発生していない要求は拒否されます。Additional checks are performed, and requests that don't originate from the module are rejected. モジュールでは HTTPS 転送がサポートされていないため、要求は HTTPS を介して IIS によって受信された場合でも、HTTP を介して転送されます。The module doesn't support HTTPS forwarding, so requests are forwarded over HTTP even if received by IIS over HTTPS.

Kestrel によってモジュールから要求が取り込まれた後、その要求は ASP.NET Core ミドルウェア パイプラインにプッシュされます。After Kestrel picks up the request from the module, the request is pushed into the ASP.NET Core middleware pipeline. ミドルウェア パイプラインは要求を処理し、HttpContext インスタンスとしてアプリのロジックに渡します。The middleware pipeline handles the request and passes it on as an HttpContext instance to the app's logic. IIS 統合によって追加されたミドルウェアでは、カーネルへの要求の転送を考慮して、スキーム、リモート IP、およびパスベースが更新されます。Middleware added by IIS Integration updates the scheme, remote IP, and pathbase to account for forwarding the request to Kestrel. アプリの応答が IIS に戻され、IIS はその応答を、要求を開始した HTTP クライアントに返します。The app's response is passed back to IIS, which pushes it back out to the HTTP client that initiated the request.

IIS と ASP.NET Core モジュールの構成のガイダンスについては、次のトピックをご覧ください。For IIS and ASP.NET Core Module configuration guidance, see the following topics:

Nginx と KestrelNginx with Kestrel

Kestrel のリバース プロキシ サーバーとして Linux で Nginx を使用する方法については、Nginx 搭載の Linux で ASP.NET Core をホストする を参照してください。For information on how to use Nginx on Linux as a reverse proxy server for Kestrel, see Nginx 搭載の Linux で ASP.NET Core をホストする.

Apache と KestrelApache with Kestrel

Kestrel のリバース プロキシ サーバーとして Linux で Apache を使用する方法については、Apache 搭載の Linux で ASP.NET Core をホストする を参照してください。For information on how to use Apache on Linux as a reverse proxy server for Kestrel, see Apache 搭載の Linux で ASP.NET Core をホストする.

HTTP.sysHTTP.sys

Windows で ASP.NET Core アプリを実行する場合は、HTTP.sys を Kestrel の代わりに使用できます。If ASP.NET Core apps are run on Windows, HTTP.sys is an alternative to Kestrel. 最適なパフォーマンスを得るには、通常は Kestrel をお勧めします。Kestrel is generally recommended for best performance. HTTP.sys は、アプリがインターネットに公開されていて、必要な機能が HTTP.sys でサポートされているものの、Kestrel ではサポートされていないシナリオで使用できます。HTTP.sys can be used in scenarios where the app is exposed to the Internet and required capabilities are supported by HTTP.sys but not Kestrel. 詳細については、ASP.NET Core での HTTP.sys Web サーバーの実装 を参照してください。For more information, see ASP.NET Core での HTTP.sys Web サーバーの実装.

インターネットと直接通信する HTTP.sys

HTTP.sys は、内部ネットワークにのみ公開されるアプリにも使用できます。HTTP.sys can also be used for apps that are only exposed to an internal network.

内部ネットワークと直接通信する HTTP.sys

HTTP.sys の構成のガイダンスについては、「ASP.NET Core での HTTP.sys Web サーバーの実装」をご覧ください。For HTTP.sys configuration guidance, see ASP.NET Core での HTTP.sys Web サーバーの実装.

ASP.NET Core サーバー インフラストラクチャASP.NET Core server infrastructure

Startup.Configure メソッドで使用可能な IApplicationBuilder は、IFeatureCollection 型の ServerFeatures プロパティを公開します。The IApplicationBuilder available in the Startup.Configure method exposes the ServerFeatures property of type IFeatureCollection. Kestrel および HTTP.sys は、それぞれ単独の機能 IServerAddressesFeature のみを公開しますが、サーバーの実装が異なると追加機能が公開される場合があります。Kestrel and HTTP.sys only expose a single feature each, IServerAddressesFeature, but different server implementations may expose additional functionality.

IServerAddressesFeature を使用すれば、実行時にサーバー実装がバインドされたポートを見つけることができます。IServerAddressesFeature can be used to find out which port the server implementation has bound at runtime.

カスタム サーバーCustom servers

組み込みサーバーがアプリの要件に合わない場合は、カスタム サーバー実装を作成できます。If the built-in servers don't meet the app's requirements, a custom server implementation can be created. Nowin ベースの IServer 実装の作成方法については、Open Web Interface for .NET (OWIN) のガイドを参照してください。The Open Web Interface for .NET (OWIN) guide demonstrates how to write a Nowin-based IServer implementation. 実装を必要とするのは、アプリで使用される機能のインターフェイスのみです。ただし、少なくとも IHttpRequestFeatureIHttpResponseFeature はサポートされている必要があります。Only the feature interfaces that the app uses require implementation, though at a minimum IHttpRequestFeature and IHttpResponseFeature must be supported.

サーバーの起動Server startup

統合開発環境 (IDE) またはエディターでアプリが開始されると、サーバーが起動されます。The server is launched when the Integrated Development Environment (IDE) or editor starts the app:

コマンド プロンプトからプロジェクトのフォルダーでアプリを起動すると、dotnet run によってアプリとサーバーが起動されます (Kestrel および HTTP.sys のみ)。When launching the app from a command prompt in the project's folder, dotnet run launches the app and server (Kestrel and HTTP.sys only). この構成は、Debug (既定) または Release のどちらかに設定された -c|--configuration オプションによって指定されます。The configuration is specified by the -c|--configuration option, which is set to either Debug (default) or Release. 起動プロファイルが launchSettings.json ファイルに存在する場合は、--launch-profile <NAME> オプションを使用して起動プロファイルを設定します (DevelopmentProduction など)。If launch profiles are present in a launchSettings.json file, use the --launch-profile <NAME> option to set the launch profile (for example, Development or Production). 詳しくは、「dotnet run」および「.NET Core の配布パッケージ」をご覧ください。For more information, see dotnet run and .NET Core distribution packaging.

HTTP/2 のサポートHTTP/2 support

HTTP/2 は、次の展開シナリオでの ASP.NET Core でサポートされます。HTTP/2 is supported with ASP.NET Core in the following deployment scenarios:

  • KestrelKestrel
    • オペレーティング システムOperating system
      • Windows Server 2016/Windows 10 以降†Windows Server 2016/Windows 10 or later†
      • OpenSSL 1.0.2 以降を使用した Linux (Ubuntu 16.04 以降など)Linux with OpenSSL 1.0.2 or later (for example, Ubuntu 16.04 or later)
      • 将来のリリースでは HTTP/2 が macOS 上でサポートされるようになります。HTTP/2 will be supported on macOS in a future release.
    • ターゲット フレームワーク: .NET Core 2.2 以降Target framework: .NET Core 2.2 or later
  • HTTP.sysHTTP.sys
    • Windows Server 2016/Windows 10 以降Windows Server 2016/Windows 10 or later
    • ターゲット フレームワーク:HTTP.sys の展開には適用できません。Target framework: Not applicable to HTTP.sys deployments.
  • IIS (インプロセス)IIS (in-process)
    • Windows Server 2016/Windows 10 以降、IIS 10 以降Windows Server 2016/Windows 10 or later; IIS 10 or later
    • ターゲット フレームワーク: .NET Core 2.2 以降Target framework: .NET Core 2.2 or later
  • IIS (アウトプロセス)IIS (out-of-process)
    • Windows Server 2016/Windows 10 以降、IIS 10 以降Windows Server 2016/Windows 10 or later; IIS 10 or later
    • 一般向けのエッジ サーバーでは HTTP/2 を使用しますが、Kestrel へのリバース プロキシ接続では HTTP/1.1 を使用します。Public-facing edge server connections use HTTP/2, but the reverse proxy connection to Kestrel uses HTTP/1.1.
    • ターゲット フレームワーク:IIS アウトプロセスの展開には適用できません。Target framework: Not applicable to IIS out-of-process deployments.

†Kestrel では、Windows Server 2012 R2 および Windows 8.1 上での HTTP/2 のサポートは制限されています。†Kestrel has limited support for HTTP/2 on Windows Server 2012 R2 and Windows 8.1. サポートが制限されている理由は、これらのオペレーティング システムで使用できる TLS 暗号のスイートのリストが制限されているためです。Support is limited because the list of supported TLS cipher suites available on these operating systems is limited. TLS 接続をセキュリティで保護するためには、楕円曲線デジタル署名アルゴリズム (ECDSA) を使用して生成した証明書が必要になる場合があります。A certificate generated using an Elliptic Curve Digital Signature Algorithm (ECDSA) may be required to secure TLS connections.

  • HTTP.sysHTTP.sys
    • Windows Server 2016/Windows 10 以降Windows Server 2016/Windows 10 or later
    • ターゲット フレームワーク:HTTP.sys の展開には適用できません。Target framework: Not applicable to HTTP.sys deployments.
  • IIS (アウトプロセス)IIS (out-of-process)
    • Windows Server 2016/Windows 10 以降、IIS 10 以降Windows Server 2016/Windows 10 or later; IIS 10 or later
    • 一般向けのエッジ サーバーでは HTTP/2 を使用しますが、Kestrel へのリバース プロキシ接続では HTTP/1.1 を使用します。Public-facing edge server connections use HTTP/2, but the reverse proxy connection to Kestrel uses HTTP/1.1.
    • ターゲット フレームワーク:IIS アウトプロセスの展開には適用できません。Target framework: Not applicable to IIS out-of-process deployments.

HTTP/2 接続では、アプリケーション レイヤー プロトコルのネゴシエーション (ALPN) および TLS 1.2 以降を使用する必要があります。An HTTP/2 connection must use Application-Layer Protocol Negotiation (ALPN) and TLS 1.2 or later. 詳細については、ご利用のサーバーの展開シナリオに関連するトピックを参照してください。For more information, see the topics that pertain to your server deployment scenarios.

その他の技術情報Additional resources