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.

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

インプロセス ホスティング モデルIn-process hosting model

インプロセス ホスティング モデルを使用する場合、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 モジュール:The ASP.NET Core Module:

  • アプリの初期化を実行します。Performs app initialization.
    • CoreCLR を読み込みます。Loads the CoreCLR.
    • Program.Main.Calls Program.Main.
  • IIS ネイティブ要求の有効期間を処理します。Handles the lifetime of the IIS native request.

.NET Framework をターゲットにする ASP.NET Core アプリではインプロセス ホスティング モデルはサポートされていません。The in-process hosting model isn't supported for ASP.NET Core apps that target the .NET Framework.

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

ASP.NET Core モジュール

Web からカーネル モードの HTTP.sys ドライバーに要求が届きます。A request arrives from the web to the kernel-mode HTTP.sys driver. このドライバーによって、Web サイトの構成ポート (通常は 80 (HTTP) または 443 (HTTPS)) 上で IIS へのネイティブ要求がルーティングされます。The driver routes the native request to IIS on the website's configured port, usually 80 (HTTP) or 443 (HTTPS). モーダルは、ネイティブ要求を受け取り、それを IIS HTTP サーバー (IISHttpServer) に渡します。The module receives the native request and passes it to IIS HTTP Server (IISHttpServer). IIS HTTP サーバーは IIS 用のインプロセス サーバーの実装であり、要求がネイティブからマネージドに変換されます。IIS HTTP Server is an in-process server implementation for IIS that converts the request from native to managed.

IIS HTTP サーバーによって要求が処理された後、その要求は ASP.NET Core ミドルウェア パイプラインにプッシュされます。After the IIS HTTP Server processes the request, 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 に渡され、その応答は IIS から要求を開始したクライアントにプッシュで戻されます。The app's response is passed back to IIS, which pushes it back out to the client that initiated the request.

インプロセス ホスティングは既存のアプリではオプトインになっていますが、dotnet new テンプレートは既定ではすべての IIS および IIS Express シナリオにおいてインプロセス ホスティング モデルに設定されています。In-process hosting is opt-in for existing apps, but dotnet new templates default to the in-process hosting model for all IIS and IIS Express scenarios.

アウト プロセス ホスティング モデルOut-of-process hosting model

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.

モジュールが起動時に環境変数を介してポートを指定すると、サーバーは http://localhost:{PORT} をリッスンするように、IIS 統合ミドルウェアによって構成されます。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:

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.

モジュールが起動時に環境変数を介してポートを指定すると、サーバーは http://localhost:{port} をリッスンするように、IIS 統合ミドルウェアによって構成されます。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:

KestrelKestrel

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

Kestrel は次のように使用できます。Kestrel can be used:

  • これ自体で、インターネットを含むネットワークから直接要求を処理するエッジ サーバーとして。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 を単独で使用することができます。If the app only accepts requests from an internal network, Kestrel can be used by itself.

内部ネットワークと直接通信する Kestrel

アプリをインターネットに公開する場合は、Kestrel がインターネット インフォメーション サービス (IIS)NginxApache などのリバース プロキシ サーバーを使用する必要があります。If the app is exposed to the Internet, Kestrel must use 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

インターネットに直接公開される一般向けのエッジ サーバー展開でリバース プロキシを使用する最も重要な理由は、セキュリティです。The most important reason for using a reverse proxy for public-facing edge server deployments that are exposed directly the Internet is security. 1.x バージョンの Kestrel はインターネットからの攻撃を防御する重要なセキュリティ機能を備えていません。The 1.x versions of Kestrel don't include important security features to defend against attacks from the Internet. これには、適切なタイムアウト、要求サイズの制限、およびコンカレント接続の制限などが含まれます (ただし、これらに限定されない)。This includes, but isn't limited to, appropriate timeouts, request size limits, and concurrent connection limits.

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 サーバーの実装.

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 をホストする.

IIS HTTP サーバーIIS HTTP Server

IIS HTTP サーバーは、IIS 用のインプロセス サーバーであり、インプロセスの展開に必要です。IIS HTTP Server is an in-process server for IIS and required for in-process deployments. ASP.NET Core モジュールでは、IIS と IIS HTTP サーバーの間のネイティブ IIS 要求が処理されます。The ASP.NET Core Module handles native IIS requests between IIS and IIS HTTP Server. 詳細については、「ASP.NET Core モジュール」を参照してください。For more information, see 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