Реализации веб-сервера в ASP.NET CoreWeb server implementations in ASP.NET Core

Авторы: Том Дисктра (Tom Dykstra), Стив Смит (Steve Smith), Стивен Хальтер (Stephen Halter) и Крис Росс (Chris Ross)By 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.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, Nginx или Apache.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.

    Kestrel взаимодействует с Интернетом косвенно, через обратный прокси-сервер, такой как IIS, Nginx или Apache.

Любая из этих конфигураций размещения—с обратным прокси-сервером и без него— поддерживается для приложений 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 в конфигурации обратного прокси-сервера, см. в статье Реализации веб-сервера Kestrel в ASP.NET Core.For Kestrel configuration guidance and information on when to use Kestrel in a reverse proxy configuration, see Реализации веб-сервера Kestrel в ASP.NET Core.

В состав 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-сервером IIS (внутрипроцессно) или сервером Kestrel.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. Это, по сути, совпадает с поведением приложений, выполняемых внутрипроцессно и управляемых службой активации процессов Windows (WAS).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 приложение запускается отдельно от рабочего процесса IIS (внепроцессно) с сервером Kestrel.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. Это, по сути, совпадает с поведением приложений, выполняемых внутрипроцессно и управляемых службой активации процессов Windows (WAS).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

Запросы поступают из Интернета в драйвер HTTP.sys в режиме ядра.Requests arrive from the web to the kernel-mode HTTP.sys driver. Драйвер направляет запросы к службам IIS на настроенный порт веб-сайта — обычно 80 (HTTP) или 443 (HTTPS).The driver routes the requests to IIS on the website's configured port, usually 80 (HTTP) or 443 (HTTPS). Модуль перенаправляет запросы Kestrel на случайный порт для приложения, отличающийся от порта 80 или 443.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, поэтому запросы переадресовываются по протоколу HTTP, даже если были получены IIS по протоколу HTTPS.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-адрес и базовый путь для переадресации запроса в Kestrel.Middleware added by IIS Integration updates the scheme, remote IP, and pathbase to account for forwarding the request to Kestrel. Отклик приложения передается обратно в службу IIS, которая отправляет его обратно в HTTP-клиент, инициировавший запрос.The app's response is passed back to IIS, which pushes it back out to the HTTP client that initiated the request.

Инструкции по настройке модуля ASP.NET Core и IIS см. в следующих статьях:For IIS and ASP.NET Core Module configuration guidance, see the following topics:

Nginx с KestrelNginx with Kestrel

Сведения о том, как использовать Nginx в Linux в качестве обратного прокси-сервера для Kestrel, см. в Среда размещения ASP.NET Core в операционной системе Linux с Nginx.For information on how to use Nginx on Linux as a reverse proxy server for Kestrel, see Среда размещения ASP.NET Core в операционной системе Linux с Nginx.

Apache с KestrelApache with Kestrel

Сведения о том, как использовать Apache в Linux в качестве обратного прокси-сервера для Kestrel, см. в Размещение ASP.NET Core в операционной системе Linux с Apache.For information on how to use Apache on Linux as a reverse proxy server for Kestrel, see Размещение ASP.NET Core в операционной системе Linux с Apache.

HTTP.sysHTTP.sys

Если приложение ASP.NET Core запускается в Windows, вместо Kestrel можно использовать HTTP.sys.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 в ASP.NET Core.For more information, see Реализация веб-сервера HTTP.sys в ASP.NET Core.

HTTP.sys взаимодействует с Интернетом напрямую

HTTP.sys можно также использовать для приложений, которые имеют доступ только к внутренней сети.HTTP.sys can also be used for apps that are only exposed to an internal network.

HTTP.sys взаимодействует с внутренней сетью напрямую

Инструкции по настройке HTTP.sys см. в статье Реализация веб-сервера HTTP.sys в ASP.NET Core.For HTTP.sys configuration guidance, see Реализация веб-сервера HTTP.sys в ASP.NET Core.

Инфраструктура сервера ASP.NET CoreASP.NET Core server infrastructure

IApplicationBuilder, доступный в методе Startup.Configure, предоставляет свойство ServerFeatures типа IFeatureCollection.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. В руководстве по открытому веб-интерфейсу .NET (OWIN) демонстрируется запись реализации IServer на основе Nowin.The Open Web Interface for .NET (OWIN) guide demonstrates how to write a Nowin-based IServer implementation. Требуют реализации только интерфейсы компонентов, используемых приложением, но как минимум должны поддерживаться IHttpRequestFeature и IHttpResponseFeature.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). Конфигурация определяется параметром -c|--configuration, который может принимать значение Debug (по умолчанию) или Release.The configuration is specified by the -c|--configuration option, which is set to either Debug (default) or Release. Если профили запуска указаны в файле launchSettings.json, используйте параметр --launch-profile <NAME>, чтобы настроить профиль запуска (например, Development или Production).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/2HTTP/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†
      • Linux с OpenSSL 1.0.2 или более поздней версии (например, 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 Framework: .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 Framework: .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 предусмотрена ограниченная поддержка HTTP/2 в Windows Server 2012 R2 и Windows 8.1.†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