web-dev-qa-db-fra.com

Qu'est-ce que Kestrel (vs IIS / Express)

Qu'est-ce que le serveur Web Kestrel et quel est son rapport avec IIS/IIS Express?

Je viens de développer des applications sur IIS Express et de les héberger sur un serveur Web IIS. Avec ASP.NET Core, j'ai une dépendance sur Microsoft.AspNetCore.Server.Kestrel Et mon démarrage a .UseServer("Microsoft.AspNetCore.Server.Kestrel"). Mais lorsque je lance mon site Web, l'icône IIS Express apparaît toujours dans la barre d'état système. Quelqu'un m'a demandé si j'utilisais IIS Express ou Kestrel et je ne savais pas quoi dire!

Je n'ai pas d'exigences multi-plateformes car je développe sur un PC et un hôte Azure. Je suis donc confus si je même need Kestrel, mais il ne semble pas qu'il y ait d'alternative - même le Les échantillons les plus simples utilisent Kestrel.

122
Sean

Qu'est-ce que Kestrel?

C'est un serveur web complet. Vous pouvez exécuter votre application ASP.NET Core uniquement avec Kestrel.

Mais lorsque je lance mon site Web, l’icône IIS Express de la barre des tâches système) reste affichée.

Dans votre application ASP.NET, probablement dans le répertoire wwwroot, vous verrez un fichier web.config contenant:

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

C'est le HttpPlatformHandler. Essentiellement, ce que cela fait est de transmettre tous demandes à Kestrel. IIS Express (et IIS d'ailleurs)) ne lancera plus ASP.NET eux-mêmes. Ils agiront plutôt comme des mandataires qui renverront simplement les demandes et les réponses. Kestrel présente encore des avantages, notamment la configuration de la sécurité, la mise en cache au niveau du noyau, etc.

96
vcsjones

J'aimerais proposer une réponse alternative, avec un peu d'histoire, afin que vous puissiez comprendre pourquoi Kestrel est fourni, même si vous utilisez uniquement Windows et IIS.

Au tout début du développement ASP.NET avant l’an 2000, Microsoft avait clairement créé deux éléments pour héberger les applications ASP.NET WebForms,

  • Cassini, devenu plus tard ASP.NET Development Server dans Visual Studio. C'est un serveur Web entièrement géré écrit en C # basé sur HttpListener. Bien sûr, puisqu'il s'agissait uniquement de développement, de nombreuses fonctionnalités n'ont jamais été implémentées. Lorsque Microsoft a rendu le code source de Cassini accessible au public, des tiers ont créé la base de code et ajouté des fonctionnalités supplémentaires, à la base de la famille Cassini.
  • Support ASP.NET sur IIS (révision 1). Parce que IIS était 4.0 et 5.0/5.1 à ce moment-là, ce qui n’a rien à voir avec les pools d’applications, ASP. NET a même son propre processus de travail (aspnet_wp.exe).

Donc, pour développer une application Web, vous utilisez Cassini et pour déployer, vous utilisez IIS.

  • L’introduction de pools d’applications dans IIS 6 a nécessité certaines modifications côté ASP.NET, donc aspnet_wp.exe est devenu obsolète et remplacé par aspnet_isapi.dll. Cela peut être vu comme support ASP.NET sur IIS révision 2. Ainsi, les applications ASP.NET sont hébergées dans IIS processus de travail w3wp.exe.

  • L’introduction du pipeline intégré dans IIS 7 et versions ultérieures a nécessité des modifications supplémentaires, qui a remplacé aspnet_isapi.dll avec webengine4.dll. Cela peut être vu comme support ASP.NET sur IIS révision 3. ASP.NET et IIS Les pipelines sont unifiés.

Vous pouvez voir que ASP.NET est devenu beaucoup plus complexe et étroitement intégré à IIS. Cassini a donc commencé à montrer son âge et a été progressivement remplacé par IIS Express (un IIS en mode utilisateur lite).

Ainsi, dans de nombreux cas, lorsque les gens blâment que IIS est lent, ils devraient en vouloir à ASP.NET. IIS lui-même sans ASP.NET est assez rapide et stable, alors qu'ASP.NET n'a pas été développé avec suffisamment de métriques de performance (WebForms concentre beaucoup de productivité et de RAD).

Puis, en novembre 2014, ASP.NET 5 (renommé plus tard ASP.NET Core) a été annoncé et est devenu une technologie multiplateforme. De toute évidence, Microsoft avait besoin d’une nouvelle conception prenant en charge Windows, macOS et Linux, où tous les principaux serveurs Web, nginx/Apache (ou d’autres serveurs Web) devaient être pris en compte en plus d’IIS.

Je pense que beaucoup conviendraient que Microsoft a beaucoup appris de NodeJS, puis a conçu et développé Kestrel (basé sur libuv au début, mais qui pourrait évoluer prochainement vers une autre technologie). Il s’agit au départ d’un serveur Web léger comme Cassini, mais plus tard, d’autres fonctionnalités sont ajoutées (comme dans le cas d’une autre réponse, beaucoup plus de fonctionnalités peuvent être traitées comme un serveur Web complet). Bien que entièrement géré (certaines dépendances natives existent), ce n’est plus un serveur Web jouet comme Cassini.

Alors pourquoi ne pouvez-vous pas simplement utiliser Kestrel? Pourquoi IIS Express et potentiellement IIS, nginx ou Apache sont toujours nécessaires? C’est principalement le résultat de la pratique Internet actuelle. La plupart des sites Web utilisent des proxys inversés pour prendre en compte les demandes de vos navigateurs Web, puis les transférer. aux serveurs d'applications en arrière-plan.

  • IIS Express/IIS/nginx/Apache sont les serveurs proxy inverse
  • Kestrel/NodeJS/Tomcat et ainsi de suite sont les serveurs d'applications

Une autre réponse indiquait déjà un lien vers la documentation de Microsoft afin que vous puissiez y jeter un coup d’œil.

Microsoft a initialement développé HttpPlatformHandler pour faire de IIS un assez bon proxy inverse pour Java/Python, etc.). Nous avions donc prévu de l'utiliser pour ASP.NET Core. Des problèmes ont commencé à apparaître au cours du développement, donc plus tard créé le module ASP.NET Core spécifiquement pour ASP.NET Core, c’est le support ASP.NET sur IIS révision 4.

Depuis ASP.NET Core 2.2, le module ASP.NET Core pour IIS (version 2) peut héberger un environnement .NET Core dans IIS processus de travail (w3wp.exe), assez similaire à ASP.NET 2.x/4.x. Ce mode s'appelle "Hébergement IIS in-process" . Il peut être considéré comme support ASP.NET sur IIS révision 5.

Bien, assez long, mais j'espère avoir rassemblé toutes les pièces nécessaires et que vous prendrez plaisir à le lire.

115
Lex Li

À partir de msd docs à: https://docs.Microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?tabs=aspnetcore2x

Kestrel est un serveur Web multi-plateforme pour ASP.NET Core basé sur libuv, une bibliothèque d'E/S asynchrone multi-plateforme. Kestrel est le serveur Web inclus par défaut dans les modèles de projet ASP.NET Core.

Vous pouvez utiliser Kestrel seul ou avec un serveur proxy inverse, tel que IIS, Nginx ou Apache. Un serveur proxy inverse reçoit les requêtes HTTP d'Internet et les transmet à Kestrel après un traitement préliminaire.


UPDATE: noyau .net 2.1, Kestrel utilise des sockets gérés à la place si libuv

A partir des documents asp.net core 2.1 à l'adresse: https://docs.Microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-2.1#transport-configuration

Avec la sortie d'ASP.NET Core 2.1, le transport par défaut de Kestrel n'est plus basé sur Libuv mais sur des sockets gérés.

7
Max