Kestrel คืออะไร (เทียบกับ IIS / Express)


158

เว็บเซิร์ฟเวอร์ชวาคืออะไรและเกี่ยวข้องกับ IIS / IIS Express อย่างไร

ฉันมาจากการพัฒนาแอพบน IIS Express และโฮสต์ไว้บนเว็บเซิร์ฟเวอร์ IIS ด้วย ASP.NET แกนฉันต้องพึ่งพาและการเริ่มต้นของฉันมีMicrosoft.AspNetCore.Server.Kestrel .UseServer("Microsoft.AspNetCore.Server.Kestrel")แต่เมื่อฉันเรียกใช้เว็บไซต์ของฉันฉันยังได้รับไอคอน IIS Express ในซิสเต็มเทรย์ มีคนถามฉันว่าฉันใช้ IIS Express หรือ Kestrel หรือไม่และฉันไม่รู้ว่าจะพูดอะไร!

ฉันไม่มีความต้องการข้ามแพลตฟอร์มใด ๆ ในขณะที่ฉันพัฒนาบนพีซีและโฮสต์ใน Azure ดังนั้นฉันสับสนถ้าฉันแม้แต่needชวา แต่ก็ดูเหมือนว่าจะไม่มีทางเลือกอื่นแม้แต่ตัวอย่างที่ง่ายที่สุดก็ใช้ Kestrel


เมื่อคุณมีคำถามเกี่ยวกับเทคโนโลยีใหม่นี้ให้เริ่มที่หน้า GitHub สำหรับโครงการที่เป็นปัญหาและดู Wikis ของพวกเขา คุณจะเรียกใช้ในหน้า wiki ของเซิร์ฟเวอร์นี้สำหรับ repo 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 ของคุณโดยใช้เพียงชวา

แต่เมื่อฉันเรียกใช้เว็บไซต์ของฉันฉันยังได้รับไอคอน 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 โดยพื้นฐานแล้วสิ่งนี้จะส่งต่อคำขอทั้งหมดไปยัง Kestrel IIS Express (และ IIS สำหรับเรื่องนั้น) จะไม่เรียกใช้ ASP.NET อีกต่อไป แต่พวกเขาจะทำหน้าที่เป็นผู้รับมอบฉันทะที่เพียงแค่ส่งคำขอและตอบกลับจาก Kestrel ยังคงมีข้อดีของการใช้ IIS โดยเฉพาะจะให้การกำหนดค่าความปลอดภัยการแคชระดับเคอร์เนล ฯลฯ


5
คำแนะนำที่ยอดเยี่ยมเกี่ยวกับสิ่งที่เกิดขึ้นภายใต้การครอบคลุมเมื่อใช้ ASP.Net core youtu.be/e2qZvabmSvo
user99513

4
คำตอบนี้ล้าสมัยเล็กน้อยเนื่องจากการเปิดตัว ASP.NET Core Module (แทน HttpPlatformHandler) ฉันเสนอคำตอบทางเลือกพร้อมเรื่องราวเพิ่มเติมและผลิตภัณฑ์ที่เกี่ยวข้องเช่นกัน
Lex Li

175

ฉันต้องการเสนอคำตอบอื่นด้วยประวัติบางอย่างเพื่อให้คุณเข้าใจว่าทำไม Kestrel ถึงแม้ว่าคุณจะใช้ Windows และ IIS เท่านั้น

ที่จุดเริ่มต้นของการพัฒนา ASP.NET ก่อนปี 2000 อย่างชัดเจน Microsoft สร้างสองส่วนเพื่อโฮสต์แอพ ASP.NET WebForms

  • Cassini ต่อมากลายเป็น ASP.NET Development Server ใน 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 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 เป็น reverse proxy ที่ดีพอสำหรับ Java / Python และอื่น ๆ ดังนั้นจึงวางแผนที่จะใช้สำหรับ ASP.NET Core ปัญหาเริ่มปรากฏขึ้นระหว่างการพัฒนาดังนั้นภายหลัง Microsoft ได้สร้าง ASP.NET Core Module สำหรับ ASP.NET Core โดยเฉพาะ นั่นคือการสนับสนุน ASP.NET ใน IIS revision 4

เริ่มต้นจาก ASP.NET Core 2.2 โมดูล ASP.NET Core สำหรับ IIS (รุ่น 2) สามารถโฮสต์สภาพแวดล้อม. NET Core ภายในกระบวนการผู้ปฏิบัติงาน IIS ( w3wp.exe) ค่อนข้างคล้ายกับ ASP.NET 2.x / 4.x โหมดนี้จะเรียกว่า"IIS ในกระบวนการโฮสติ้ง" มันถือได้ว่าเป็นการสนับสนุน ASP.NET ใน IIS revision 5

ค่อนข้างยาว แต่ฉันหวังว่าฉันจะนำทุกอย่างที่จำเป็นมารวมกันและคุณสนุกกับการอ่าน


1
คำตอบที่ดี แต่คุณไม่สามารถพูดได้ง่ายๆว่าการใช้ชวากับ IIS คือ 'ผลลัพธ์ของการฝึกอบรมทางอินเทอร์เน็ตในปัจจุบัน' มีเหตุผลหลายประการในการใช้ reverse proxy คงจะดีที่จะพูดถึงไม่กี่ที่นี่
Nilay Vishwakarma

13
"มีเหตุผลหลายประการในการใช้ reverse proxy" เป็นของคำถามและคำตอบของมันเอง โดยปกติผู้คนสามารถค้นหาแหล่งข้อมูลที่ดีได้โดยถาม Google ดังนั้นฉันจึงไม่ได้ผนวกท้ายคำตอบนี้ไว้นานพอ
Lex Li

12

จาก ms docs ที่: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?tabs=aspnetcore2x

Kestrel เป็นเว็บเซิร์ฟเวอร์ข้ามแพลตฟอร์มสำหรับ ASP.NET Core ที่ใช้ libuv ซึ่งเป็นไลบรารี I / O แบบอะซิงโครนัสข้ามแพลตฟอร์ม 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 อีกต่อไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.