Что такое пустельга (против IIS / Express)

159

Что такое веб-сервер kestrel и как он связан с IIS / IIS Express?

Я пришел от разработки приложений на IIS Express и размещения их на веб-сервере IIS. С ASP.NET Core у меня есть зависимость, Microsoft.AspNetCore.Server.Kestrelи мой запуск имеет .UseServer("Microsoft.AspNetCore.Server.Kestrel"). Но когда я запускаю свой веб-сайт, я все еще получаю значок IIS Express на панели задач. Кто-то спросил меня, использую ли я IIS Express или Kestrel, и я не знал, что сказать!

У меня нет кроссплатформенных требований, так как я разрабатываю на ПК и размещаю в Azure, поэтому я запутался, даже если бы я даже использовал needKestrel, но, похоже, нет альтернативы - даже самые простые примеры используют Kestrel.

Шон
источник
Если у вас есть вопрос об этой новой технологии, начните со страницы GitHub для рассматриваемых проектов и посмотрите их вики. Вы наткнулись на эту вики-страницу серверов для репозитория ASP.NET.
масон
11
Конечно, тогда вы столкнетесь с чем-то вроде This document is now out of date. For up-to-date ASP.NET Core documentation go to: http://docs.asp.net. К сожалению.

Ответы:

115

Что такое пустельга

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

Но когда я запускаю свой веб-сайт, я все еще получаю значок IIS Express в системном трее

В вашем приложении ASP.NET, вероятно, в wwwrootкаталоге, вы увидите web.config, который содержит это:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
    <handlers>
    <add name="httpPlatformHandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified"/>
    </handlers>
    <httpPlatform processPath="%DNX_PATH%" arguments="%DNX_ARGS%" stdoutLogEnabled="false" startupTimeLimit="3600"/>
</system.webServer>
</configuration>

Это HttpPlatformHandler. По сути, это направляет все запросы Кестрелу. IIS Express (и IIS в этом отношении) больше не будет запускать ASP.NET. Вместо этого они будут действовать как прокси, которые просто передают запросы и ответы от Kestrel. Все еще есть преимущества использования IIS, в частности, он обеспечивает настройку безопасности, кэширование на уровне ядра и т. Д.

vcsjones
источник
5
отличное введение в то, что именно происходит под прикрытием при использовании ядра ASP.Net youtu.be/e2qZvabmSvo
user99513
4
Этот ответ несколько устарел из-за введения основного модуля ASP.NET (вместо HttpPlatformHandler). Я предложил альтернативный ответ с большим количеством историй и сопутствующих товаров.
Лекс Ли
175

Я хотел бы предложить альтернативный ответ с некоторой историей, чтобы вы могли понять, почему появился Kestrel, даже если вы используете только Windows и IIS.

В самом начале разработки ASP.NET до 2000 года, очевидно, Microsoft создала две части для размещения приложений ASP.NET WebForms,

  • Кассини, позже стал Сервер разработки ASP.NET в Visual Studio. Это полностью управляемый веб-сервер, написанный на C # на основе HttpListener. Конечно, поскольку это было только для разработки, многие функции никогда не были реализованы. Поскольку Microsoft сделала общедоступный исходный код Cassini доступным, появились сторонние разработчики, которые раздвоили базу кода и добавили дополнительные функции, что положило начало семейству Cassini.
  • Поддержка ASP.NET в IIS (ревизия 1). Поскольку IIS был 4.0 и 5.0 / 5.1 в то время, который не имеет ничего общего с пулами приложений, ASP.NET даже имеет свой собственный рабочий процесс ( aspnet_wp.exe).

Поэтому для разработки веб-приложения вы используете Cassini, а для развертывания - IIS.

  • Введение пулов приложений в IIS 6 потребовало некоторых изменений на стороне ASP.NET, поэтому оно aspnet_wp.exeустарело и заменено на aspnet_isapi.dll. Это можно рассматривать как поддержку ASP.NET в IIS версии 2. Поэтому приложения ASP.NET размещаются в рабочих процессах IIS w3wp.exe.

  • Внедрение интегрированного конвейера в IIS 7 и выше потребовало дальнейших изменений, которые заменили aspnet_isapi.dllна webengine4.dll. Это можно рассматривать как поддержку ASP.NET в IIS версии 3. Конвейеры ASP.NET и IIS объединены.

Вы можете видеть, что ASP.NET стал намного более сложным и тесно интегрированным с IIS, поэтому Cassini начал показывать свой возраст и постепенно был заменен IIS Express (пользовательский режим облегченного IIS).

Таким образом, во многих случаях, когда люди обвиняют IIS в медленной работе, они должны обвинять ASP.NET в действительности. Сам IIS без ASP.NET довольно быстрый и стабильный, в то время как ASP.NET не разрабатывался с учетом достаточных показателей производительности (так как WebForms фокусирует довольно много производительности и RAD).

Затем в ноябре 2014 года было объявлено, что ASP.NET 5 (позже переименованный в ASP.NET Core) стал кроссплатформенной технологией. Очевидно, что Microsoft нужен был новый дизайн для поддержки Windows, macOS и Linux, где следует рассмотреть все основные веб-серверы, nginx / Apache (или другие веб-серверы), кроме IIS.

Думаю, многие согласятся с тем, что Microsoft многому научилась у NodeJS, а затем спроектировала и разработала Kestrel (на основе libuvизначально, но вскоре может перейти на другие технологии). Первоначально это был легкий веб-сервер, такой как Cassini, но позже добавляются дополнительные функции (как в другом ответе, гораздо больше функций можно рассматривать как полноценный веб-сервер). Несмотря на то, что он полностью управляем (существуют некоторые нативные зависимости), он больше не является игрушечным веб-сервером, таким как Cassini.

Тогда почему вы не можете просто использовать Kestrel? Почему IIS Express и потенциально IIS, nginx или Apache все еще нужны? Это в первую очередь результат сегодняшней интернет-практики. Большинство веб-сайтов используют обратные прокси-серверы для получения запросов от ваших веб-браузеров, а затем перенаправляют их на серверы приложений в фоновом режиме.

  • IIS Express / IIS / nginx / Apache - это обратные прокси-серверы
  • Kestrel / NodeJS / Tomcat и т. Д. Являются серверами приложений

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

Microsoft изначально разработала HttpPlatformHandler, чтобы сделать IIS достаточно хорошим обратным прокси-сервером для Java / Python и т. Д., Поэтому планировала использовать его для ASP.NET Core. Проблемы начали появляться во время разработки, поэтому позже Microsoft сделала модуль ASP.NET Core специально для ASP.NET Core. Это поддержка ASP.NET в IIS версии 4.

Начиная с ASP.NET Core 2.2, ASP.NET Core Module для IIS (версия 2) может размещать среду .NET Core внутри рабочего процесса IIS ( w3wp.exe), очень похожую на ASP.NET 2.x / 4.x. Этот режим называется «IIS in-process hosting» . Это можно рассматривать как поддержку ASP.NET в IIS версии 5.

Ну, довольно долго, но я надеюсь, что соберу все необходимые кусочки, и вам понравится читать.

Лекс Ли
источник
1
Хороший ответ. Но вы не можете просто сказать, что использование kestrel с IIS является «результатом сегодняшней интернет-практики». Есть много причин использования обратного прокси. Было бы хорошо упомянуть несколько здесь.
Нилай Вишвакарма
13
«Есть много оснований для использования обратного прокси-сервера» принадлежит его собственный вопрос и ответ. Обычно люди могут найти хорошие ресурсы, спрашивая Google, поэтому я не добавлял это к этому уже достаточно длинному ответу.
Лекс Ли
12

Из документации MS: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?tabs=aspnetcore2x

Kestrel - это кроссплатформенный веб-сервер для ASP.NET Core, основанный на libuv, кроссплатформенной библиотеке асинхронного ввода-вывода. Kestrel - это веб-сервер, который по умолчанию включен в шаблоны проектов ASP.NET Core.

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


ОБНОВЛЕНИЕ: .net core 2.1, Kestrel использует вместо этого управляемые сокеты, если libuv

Из документации asp.net core 2.1 по адресу: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-2.1#transport-configuration

С выпуском ASP.NET Core 2.1 транспорт по умолчанию Kestrel больше не основан на Libuv, а на управляемых сокетах.

Максимум
источник