Kestrel là gì (so với IIS / Express)


158

Máy chủ web kestrel là gì và nó liên quan đến IIS / IIS Express như thế nào?

Tôi đến từ việc phát triển ứng dụng trên IIS Express và lưu trữ chúng trên máy chủ web IIS. Với ASP.NET Core tôi có một sự phụ thuộc Microsoft.AspNetCore.Server.Kestrelvà khởi nghiệp của tôi có .UseServer("Microsoft.AspNetCore.Server.Kestrel"). Nhưng khi tôi chạy trang web của mình, tôi vẫn nhận được biểu tượng IIS Express trong khay hệ thống. Có người hỏi tôi rằng tôi đang sử dụng IIS Express hay Kestrel và tôi không biết phải nói gì!

Tôi không có bất kỳ yêu cầu đa nền tảng nào khi tôi phát triển trên PC và máy chủ lưu trữ trong Azure, vì vậy tôi bối rối nếu tôi thậm chí là needKestrel, nhưng dường như không có sự thay thế nào - ngay cả những mẫu đơn giản nhất cũng sử dụng Kestrel.


Khi bạn có câu hỏi về công nghệ mới này, hãy bắt đầu tại trang GitHub cho các dự án được đề cập và xem Wikis của họ. Bạn sẽ chạy trên trang wiki Máy chủ này cho repo ASP.NET.
thợ xây

11
Tất nhiên, sau đó bạn chạy vào những thứ như This document is now out of date. For up-to-date ASP.NET Core documentation go to: http://docs.asp.net. Giáo sư.

Câu trả lời:


115

Kestrel là gì

Đó là một máy chủ web đầy đủ. Bạn có thể chạy ứng dụng ASP.NET Core của mình chỉ bằng Kestrel.

Nhưng khi tôi chạy trang web của mình, tôi vẫn nhận được biểu tượng IIS Express trong khay hệ thống

Trong ứng dụng ASP.NET của bạn, có lẽ trong wwwrootthư mục, bạn sẽ thấy một web.config có chứa điều này:

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

Đây là httpPl PlatformHandler. Về cơ bản, những gì nó làm là chuyển tiếp tất cả các yêu cầu đến Kestrel. IIS Express (và IIS cho vấn đề đó) sẽ không tự chạy ASP.NET nữa. Thay vào đó, họ sẽ đóng vai trò là những người chỉ đơn giản chuyển các yêu cầu và phản hồi qua lại từ Kestrel. Vẫn có những lợi thế của việc sử dụng IIS, cụ thể là nó cung cấp cho bạn cấu hình bảo mật, bộ đệm cấp kernel, v.v.


5
giới thiệu tuyệt vời về chính xác những gì đang diễn ra dưới vỏ bọc khi sử dụng lõi ASP.Net youtu.be/e2qZvabmSvo
199513

4
Câu trả lời này hơi lỗi thời do sự ra đời của Mô-đun ASP.NET Core (thay vì httpPl PlatformHandler). Tôi đã đưa ra một câu trả lời thay thế với nhiều câu chuyện và các sản phẩm liên quan là tốt.
Lex Li

171

Tôi muốn đưa ra một câu trả lời thay thế, với một số lịch sử, để bạn có thể hiểu tại sao Kestrel đến, ngay cả khi bạn chỉ sử dụng Windows và IIS.

Khi bắt đầu phát triển ASP.NET trước năm 2000, rõ ràng Microsoft đã tạo ra hai phần để lưu trữ các ứng dụng ASP.NET WebForms,

  • Cassini, sau này trở thành Máy chủ phát triển ASP.NET trong Visual Studio. Nó là một máy chủ web được quản lý hoàn toàn được viết bằng C # dựa trên HttpListener. Tất nhiên, vì nó chỉ dành cho phát triển, nhiều tính năng không bao giờ được thực hiện. Khi Microsoft cung cấp mã nguồn của Cassini cho công chúng, có những bên thứ ba đã chia rẽ cơ sở mã và thêm nhiều tính năng, bắt đầu gia đình Cassini.
  • Hỗ trợ ASP.NET trên IIS (phiên bản 1). Vì IIS là 4.0 và 5.0 / 5.1 tại thời điểm đó, không có gì giống như nhóm ứng dụng, ASP.NET thậm chí còn có quy trình worker ( aspnet_wp.exe).

Vì vậy, để phát triển ứng dụng web, bạn sử dụng Cassini và để triển khai bạn sử dụng IIS.

  • Việc giới thiệu nhóm ứng dụng trong IIS 6 yêu cầu một số thay đổi về phía ASP.NET, do đó aspnet_wp.exetrở nên lỗi thời và được thay thế bằng aspnet_isapi.dll. Điều đó có thể được xem là hỗ trợ ASP.NET trên phiên bản IIS 2. Vì vậy, các ứng dụng ASP.NET đang được lưu trữ trong các quy trình công nhân IIS w3wp.exe.

  • Việc giới thiệu đường ống tích hợp trong IIS 7 trở lên yêu cầu thay đổi thêm, thay thế aspnet_isapi.dllbằng webengine4.dll. Điều đó có thể được xem là hỗ trợ ASP.NET trên phiên bản IIS 3. Các đường ống ASP.NET và IIS được thống nhất.

Bạn có thể thấy ASP.NET đã trở nên phức tạp hơn và được tích hợp chặt chẽ với IIS, vì vậy Cassini bắt đầu cho thấy tuổi của nó và dần dần được thay thế bởi IIS Express (chế độ người dùng lite IIS).

Vì vậy, trong nhiều trường hợp, khi mọi người đổ lỗi rằng IIS chậm, họ nên đổ lỗi cho ASP.NET trên thực tế. Bản thân IIS không có ASP.NET là khá nhanh và ổn định, trong khi ASP.NET không được phát triển với đủ số liệu hiệu suất (vì WebForms tập trung khá nhiều năng suất và RAD).

Sau đó vào tháng 11 năm 2014, ASP.NET 5 (sau đổi tên thành ASP.NET Core) đã được công bố và trở thành một công nghệ đa nền tảng. Rõ ràng Microsoft cần một thiết kế mới để hỗ trợ Windows, macOS và Linux, trong đó tất cả các máy chủ web chính, nginx / Apache (hoặc các máy chủ web khác) nên được xem xét bên cạnh IIS.

Tôi nghĩ nhiều người sẽ đồng ý rằng Microsoft đã học được khá nhiều từ NodeJS, sau đó thiết kế và phát triển Kestrel (dựa trên libuvban đầu nhưng có thể sớm chuyển sang công nghệ khác). Nó là một máy chủ web nhẹ như Cassini ban đầu, nhưng sau đó nhiều tính năng hơn được thêm vào (như một câu trả lời khác nhận xét, nhiều tính năng hơn để có thể được coi là một máy chủ web đầy đủ). Mặc dù được quản lý hoàn toàn (tồn tại một số phụ thuộc riêng), nó không còn là máy chủ web đồ chơi như Cassini.

Vậy thì tại sao bạn không thể sử dụng Kestrel? Tại sao IIS Express và có khả năng IIS, nginx hoặc Apache vẫn cần thiết? Đó chủ yếu là kết quả của thực hành internet ngày nay. Hầu hết các trang web sử dụng proxy ngược để nhận yêu cầu từ trình duyệt web của bạn và sau đó chuyển tiếp đến các máy chủ ứng dụng trong nền.

  • IIS Express / IIS / nginx / Apache là các máy chủ proxy ngược
  • Kestrel / NodeJS / Tomcat và các máy chủ ứng dụng khác

Một câu trả lời khác đã cho thấy một liên kết đến tài liệu của Microsoft, vì vậy bạn có thể xem qua.

Microsoft đã phát triển httpPl PlatformHandler ban đầu để biến IIS thành một proxy ngược đủ tốt cho Java / Python, v.v., vì vậy đã lên kế hoạch sử dụng nó cho ASP.NET Core. Các vấn đề bắt đầu xuất hiện trong quá trình phát triển, vì vậy sau đó Microsoft đã tạo ra Mô-đun ASP.NET Core dành riêng cho ASP.NET Core. Đó là hỗ trợ ASP.NET trên phiên bản IIS 4.

Bắt đầu từ ASP.NET Core 2.2, Mô-đun ASP.NET Core cho IIS (phiên bản 2) có thể lưu trữ môi trường .NET Core bên trong quy trình công nhân IIS ( w3wp.exe), khá giống với ASP.NET 2.x / 4.x. Chế độ này được gọi là "IIS in-process hosting" . Nó có thể được coi là hỗ trợ ASP.NET trên phiên bản IIS 5.

Chà, khá dài, nhưng tôi hy vọng tôi đặt tất cả các phần cần thiết lại với nhau và bạn thích đọc nó.


1
Câu trả lời tốt đẹp. Nhưng bạn không thể nói một cách đơn giản rằng sử dụng kestrel với IIS là "kết quả của thực tiễn internet ngày nay". Có nhiều lý do sử dụng proxy ngược. Sẽ là tốt để đề cập đến một vài ở đây.
Nilay Vishwakarma

13
"Có nhiều lý do sử dụng proxy ngược" thuộc về câu hỏi và câu trả lời của chính nó. Thông thường mọi người có thể tìm thấy các tài nguyên tốt bằng cách hỏi Google, vì vậy tôi đã không nối nó với câu trả lời đã đủ dài này.
Lex Li

12

Từ tài liệu ms tại: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?tabs=aspnetcore2x

Kestrel là một máy chủ web đa nền tảng cho ASP.NET Core dựa trên libuv, một thư viện I / O không đồng bộ đa nền tảng. Kestrel là máy chủ web được bao gồm theo mặc định trong các mẫu dự án ASP.NET Core.

Bạn có thể sử dụng Kestrel một mình hoặc với một máy chủ proxy ngược, chẳng hạn như IIS, Nginx hoặc Apache. Một máy chủ proxy ngược nhận các yêu cầu HTTP từ Internet và chuyển tiếp chúng đến Kestrel sau một số xử lý sơ bộ.


CẬP NHẬT: .net core 2.1, Kestrel sử dụng các socket được quản lý thay thế nếu libuv

Từ tài liệu lõi 2.1 của asp.net tại: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-2.1#transport-configuration

Với việc phát hành ASP.NET Core 2.1, vận chuyển mặc định của Kestrel không còn dựa trên Libuv mà thay vào đó dựa trên các ổ cắm được quản lý.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.