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 sets of request features composed into an HttpContext.

ASP.NET Core には、次のサーバー実装が付属しています。ASP.NET Core ships with the following server implementations:

KestrelKestrel

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

Kestrel は単独で使用することも、IIS、Nginx、または Apache などのリバース プロキシ サーバーと併用することもできます。Kestrel can be used by itself or with a reverse proxy server, such as IIS, Nginx, or Apache. リバース プロキシ サーバーはインターネットから HTTP 要求を受け取り、事前にいくつかの処理を行ってから Kestrel に転送します。A reverse proxy server receives HTTP requests from the Internet and forwards them to Kestrel after some preliminary handling.

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

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

リバース プロキシ サーバーの有無に関わらず、いずれの構成も有効で、ASP.NET Core 2.0 またはそれ以降のアプリ用にホスティング構成がサポートされている必要があります。Either configuration—with or without a reverse proxy server—is a valid and supported hosting configuration for ASP.NET Core 2.0 or later apps. 詳細については、「When to use Kestrel with a reverse proxy」 (Kestrel とリバース プロキシを使用するタイミング) を参照してください。For more information, see When to use Kestrel with a reverse proxy.

アプリが内部ネットワークからの要求のみを受け入れる場合は、Kestrel を単独で使用することができます。If the app only accepts requests from an internal network, Kestrel can be used by itself.

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

アプリをインターネットに公開する場合は、Kestrel がリバース プロキシ サーバーとして IIS、Nginx、または Apache を使用する必要があります。If the app is exposed to the Internet, Kestrel must use IIS, Nginx, or Apache as a reverse proxy server. 以下の図のように、リバース プロキシ サーバーはインターネットから HTTP 要求を受け取り、事前にいくつかの処理を行ってから Kestrel に転送します。A reverse proxy server receives HTTP requests from the Internet and forwards them to Kestrel after some preliminary handling, as shown in the following diagram:

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 have 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.

詳細については、「When to use Kestrel with a reverse proxy」 (Kestrel とリバース プロキシを使用するタイミング) を参照してください。For more information, see When to use Kestrel with a reverse proxy.

IIS、Nginx、および Apache を Kestrel やカスタム サーバー実装なしで使用することはできません。IIS, Nginx, and Apache can't be used without Kestrel or a custom server implementation. ASP.NET Core は、プラットフォーム間で一貫して動作できるように、独自のプロセスで実行するように設計されています。ASP.NET Core was designed to run in its own process so that it can behave consistently across platforms. IIS、Nginx、および Apache では独自のスタートアップ プロシージャと環境が指定されます。IIS, Nginx, and Apache dictate their own startup procedure and environment. これらのサーバー テクノロジを直接使用するには、ASP.NET Core を各サーバーの要件に適合させる必要があります。To use these server technologies directly, ASP.NET Core would need to adapt to the requirements of each server. Kestrel などの Web サーバー実装を使用することで、ASP.NET Core は異なるサーバー テクノロジでホストされている場合でもスタートアップ プロセスと環境を制御できます。Using a web server implementation, such as Kestrel, ASP.NET Core has control over the startup process and environment when hosted on different server technologies.

IIS と KestrelIIS with Kestrel

IIS または IIS Express を使用している場合、ASP.NET Core アプリは、IIS ワーカー プロセスと同じプロセス (インプロセス ホスティング モデル) または IIS ワーカー プロセスとは別のプロセス (アウトプロセス ホスティング モデル) のいずれかで実行されます。When using IIS or IIS Express, the ASP.NET Core app either runs in the same process as the IIS worker process (the in-process hosting model) or in a process separate from the IIS worker process (the out-of-process hosting model).

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

ASP.NET Core のリバース プロキシとして IIS または IIS Express を使用する場合、ASP.NET Core アプリは IIS ワーカー プロセスとは別のプロセスで実行されます。When using IIS or IIS Express as a reverse proxy for ASP.NET Core, the ASP.NET Core app runs in a process separate from the IIS worker process. IIS プロセスで、ASP.NET Core モジュールがリバース プロキシの関係を調整します。In the IIS process, the ASP.NET Core Module coordinates the reverse proxy relationship. ASP.NET Core モジュールの主な機能は、ASP.NET Core アプリを開始し、クラッシュ時にアプリを再始動し、HTTP トラフィックをアプリに転送することです。The primary functions of the ASP.NET Core Module are to start the ASP.NET Core app, restart the app when it crashes, and forward HTTP traffic to the app. 詳細については、「ASP.NET Core モジュール」を参照してください。For more information, see ASP.NET Core モジュール.

Nginx と KestrelNginx with Kestrel

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

Apache と KestrelApache with Kestrel

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

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. HTTP.sys の情報については、HTTP.sys に関するページを参照してください。For information on HTTP.sys, see HTTP.sys.

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

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

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

ASP.NET Core 1.x では、HTTP.sys は WebListener と呼ばれます。HTTP.sys is named WebListener in ASP.NET Core 1.x. IIS がホストアプリで使用できないシナリオにおいて、Windows で ASP.NET Core アプリを実行する場合は、WebListener を代わりに使用できます。If ASP.NET Core apps are run on Windows, WebListener is an alternative for scenarios where IIS isn't available to host apps.

インターネットと直接通信する Weblistener

内部ネットワークにのみ公開されるアプリで、必要な機能が WebListener でサポートされていて、Kestrel ではサポートされていない場合、Kestrel の代わりに WebListener も使用できます。WebListener can also be used in place of Kestrel for apps that are only exposed to an internal network, if required capabilities are supported by WebListener but not Kestrel. WebListener の情報については、WebListener に関するページを参照してください。For information on WebListener, see WebListener.

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

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 (ASP.NET Core 1.x の WebListener) は、それぞれ単独の機能 IServerAddressesFeature のみを公開しますが、サーバー実装が異なると追加機能が公開される場合があります。Kestrel and HTTP.sys (WebListener in ASP.NET Core 1.x) 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

Visual StudioVisual Studio for Mac、または Visual Studio Code を使用する場合、サーバーはアプリが統合開発環境 (IDE) によって開始されたときに起動します。When using Visual Studio, Visual Studio for Mac, or Visual Studio Code, the server is launched when the app is started by the Integrated Development Environment (IDE). Windows の Visual Studio では、IIS Express/ASP.NET Core モジュールまたはコンソールで、起動プロファイルを使用してアプリとサーバーを開始することができます。In Visual Studio on Windows, launch profiles can be used to start the app and server with either IIS Express/ASP.NET Core Module or the console. Visual Studio Code では、CoreCLR デバッガーをアクティブ化する Omnisharp によって、アプリとサーバーが開始します。In Visual Studio Code, the app and server are started by Omnisharp, which activates the CoreCLR debugger. Visual Studio for Mac を使用する場合は、アプリとサーバーが Mono の Soft-Mode Debugger によって開始します。Using Visual Studio for Mac, the app and server are started by the Mono Soft-Mode Debugger.

コマンド プロンプトからプロジェクトのフォルダーでアプリを起動する場合、dotnet run でアプリとサーバーが起動します (Kestrel および HTTP.sys のみ)。When launching an 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 the dotnet run and .NET Core distribution packaging topics.

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