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

Авторы: Том Дисктра (Tom Dykstra), Стив Смит (Steve Smith), Стивен Хальтер (Stephen Halter) и Крис Росс (Chris Ross)

Приложение ASP.NET Core выполняется вместе с внутрипроцессной реализацией HTTP-сервера. Реализация сервера прослушивает HTTP-запросы и передает их в приложение как набор функций запросов, объединенных в HttpContext.

В состав ASP.NET Core входит следующее:

При использовании IIS или IIS Express приложение запускается одним из следующих способов:

Модуль ASP.NET Core представляет собой собственный модуль IIS, который обрабатывает собственные запросы IIS между IIS и внутрипроцессным HTTP-сервером IIS или Kestrel. Дополнительные сведения см. в разделе Модуль ASP.NET Core для IIS.

Kestrel в сравнении с HTTP.sys

Kestrel имеет следующие преимущества перед HTTP.sys:

  • Повышенная производительность и более эффективное использование памяти.
  • Кроссплатформенные
  • Гибкость, поскольку разработка и установка исправлений осуществляется независимо от операционной системы.
  • Программный порт и конфигурация TLS.
  • Расширяемость, обеспечивающая использование таких протоколов, как PPv2, и альтернативные транспорты.

HTTP.sys выступает в качестве общего компонента режима ядра со следующими функциями, которыми не обладает Kestrel:

Модели размещения

При внутрипроцессном размещении приложение ASP.NET Core выполняется в том же процессе, что и рабочий процесс IIS. При этом повышается производительность по сравнению с внепроцессным размещением, так как запросы не передаются через адаптер замыкания на себя (сетевой интерфейс, который возвращает исходящий сетевой трафик на тот же компьютер). IIS обрабатывает управление процессом с помощью службы активации процессов Windows (WAS).

При внепроцессном размещении приложения ASP.NET Core выполняются в процессе, отделенном от рабочего процесса IIS, а модуль управляет процессами. Модуль запускает процесс для приложения ASP.NET Core при поступлении первого запроса и перезапускает приложение при сбое или завершении работы. Это, по сути, совпадает с поведением приложений, выполняемых внутрипроцессно и управляемых службой активации процессов Windows (WAS). Использование отдельного процесса также позволяет размещать более одного приложения из одного пула приложений.

Дополнительные сведения и инструкции по настройке см. в следующих статьях:

Kestrel

Kestrel сервер представляет собой кроссплатформенную реализацию HTTP-сервера по умолчанию. Kestrel обеспечивает максимальную производительность и использование памяти, но обладает некоторыми дополнительными функциями в HTTP.sys. Дополнительные сведения см. в разделе Kestrel и HTTP.sys настоящего документа.

Используйте Kestrel в следующих случаях:

  • Сам по себе как пограничный сервер обработки запросов непосредственно из сети, включая Интернет.

    Kestrel взаимодействует с Интернетом напрямую, без обратного прокси-сервера

  • С обратным прокси-сервером, таким как службы IIS, Nginx или Apache. Обратный прокси-сервер получает HTTP-запросы из Интернета и пересылает их на Kestrel.

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

Поддерживается любая из этих конфигураций размещения (с обратным прокси-сервером и без него).

Инструкции по настройке Kestrel и информацию о том, когда следует использовать Kestrel в конфигурации обратного прокси, см. в статье Реализация веб-сервера Kestrel в ASP.NET Core.

В состав ASP.NET Core входит следующее:

При использовании IIS или IIS Express приложение запускается в процессе, отдельном от рабочего процесса IIS (внепроцессный) с Kestrel сервера.

Так как приложения ASP.NET Core выполняются в процессе, отделенном от рабочего процесса IIS, этот модуль обрабатывает управление процессами. Модуль запускает процесс для приложения ASP.NET Core при поступлении первого запроса и перезапускает приложение при сбое или завершении работы. Это, по сути, совпадает с поведением приложений, выполняемых внутрипроцессно и управляемых службой активации процессов Windows (WAS).

На следующей схеме показана связь между IIS, модулем ASP.NET Core и приложением, размещенным вне процесса.

Модуль ASP.NET Core

Запросы поступают из Интернета в драйвер HTTP.sys в режиме ядра. Драйвер направляет запросы к службам IIS на настроенный порт веб-сайта — обычно 80 (HTTP) или 443 (HTTPS). Модуль перенаправляет запросы в Kestrel на случайный порт для приложения, который не является портом 80 или 443.

Модуль задает порт с помощью переменной среды во время запуска, а ПО промежуточного слоя для интеграции IIS настраивает сервер для прослушивания http://localhost:{port}. Выполняются дополнительные проверки, и запросы не из модуля отклоняются. Модуль не поддерживает переадресацию по HTTPS, поэтому запросы переадресовываются по протоколу HTTP, даже если были получены IIS по протоколу HTTPS.

После того, как Kestrel получает запрос от модуля, запрос передается в конвейер промежуточного программного обеспечения ASP.NET Core. Конвейер ПО промежуточного слоя обрабатывает запрос и передает его в качестве экземпляра HttpContext в логику приложения. ПО промежуточного слоя, добавленное посредством интеграции IIS, обновляет схему, удаленный IP-адрес и базу путей с учетом пересылки запроса на Kestrel. Отклик приложения передается обратно в службу IIS, которая отправляет его обратно в HTTP-клиент, инициировавший запрос.

Инструкции по настройке модуля ASP.NET Core и IIS см. в следующих статьях:

Nginx с Kestrel

Сведения о том, как использовать Nginx в Linux в качестве обратного прокси-сервера для Kestrel, см. в статье Размещение ASP.NET Core в Linux с использованием Nginx.

Apache с Kestrel

Сведения о том, как использовать Apache в Linux в качестве обратного прокси-сервера для Kestrel, см. в статье Размещение ASP.NET Core в Linux с использованием Apache.

HTTP.sys

Если приложения ASP.NET Core запускаются в Windows, HTTP.sys является альтернативой Kestrel. Kestrel рекомендуется для HTTP.sys, если приложению не требуются функции, недоступные в Kestrel. Дополнительные сведения см. в статье Реализация веб-сервера HTTP.sys в ASP.NET Core.

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

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

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

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

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

IApplicationBuilder, доступный в методе Startup.Configure, предоставляет свойство ServerFeatures типа IFeatureCollection. Kestrel и HTTP.sys предоставляют только одну функцию каждый, IServerAddressesFeature, однако разные реализации сервера могут предоставлять дополнительные функции.

IServerAddressesFeature можно использовать для того, чтобы узнать, какой порт в реализации сервера привязан к среде выполнения.

Пользовательские серверы

Если встроенные серверы не отвечают требованиям приложения, можно создать реализацию пользовательского сервера. В руководстве по открытому веб-интерфейсу .NET (OWIN) демонстрируется запись реализации IServer на основе Nowin. Требуют реализации только интерфейсы компонентов, используемых приложением, но как минимум должны поддерживаться IHttpRequestFeature и IHttpResponseFeature.

Запуск сервера

Сервер запускается, когда интегрированная среда разработки (IDE) или редактор запускает приложение:

При запуске приложения из командной строки в папке проекта dotnet run запускает приложение и сервер (только Kestrel и HTTP.sys). Конфигурация определяется параметром -c|--configuration, который может принимать значение Debug (по умолчанию) или Release.

Файл launchSettings.json предоставляет конфигурацию при запуске приложения с помощью dotnet run или с помощью отладчика, встроенного в инструментарий, например Visual Studio. Если профили запуска указаны в файле launchSettings.json, используйте параметр --launch-profile {PROFILE NAME} с командой dotnet run или выберите профиль в Visual Studio. Дополнительные сведения см. в статьях dotnet run и Упаковка дистрибутивов .NET Core.

Поддержка HTTP/2

HTTP/2 поддерживается в ASP.NET Core для следующих сценариев развертывания:

  • Kestrel
    • Операционная система
      • Windows Server 2016 / Windows 10 или более поздних версий†
      • Linux с OpenSSL 1.0.2 или более поздней версии (например, Ubuntu 16.04 или более поздней версии).
      • HTTP/2 будет поддерживаться для macOS в будущих выпусках.
    • Требуемая версия .NET Framework: .NET Core версии 2.2 или более поздней
  • HTTP.sys
    • Windows Server 2016 / Windows 10 или более поздних версий
    • Целевая платформа: неприменимо к развертываниям HTTP.sys.
  • IIS (внутрипроцессный)
    • Windows Server 2016 / Windows 10 или более поздних версий; IIS 10 или более поздней версии
    • Требуемая версия .NET Framework: .NET Core версии 2.2 или более поздней
  • IIS (внепроцессный)
    • Windows Server 2016 / Windows 10 или более поздних версий; IIS 10 или более поздней версии
    • Общедоступные подключения пограничного сервера используют HTTP/2, однако обратное прокси-соединение с Kestrel использует HTTP/1.1.
    • Целевая платформа: неприменимо к внепроцессным развертываниям IIS.

†Kestrel имеет ограниченную поддержку HTTP/2 в Windows Server 2012 R2 и Windows 8.1. Поддержка ограничена из-за небольшого числа поддерживаемых комплектов шифров TLS, доступных для этих операционных систем. Для обеспечения безопасности TLS-подключений может потребоваться сертификат, созданный с использованием алгоритма ECDSA.

  • Kestrel
    • Операционная система
      • Windows Server 2016 / Windows 10 или более поздних версий†
      • Linux с OpenSSL 1.0.2 или более поздней версии (например, Ubuntu 16.04 или более поздней версии).
      • HTTP/2 будет поддерживаться для macOS в будущих выпусках.
    • Требуемая версия .NET Framework: .NET Core версии 2.2 или более поздней
  • HTTP.sys
    • Windows Server 2016 / Windows 10 или более поздних версий
    • Целевая платформа: неприменимо к развертываниям HTTP.sys.
  • IIS (внутрипроцессный)
    • Windows Server 2016 / Windows 10 или более поздних версий; IIS 10 или более поздней версии
    • Требуемая версия .NET Framework: .NET Core версии 2.2 или более поздней
  • IIS (внепроцессный)
    • Windows Server 2016 / Windows 10 или более поздних версий; IIS 10 или более поздней версии
    • Общедоступные подключения пограничного сервера используют HTTP/2, однако обратное прокси-соединение с Kestrel использует HTTP/1.1.
    • Целевая платформа: неприменимо к внепроцессным развертываниям IIS.

†Kestrel имеет ограниченную поддержку HTTP/2 в Windows Server 2012 R2 и Windows 8.1. Поддержка ограничена из-за небольшого числа поддерживаемых комплектов шифров TLS, доступных для этих операционных систем. Для обеспечения безопасности TLS-подключений может потребоваться сертификат, созданный с использованием алгоритма ECDSA.

  • HTTP.sys
    • Windows Server 2016 / Windows 10 или более поздних версий
    • Целевая платформа: неприменимо к развертываниям HTTP.sys.
  • IIS (внепроцессный)
    • Windows Server 2016 / Windows 10 или более поздних версий; IIS 10 или более поздней версии
    • Общедоступные подключения пограничного сервера используют HTTP/2, однако обратное прокси-соединение с Kestrel использует HTTP/1.1.
    • Целевая платформа: неприменимо к внепроцессным развертываниям IIS.

Подключение HTTP/2 должно использовать согласование протокола уровня приложений (ALPN) и TLS 1.2 или более поздней версии. Дополнительные сведения см. в разделах, о конкретных сценариях развертывания сервера.

Дополнительные ресурсы