¿Qué es Kestrel (vs IIS / Express)

158

¿Qué es el servidor web kestrel y cómo se relaciona con IIS / IIS Express?

Vengo de desarrollar aplicaciones en IIS Express y alojarlas en un servidor web IIS. Con ASP.NET Core tengo una dependencia Microsoft.AspNetCore.Server.Kestrely mi inicio tiene .UseServer("Microsoft.AspNetCore.Server.Kestrel"). Pero cuando ejecuto mi sitio web, sigo recibiendo el ícono IIS Express en la bandeja del sistema. ¡Alguien me preguntó si estaba usando IIS Express o Kestrel y no sabía qué decir!

No tengo ningún requisito multiplataforma a medida que desarrollo en una PC y host en Azure, por lo que estoy confundido si incluso needKestrel, pero no parece que haya una alternativa, incluso las muestras más simples usan Kestrel.

Sean
fuente
Cuando tenga una pregunta sobre esta nueva tecnología, comience en la página de GitHub para los proyectos en cuestión y mire sus Wikis. Te encontrarás con esta página wiki de servidores para el repositorio ASP.NET.
albañil
11
Por supuesto, entonces te encuentras con cosas como This document is now out of date. For up-to-date ASP.NET Core documentation go to: http://docs.asp.net. Ups

Respuestas:

115

¿Qué es el cernícalo?

Es un servidor web completo. Puede ejecutar su aplicación ASP.NET Core usando solo Kestrel.

Pero cuando ejecuto mi sitio web, sigo recibiendo el ícono IIS Express en la bandeja del sistema

En su aplicación ASP.NET, probablemente en el wwwrootdirectorio, verá un web.config que contiene esto:

<?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 es el HttpPlatformHandler. Esencialmente, lo que esto hace es reenviar todas las solicitudes a Kestrel. IIS Express (e IIS para el caso) ya no ejecutarán ASP.NET. En cambio, actuarán como representantes que simplemente pasan solicitudes y respuestas de Kestrel de un lado a otro. Todavía hay ventajas de usar IIS, específicamente le brinda configuración de seguridad, almacenamiento en caché a nivel de kernel, etc.

vcsjones
fuente
55
excelente introducción a lo que sucede exactamente debajo de las cubiertas cuando se usa ASP.Net core youtu.be/e2qZvabmSvo
user99513
44
Esta respuesta está un poco desactualizada debido a la introducción de ASP.NET Core Module (en lugar de HttpPlatformHandler). Ofrecí una respuesta alternativa con más historias y productos relacionados también.
Lex Li
173

Me gustaría ofrecer una respuesta alternativa, con algo de historia, para que pueda entender por qué viene Kestrel, incluso si solo usa Windows e IIS.

Al comienzo del desarrollo de ASP.NET antes del año 2000, claramente Microsoft creó dos piezas para alojar aplicaciones ASP.NET WebForms,

  • Cassini, más tarde se convirtió en ASP.NET Development Server en Visual Studio. Es un servidor web totalmente administrado escrito en C # basado en HttpListener. Por supuesto, dado que era solo para desarrollo, muchas características nunca se implementaron. A medida que Microsoft puso a disposición del público el código fuente de Cassini, hay terceros que bifurcaron la base del código y agregaron más funciones, lo que inició la familia Cassini.
  • Soporte de ASP.NET en IIS (revisión 1). Debido a que IIS era 4.0 y 5.0 / 5.1 en ese momento, que no tiene nada que ver con los grupos de aplicaciones, ASP.NET incluso tiene su propio proceso de trabajo ( aspnet_wp.exe).

Entonces, para desarrollar una aplicación web, usa Cassini y para implementar usa IIS.

  • La introducción de grupos de aplicaciones en IIS 6 requirió algunos cambios en el lado de ASP.NET, por lo que se aspnet_wp.exevolvió obsoleto y reemplazado por aspnet_isapi.dll. Eso puede verse como soporte de ASP.NET en la revisión 2 de IIS. Por lo tanto, las aplicaciones ASP.NET se alojan en procesos de trabajo de IIS w3wp.exe.

  • La introducción de la tubería integrada en IIS 7 y superior requirió más cambios, que se reemplazaron aspnet_isapi.dllpor webengine4.dll. Eso puede verse como soporte de ASP.NET en la revisión IIS 3. Las tuberías de ASP.NET e IIS están unificadas.

Puede ver que ASP.NET se ha vuelto mucho más complejo y está estrechamente integrado con IIS, por lo que Cassini comenzó a mostrar su edad y gradualmente fue reemplazado por IIS Express (un modo de usuario lite IIS).

Por lo tanto, en muchos casos, cuando las personas culpan que IIS es lento, deberían culpar a ASP.NET de hecho. IIS en sí sin ASP.NET es bastante rápido y estable, mientras que ASP.NET no se desarrolló con suficientes métricas de rendimiento en mente (ya que WebForms enfoca muchas productividades y RAD).

Luego, en noviembre de 2014, se anunció ASP.NET 5 (luego renombrado a ASP.NET Core) y se convirtió en una tecnología multiplataforma. Obviamente, Microsoft necesitaba un nuevo diseño para admitir Windows, macOS y Linux, donde todos los principales servidores web, nginx / Apache (u otros servidores web) deberían considerarse además de IIS.

Creo que muchos estarían de acuerdo en que Microsoft aprendió mucho de NodeJS, y luego diseñó y desarrolló Kestrel (basado libuvinicialmente, pero podría pasar a otra tecnología pronto). Es un servidor web liviano como Cassini inicialmente, pero luego se agregan más funciones (como comentó otra respuesta, muchas más funciones, por lo que se pueden tratar como un servidor web completo). Aunque completamente administrado (existen algunas dependencias nativas), ya no es un servidor web de juguete como Cassini.

Entonces, ¿por qué no puedes usar Kestrel? ¿Por qué aún se necesitan IIS Express y potencialmente IIS, nginx o Apache? Eso es principalmente el resultado de la práctica actual de internet. La mayoría de los sitios web utilizan proxys inversos para recibir solicitudes de sus navegadores web y luego reenviarlos a los servidores de aplicaciones en segundo plano.

  • IIS Express / IIS / nginx / Apache son los servidores proxy inversos
  • Kestrel / NodeJS / Tomcat y demás son los servidores de aplicaciones

Otra respuesta ya mostró un enlace a la documentación de Microsoft, por lo que puede echar un vistazo.

Microsoft desarrolló HttpPlatformHandler inicialmente para hacer de IIS un proxy inverso lo suficientemente bueno para Java / Python, etc., así que planeó usarlo para ASP.NET Core. Los problemas comenzaron a aparecer durante el desarrollo, por lo que más tarde Microsoft creó el Módulo ASP.NET Core específicamente para ASP.NET Core. Ese es el soporte de ASP.NET en la revisión 4 de IIS.

A partir de ASP.NET Core 2.2, el Módulo ASP.NET Core para IIS (versión 2) puede alojar el entorno .NET Core dentro del proceso de trabajo de IIS ( w3wp.exe), bastante similar a ASP.NET 2.x / 4.x. Este modo se llama "IIS en proceso de alojamiento" . Se puede considerar como soporte ASP.NET en la revisión 5 de IIS.

Bueno, bastante largo, pero espero juntar todas las piezas necesarias y disfruten de leerlo.

Lex Li
fuente
1
Buena respuesta. Pero no puede simplemente decir que usar el cernícalo con IIS es "el resultado de la práctica actual de Internet". Hay muchas razones para usar un proxy inverso. Hubiera sido bueno mencionar algunos aquí.
Nilay Vishwakarma
13
"Hay muchas razones para usar un proxy inverso" pertenece a su propia pregunta y respuesta. Por lo general, las personas pueden encontrar buenos recursos preguntando a Google, por lo que no agregué eso a esta respuesta que ya es lo suficientemente larga.
Lex Li
12

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

Kestrel es un servidor web multiplataforma para ASP.NET Core basado en libuv, una biblioteca de E / S asíncrona multiplataforma. Kestrel es el servidor web que se incluye por defecto en las plantillas de proyecto ASP.NET Core.

Puede usar Kestrel solo o con un servidor proxy inverso, como IIS, Nginx o Apache. Un servidor proxy inverso recibe solicitudes HTTP de Internet y las reenvía a Kestrel después de un tratamiento preliminar.


ACTUALIZACIÓN: .net core 2.1, Kestrel utiliza sockets administrados en su lugar si libuv

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

Con el lanzamiento de ASP.NET Core 2.1, el transporte predeterminado de Kestrel ya no se basa en Libuv, sino en sockets administrados.

Max
fuente