Apa itu Kestrel (vs IIS / Express)

158

Apa server web kestrel dan bagaimana hubungannya dengan IIS / IIS Express?

Saya berasal dari pengembangan aplikasi di IIS Express dan hosting di server web IIS. Dengan ASP.NET Core, saya memiliki ketergantungan Microsoft.AspNetCore.Server.Kestreldan startup saya telah .UseServer("Microsoft.AspNetCore.Server.Kestrel"). Tetapi ketika saya menjalankan situs web saya, saya masih mendapatkan ikon IIS Express di baki sistem. Seseorang bertanya kepada saya apakah saya menggunakan IIS Express atau Kestrel dan saya tidak tahu harus berkata apa!

Saya tidak memiliki persyaratan lintas-platform seperti yang saya kembangkan di PC dan host di Azure, jadi saya bingung jika saya bahkan needKestrel, tetapi sepertinya tidak ada alternatif - bahkan sampel paling sederhana menggunakan Kestrel.

Sean
sumber
Ketika Anda memiliki pertanyaan tentang teknologi baru ini, mulailah di halaman GitHub untuk proyek-proyek yang dimaksud dan lihat Wikisenya. Anda akan menjalankan halaman wiki Server ini untuk repo ASP.NET.
tukang
11
Tentu saja, maka Anda mengalami hal-hal seperti This document is now out of date. For up-to-date ASP.NET Core documentation go to: http://docs.asp.net. Ups.

Jawaban:

115

Apa itu Kestrel?

Ini adalah server web penuh sesak nafas. Anda dapat menjalankan aplikasi Core ASP.NET hanya menggunakan Kestrel.

Tetapi ketika saya menjalankan situs web saya, saya masih mendapatkan ikon IIS Express di baki sistem

Di aplikasi ASP.NET Anda, mungkin di wwwrootdirektori, Anda akan melihat web.config yang berisi ini:

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

Ini adalah HttpPlatformHandler. Pada dasarnya, yang dilakukan adalah meneruskan semua permintaan ke Kestrel. IIS Express (dan IIS dalam hal ini) tidak akan menjalankan ASP.NET sendiri lagi. Sebaliknya, mereka akan bertindak sebagai proksi yang hanya mengirimkan permintaan dan tanggapan bolak-balik dari Kestrel. Masih ada keuntungan menggunakan IIS, khususnya memberikan Anda konfigurasi keamanan, caching level kernel, dll.

vcsjones
sumber
5
intro yang sangat baik untuk apa yang sebenarnya terjadi di bawah selimut saat menggunakan ASP.Net core youtu.be/e2qZvabmSvo
user99513
4
Jawaban ini sedikit ketinggalan zaman karena pengenalan Modul Inti ASP.NET (bukan HttpPlatformHandler). Saya menawarkan jawaban alternatif dengan lebih banyak cerita dan produk terkait juga.
Lex Li
171

Saya ingin menawarkan jawaban alternatif, dengan beberapa riwayat, sehingga Anda mungkin mengerti mengapa Kestrel datang, bahkan jika Anda hanya menggunakan Windows dan IIS.

Pada awal pengembangan ASP.NET sebelum tahun 2000, jelas Microsoft menciptakan dua bagian untuk menjadi tuan rumah aplikasi ASP.NET WebForms,

  • Cassini, kemudian menjadi ASP.NET Development Server di Visual Studio. Ini adalah server web yang dikelola sepenuhnya ditulis dalam C # berdasarkan HttpListener. Tentu saja, karena hanya untuk pengembangan, banyak fitur yang tidak pernah diterapkan. Ketika Microsoft membuat kode sumber Cassini tersedia untuk umum, ada pihak ketiga yang menggunakan basis kode dan menambahkan lebih banyak fitur, yang memulai keluarga Cassini.
  • Dukungan ASP.NET pada IIS (revisi 1). Karena IIS adalah 4.0 dan 5.0 / 5.1 pada waktu itu, yang tidak seperti kolam aplikasi, ASP.NET bahkan memiliki proses pekerja sendiri ( aspnet_wp.exe).

Jadi untuk mengembangkan aplikasi web, Anda menggunakan Cassini, dan untuk menyebarkan Anda menggunakan IIS.

  • Pengenalan kumpulan aplikasi di IIS 6 membutuhkan beberapa perubahan di sisi ASP.NET, sehingga aspnet_wp.exemenjadi usang dan digantikan oleh aspnet_isapi.dll. Itu bisa dilihat sebagai dukungan ASP.NET pada revisi IIS 2. Jadi aplikasi ASP.NET dihosting di proses pekerja IIS w3wp.exe.

  • Pengenalan pipa terintegrasi di IIS 7 dan di atas membutuhkan perubahan lebih lanjut, yang diganti aspnet_isapi.dlldengan webengine4.dll. Itu dapat dilihat sebagai dukungan ASP.NET pada revisi IIS 3. Jaringan pipa ASP.NET dan IIS disatukan.

Anda dapat melihat ASP.NET telah menjadi jauh lebih kompleks dan terintegrasi dengan IIS, sehingga Cassini mulai menunjukkan usia, dan secara bertahap digantikan oleh IIS Express (mode pengguna lite IIS).

Jadi, dalam banyak kasus, ketika orang menyalahkan bahwa IIS lambat, mereka seharusnya menyalahkan ASP.NET sebenarnya. IIS sendiri tanpa ASP.NET cukup cepat dan stabil, sementara ASP.NET tidak dikembangkan dengan metrik kinerja yang cukup dalam pikiran (karena WebForms memfokuskan cukup banyak produktivitas dan RAD).

Kemudian pada November 2014, ASP.NET 5 (kemudian berganti nama menjadi ASP.NET Core) diumumkan dan menjadi teknologi lintas platform. Jelas Microsoft membutuhkan desain baru untuk mendukung Windows, macOS, dan Linux, di mana semua server web utama, nginx / Apache (atau server web lainnya) harus dipertimbangkan selain IIS.

Saya pikir banyak yang akan setuju bahwa Microsoft belajar cukup banyak dari NodeJS, dan kemudian merancang dan mengembangkan Kestrel (berdasarkan pada libuvawalnya tetapi mungkin akan pindah ke teknologi lain segera). Ini adalah server web ringan seperti Cassini pada awalnya, tetapi kemudian lebih banyak fitur yang ditambahkan (seperti komentar lain berkomentar, lebih banyak fitur sehingga dapat diperlakukan sebagai server web penuh). Meskipun sepenuhnya dikelola (beberapa dependensi asli ada), itu bukan lagi server web mainan seperti Cassini.

Lalu mengapa kamu tidak bisa menggunakan Kestrel saja? Mengapa IIS Express dan berpotensi IIS, nginx, atau Apache masih diperlukan? Itu terutama adalah hasil dari praktik internet saat ini. Sebagian besar situs web menggunakan proksi terbalik untuk mengambil permintaan dari browser web Anda dan kemudian meneruskan ke server aplikasi di latar belakang.

  • IIS Express / IIS / nginx / Apache adalah server proxy terbalik
  • Kestrel / NodeJS / Tomcat dan sebagainya adalah server aplikasi

Jawaban lain sudah menunjukkan tautan ke dokumentasi Microsoft, jadi Anda bisa melihatnya.

Microsoft mengembangkan HttpPlatformHandler pada awalnya untuk membuat IIS proxy terbalik yang cukup baik untuk Java / Python dan seterusnya, jadi direncanakan untuk menggunakannya untuk ASP.NET Core. Masalah mulai muncul selama pengembangan, jadi kemudian Microsoft membuat ASP.NET Core Module khusus untuk ASP.NET Core. Itulah dukungan ASP.NET pada revisi IIS 4.

Mulai dari ASP.NET Core 2.2, Modul Inti ASP.NET untuk IIS (versi 2) dapat meng-host lingkungan .NET Core di dalam proses pekerja IIS ( w3wp.exe), sangat mirip dengan ASP.NET 2.x / 4.x. Mode ini disebut "hosting dalam proses IIS" . Ini dapat dianggap sebagai dukungan ASP.NET pada revisi IIS 5.

Yah, cukup panjang, tapi saya harap saya mengumpulkan semua bagian yang diperlukan dan Anda menikmati membacanya.

Lex Li
sumber
1
Jawaban bagus. Tetapi Anda tidak bisa mengatakan bahwa menggunakan kestrel dengan IIS adalah 'hasil dari praktik internet saat ini'. Ada banyak alasan menggunakan proxy terbalik. Akan lebih baik untuk menyebutkan beberapa di sini.
Nilay Vishwakarma
13
"Ada banyak alasan menggunakan proxy terbalik" milik pertanyaan dan jawaban sendiri. Biasanya orang dapat menemukan sumber daya yang baik dengan bertanya kepada Google, jadi saya tidak menambahkannya pada jawaban yang sudah cukup lama ini.
Lex Li
12

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

Kestrel adalah server web lintas platform untuk ASP.NET Core berbasis libuv, pustaka I / O asinkron lintas platform. Kestrel adalah server web yang disertakan secara default di templat proyek ASP.NET Core.

Anda dapat menggunakan Kestrel dengan sendirinya atau dengan server proxy terbalik, seperti IIS, Nginx, atau Apache. Server proxy terbalik menerima permintaan HTTP dari Internet dan meneruskannya ke Kestrel setelah beberapa penanganan awal.


UPDATE: .net core 2.1, Kestrel menggunakan soket yang dikelola sebagai gantinya jika libuv

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

Dengan rilis ASP.NET Core 2.1, transport default Kestrel tidak lagi didasarkan pada Libuv tetapi didasarkan pada soket yang dikelola.

Maks
sumber