O que é o Kestrel (vs IIS / Express)

158

O que é o servidor Web Kestrel e como ele se relaciona com o IIS / IIS Express?

Venho desenvolvendo aplicativos no IIS Express e hospedando-os em um servidor Web IIS. Com o ASP.NET Core, tenho uma dependência Microsoft.AspNetCore.Server.Kestrele minha inicialização tem .UseServer("Microsoft.AspNetCore.Server.Kestrel"). Mas quando executo meu site, ainda recebo o ícone do IIS Express na bandeja do sistema. Alguém me perguntou se eu estava usando o IIS Express ou o Kestrel e não sabia o que dizer!

Não tenho requisitos de plataforma cruzada conforme desenvolvo em um PC e host no Azure, por isso estou confuso se eu tiver needKestrel, mas não parece haver uma alternativa - mesmo os exemplos mais simples usam o Kestrel.

Sean
fonte
Quando você tiver alguma dúvida sobre esta nova tecnologia, comece na página do GitHub para os projetos em questão e consulte os respectivos Wikis. Você cruzaria esta página wiki de servidores para o repositório ASP.NET.
pedreiro
11
Claro, então você se depara com coisas assim This document is now out of date. For up-to-date ASP.NET Core documentation go to: http://docs.asp.net. Opa

Respostas:

115

O que é Kestrel

É um servidor web completo. Você pode executar seu aplicativo ASP.NET Core usando apenas o Kestrel.

Mas quando executo meu site, ainda recebo o ícone do IIS Express na bandeja do sistema

No seu aplicativo ASP.NET, provavelmente no wwwrootdiretório, você verá um web.config que contém isso:

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

Este é o HttpPlatformHandler. Essencialmente, o que isso faz é encaminhar todas as solicitações ao Kestrel. O IIS Express (e o IIS) não executará mais o ASP.NET. Em vez disso, eles atuarão como proxies que simplesmente transmitem solicitações e respostas do Kestrel. Ainda há vantagens em usar o IIS, especificamente ele fornece configuração de segurança, armazenamento em cache no nível do kernel, etc.

vcsjones
fonte
5
excelente introdução ao que exatamente está acontecendo nos bastidores
user99513
4
Esta resposta está um pouco desatualizada devido à introdução do ASP.NET Core Module (em vez de HttpPlatformHandler). Ofereci uma resposta alternativa com mais histórias e produtos relacionados.
Lex Li
171

Gostaria de oferecer uma resposta alternativa, com um pouco de histórico, para que você possa entender por que o Kestrel vem, mesmo que você use apenas o Windows e o IIS.

No início do desenvolvimento do ASP.NET antes do ano 2000, a Microsoft claramente criou duas peças para hospedar aplicativos ASP.NET WebForms,

  • Cassini, mais tarde, tornou-se ASP.NET Development Server no Visual Studio. É um servidor web totalmente gerenciado, escrito em C #, com base em HttpListener. Obviamente, como era apenas para desenvolvimento, muitos recursos nunca foram implementados. Como a Microsoft disponibilizou o código-fonte da Cassini para o público, existem terceiros que bifurcaram a base de código e adicionaram mais recursos, que iniciaram a família Cassini.
  • Suporte do ASP.NET no IIS (revisão 1). Como o IIS era 4.0 e 5.0 / 5.1 na época, que não tem nada como pools de aplicativos, o ASP.NET ainda possui seu próprio processo de trabalho ( aspnet_wp.exe).

Portanto, para desenvolver um aplicativo Web, use o Cassini e, para implantar, use o IIS.

  • A introdução de pools de aplicativos no IIS 6 exigiu algumas alterações no lado do ASP.NET, aspnet_wp.exetornando - se obsoleta e substituída por aspnet_isapi.dll. Isso pode ser visto como suporte do ASP.NET na revisão 2. do IIS. Portanto, os aplicativos ASP.NET estão sendo hospedados nos processos de trabalho do IIS w3wp.exe.

  • A introdução do pipeline integrado no IIS 7 e acima exigiu outras alterações, que foram substituídas aspnet_isapi.dllpor webengine4.dll. Isso pode ser visto como suporte do ASP.NET na revisão do IIS 3. Os pipelines do ASP.NET e do IIS são unificados.

Você pode ver que o ASP.NET se tornou muito mais complexo e totalmente integrado ao IIS, então a Cassini começou a mostrar sua idade e foi gradualmente substituída pelo IIS Express (um modo de usuário como o IIS).

Assim, em muitos casos, quando as pessoas culpam que o IIS é lento, elas devem culpar o ASP.NET de fato. O próprio IIS sem o ASP.NET é bastante rápido e estável, enquanto o ASP.NET não foi desenvolvido com métricas de desempenho suficientes em mente (já que o WebForms concentra muitas produtividades e RAD).

Em novembro de 2014, o ASP.NET 5 (mais tarde renomeado para ASP.NET Core) foi anunciado e se tornou uma tecnologia de plataforma cruzada. Obviamente, a Microsoft precisava de um novo design para oferecer suporte ao Windows, macOS e Linux, onde todos os principais servidores da web, nginx / Apache (ou outros servidores da web) deveriam ser considerados além do IIS.

Eu acho que muitos concordariam que a Microsoft aprendeu bastante com o NodeJS e depois projetou e desenvolveu o Kestrel (com base libuvinicialmente, mas pode mudar para outra tecnologia em breve). É um servidor da Web leve como o Cassini inicialmente, mas mais tarde, mais recursos estão sendo adicionados (como outra resposta comentada, muito mais recursos podem ser tratados como um servidor da Web completo). Embora totalmente gerenciado (existem algumas dependências nativas), ele não é mais um servidor de brinquedo como o Cassini.

Então, por que você não pode simplesmente usar o Kestrel? Por que o IIS Express e potencialmente IIS, nginx ou Apache ainda são necessários? Isso é principalmente o resultado da prática atual da Internet. A maioria dos sites usa proxies reversos para receber solicitações de seus navegadores da Web e depois encaminhar para os servidores de aplicativos em segundo plano.

  • O IIS Express / IIS / nginx / Apache são os servidores proxy reversos
  • Kestrel / NodeJS / Tomcat e assim por diante são os servidores de aplicativos

Outra resposta já mostrou um link para a documentação da Microsoft, para que você possa dar uma olhada.

A Microsoft desenvolveu o HttpPlatformHandler inicialmente para tornar o IIS um proxy reverso bom o suficiente para Java / Python e assim por diante, então planejou usá-lo no ASP.NET Core. Os problemas começaram a aparecer durante o desenvolvimento; mais tarde, a Microsoft criou o ASP.NET Core Module especificamente para o ASP.NET Core. Esse é o suporte do ASP.NET na revisão 4 do IIS.

A partir do ASP.NET Core 2.2, o ASP.NET Core Module para IIS (versão 2) pode hospedar o ambiente .NET Core dentro do processo de trabalho do IIS ( w3wp.exe), bastante semelhante ao ASP.NET 2.x / 4.x. Esse modo é chamado "Hospedagem em processo do IIS" . Pode ser considerado como suporte do ASP.NET na revisão 5 do IIS.

Bem, bastante demorado, mas espero reunir todas as peças necessárias e que você goste de ler.

Lex Li
fonte
1
Boa resposta. Mas você não pode simplesmente dizer que o uso do kestrel com o IIS é 'resultado da prática atual da Internet'. Existem muitas razões para usar um proxy reverso. Teria sido bom mencionar alguns aqui.
Nilay Vishwakarma
13
"Existem muitas razões para usar um proxy reverso" pertence à sua própria pergunta e resposta. Normalmente, as pessoas podem encontrar bons recursos perguntando ao Google, então eu não anexei isso a essa resposta já longa o suficiente.
Lex Li
12

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

O Kestrel é um servidor Web de plataforma cruzada para o ASP.NET Core, baseado no libuv, uma biblioteca de E / S assíncrona entre plataformas. Kestrel é o servidor Web incluído por padrão nos modelos de projeto do ASP.NET Core.

Você pode usar o Kestrel sozinho ou com um servidor proxy reverso, como IIS, Nginx ou Apache. Um servidor proxy reverso recebe solicitações HTTP da Internet e as encaminha para o Kestrel após um tratamento preliminar.


ATUALIZAÇÃO: .net core 2.1, o Kestrel usa soquetes gerenciados se o libuv

Dos documentos do asp.net core 2.1 em: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-2.1#transport-configuration

Com o lançamento do ASP.NET Core 2.1, o transporte padrão do Kestrel não é mais baseado no Libuv, mas em soquetes gerenciados.

Máx.
fonte