Co to jest Kestrel (w porównaniu z usługami IIS / Express)

158

Co to jest serwer WWW Kestrel i jaki ma związek z usługami IIS / IIS Express?

Pochodzę z tworzenia aplikacji w IIS Express i hostowania ich na serwerze internetowym IIS. W przypadku ASP.NET Core mam zależność od Microsoft.AspNetCore.Server.Kestreli mój startup ma .UseServer("Microsoft.AspNetCore.Server.Kestrel"). Ale kiedy uruchamiam moją witrynę internetową, nadal widzę ikonę IIS Express na pasku zadań. Ktoś zapytał mnie, czy używam IIS Express czy Kestrel i nie wiedziałem, co powiedzieć!

Nie mam żadnych wymagań dotyczących wielu platform, ponieważ programuję na komputerze PC i hostuję na platformie Azure, więc jestem zdezorientowany, jeśli nawet needKestrel, ale nie wydaje się, że istnieje alternatywa - nawet najprostsze próbki używają Kestrel.

Sean
źródło
Jeśli masz pytanie dotyczące tej nowej technologii, zacznij od strony GitHub dla odpowiednich projektów i przejrzyj ich Wiki. Możesz przejść przez tę stronę wiki serwerów dla repozytorium ASP.NET.
mason
11
Oczywiście, wtedy natkniesz się na takie rzeczy This document is now out of date. For up-to-date ASP.NET Core documentation go to: http://docs.asp.net. Ups.

Odpowiedzi:

115

Co to jest Kestrel

To w pełni rozwinięty serwer WWW. Możesz uruchomić aplikację ASP.NET Core przy użyciu samego Kestrel.

Ale kiedy uruchamiam moją witrynę internetową, nadal widzę ikonę IIS Express na pasku zadań

W aplikacji ASP.NET, prawdopodobnie w wwwrootkatalogu, zobaczysz plik web.config, który zawiera to:

<?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>

To jest HttpPlatformHandler. Zasadniczo to, co to robi, to przekazywanie wszystkich żądań do Kestrel. IIS Express (i IIS w tym przypadku) nie będą już same uruchamiać ASP.NET. Zamiast tego będą działać jako proxy, które po prostu przekazują żądania i odpowiedzi od Kestrel. Nadal istnieją zalety korzystania z usług IIS, w szczególności zapewnia konfigurację zabezpieczeń, buforowanie na poziomie jądra itp.

vcsjones
źródło
5
doskonały wstęp do tego, co dokładnie dzieje się pod kołdrą przy użyciu ASP.Net rdzenia youtu.be/e2qZvabmSvo
user99513
4
Ta odpowiedź jest nieco nieaktualna ze względu na wprowadzenie modułu ASP.NET Core (zamiast HttpPlatformHandler). Zaproponowałem alternatywną odpowiedź, zawierającą więcej historii i powiązanych produktów.
Lex Li
171

Chciałbym zaoferować alternatywną odpowiedź, z pewną historią, abyś mógł zrozumieć, dlaczego pojawia się Kestrel, nawet jeśli używasz tylko systemu Windows i IIS.

Na samym początku rozwoju ASP.NET przed 2000 rokiem Microsoft najwyraźniej stworzył dwie części do hostowania aplikacji ASP.NET WebForms,

  • Cassini, później stał się serwerem programistycznym ASP.NET w programie Visual Studio. Jest to w pełni zarządzany serwer WWW napisany w C # w oparciu o HttpListener. Oczywiście, ponieważ był przeznaczony tylko do programowania, wiele funkcji nigdy nie zostało zaimplementowanych. Gdy Microsoft udostępnił publicznie kod źródłowy Cassini, istnieją strony trzecie, które rozwidliły bazę kodu i dodały więcej funkcji, co zapoczątkowało rodzinę Cassini.
  • Obsługa ASP.NET w IIS (wersja 1). Ponieważ IIS był w tamtym czasie 4.0 i 5.0 / 5.1, który nie ma nic podobnego do pul aplikacji, ASP.NET ma nawet własny proces roboczy ( aspnet_wp.exe).

Tak więc do tworzenia aplikacji sieci Web używasz Cassini, a do wdrażania korzystasz z IIS.

  • Wprowadzenie pul aplikacji w usługach IIS 6 wymagało pewnych zmian po stronie ASP.NET, dlatego aspnet_wp.exestało się przestarzałe i zastąpione przez aspnet_isapi.dll. Można to postrzegać jako obsługę ASP.NET w wersji IIS IIS. Dlatego aplikacje ASP.NET są hostowane w procesach roboczych usług IIS w3wp.exe.

  • Wprowadzenie zintegrowanego rurociągu IIS 7 i powyżej wymagane dalsze zmiany, które otrzymuje aspnet_isapi.dllsię z webengine4.dll. Można to postrzegać jako obsługę ASP.NET w wersji 3 usług IIS. Potoki ASP.NET i IIS są ujednolicone.

Widać, że ASP.NET stał się znacznie bardziej złożony i ściśle zintegrowany z IIS, więc Cassini zaczął pokazywać swój wiek i stopniowo został zastąpiony przez IIS Express (lite IIS w trybie użytkownika).

Dlatego w wielu przypadkach, gdy ludzie obwiniają, że usługi IIS działają wolno, w rzeczywistości powinni winić ASP.NET. Same IIS bez ASP.NET są dość szybkie i stabilne, podczas gdy ASP.NET nie został opracowany z myślą o wystarczających wskaźnikach wydajności (ponieważ WebForms skupia się na dużej produktywności i RAD).

Następnie w listopadzie 2014 r. Ogłoszono ASP.NET 5 (później zmieniono nazwę na ASP.NET Core) i stał się technologią wieloplatformową. Oczywiście Microsoft potrzebował nowego projektu do obsługi systemów Windows, macOS i Linux, gdzie oprócz IIS należy wziąć pod uwagę wszystkie główne serwery internetowe, nginx / Apache (lub inne serwery internetowe).

Myślę, że wielu zgodziłoby się, że Microsoft wiele się nauczył od NodeJS, a następnie zaprojektował i opracował Kestrel (w oparciu o libuvpoczątkowo, ale wkrótce może przejść na inną technologię). Jest to początkowo lekki serwer sieciowy, taki jak Cassini, ale później dodaje się więcej funkcji (jak inna skomentowana odpowiedź, znacznie więcej funkcji, więc można go traktować jako pełny serwer sieciowy). Chociaż jest w pełni zarządzany (istnieją pewne natywne zależności), nie jest już zabawkowym serwerem WWW, takim jak Cassini.

Więc dlaczego nie możesz po prostu użyć Kestrel? Dlaczego IIS Express i potencjalnie IIS, nginx lub Apache są nadal potrzebne? Wynika to przede wszystkim z dzisiejszej praktyki internetowej. Większość witryn internetowych korzysta z odwrotnych serwerów proxy, aby przyjmować żądania z przeglądarek internetowych, a następnie przekazywać je do serwerów aplikacji w tle.

  • IIS Express / IIS / nginx / Apache to odwrotne serwery proxy
  • Kestrel / NodeJS / Tomcat i tak dalej to serwery aplikacji

Inna odpowiedź zawierała już link do dokumentacji Microsoft, więc możesz rzucić okiem.

Firma Microsoft opracowała HttpPlatformHandler początkowo, aby usługi IIS były wystarczająco dobrym zwrotnym serwerem proxy dla języka Java / Python i tak dalej, więc zaplanowano użycie go dla ASP.NET Core. Podczas opracowywania zaczęły pojawiać się problemy, więc później firma Microsoft stworzyła moduł ASP.NET Core specjalnie dla ASP.NET Core. To jest obsługa ASP.NET w wersji 4 usług IIS.

Począwszy od ASP.NET Core 2.2, moduł ASP.NET Core dla usług IIS (wersja 2) może hostować środowisko .NET Core wewnątrz procesu roboczego usług IIS ( w3wp.exe), podobnie jak w przypadku ASP.NET 2.x / 4.x. Ten tryb jest nazywany „hostowaniem w procesie usług IIS” . Można to uznać za obsługę ASP.NET w wersji 5 usług IIS.

Cóż, dość długi, ale mam nadzieję, że poskładam wszystkie niezbędne elementy i sprawi ci przyjemność lektura.

Lex Li
źródło
1
Niezła odpowiedź. Nie można jednak po prostu powiedzieć, że używanie pustułki z usługami IIS jest „wynikiem dzisiejszej praktyki internetowej”. Istnieje wiele powodów, dla których warto używać odwrotnego proxy. Byłoby dobrze wymienić kilka tutaj.
Nilay Vishwakarma
13
„Istnieje wiele powodów, dla których warto używać odwrotnego proxy” należy do jego własnego pytania i odpowiedzi. Zwykle ludzie mogą znaleźć dobre zasoby, pytając Google, więc nie dodałem tego do tej już wystarczająco długiej odpowiedzi.
Lex Li
12

Z ms docs pod adresem : https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?tabs=aspnetcore2x

Kestrel to wieloplatformowy serwer sieci Web dla ASP.NET Core oparty na libuv, wieloplatformowej asynchronicznej bibliotece we / wy. Kestrel to serwer sieci Web, który jest domyślnie uwzględniony w szablonach projektów ASP.NET Core.

Możesz użyć Kestrel samodzielnie lub z odwrotnym serwerem proxy, takim jak IIS, Nginx lub Apache. Zwrotny serwer proxy odbiera żądania HTTP z Internetu i przekazuje je do Kestrel po wstępnej obróbce.


UPDATE: .net core 2.1, Kestrel używa zarządzanych gniazd zamiast libuv

Z dokumentacji asp.net core 2.1 pod adresem : https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-2.1#transport-configuration

Wraz z wydaniem ASP.NET Core 2,1 domyślny transport Kestrel nie jest już oparty na Libuv, ale zamiast tego oparty na zarządzanych gniazdach.

Maks
źródło