آشنایی با وب سرور جدید Kestrel در ASPNET Core

همانطور که مطلع هستید، نسخه جدید ASPNET Core در پلتفرم های مختلف می تواند اجرا شود. اما چه وب سروری می تواند درخواست های HTTP مربوط به ASPNET Core را مدیریت کند؟ آیا می توانیم از وب سرور های قدرتمند Apache، Nginx هم در محیط لینوکس در کنار aspnet core استفاده کنیم؟ آیا تیم های توسعه Apache و Nginx تغییری در نرم افزارهایشان داده اند تا بشود با ASPNET Core کار کنند؟در نسخه های قبلی، برنامه های تحت ASP.NET نیازداشتند تا در IIS اجرا شوند. بدین معنا که IIS یک Process معروف به نام Application Pool یا w3wp را اجرا می کرد و این فرایند مسئولیت راه اندازی نرم افزارِ ما و هدایت درخواست ها و مدیریت چرخه عمر آن ها را بر عهده داشت. در نتیجه برنامه ها به IIS وابسته بوده و عملا خارج از محیط آن نمی توانستند به حیات ادامه دهند.در نسخه جدید، برای اینکه وابستگی به IIS و سیستم عامل ویندوز به طور کامل از بین برود و بتوانیم در سیستم عامل های دیگر هم اپلیکیشن های ASPNET Core را اجرا کنیم. از وب سروری به نام Kestrel استفاده می شود. صفرم. Kestrel در تمام سیستم عامل ها اجرا می شود.یکم. Kestrel یک وب سرور بسیار بسیار ساده (Raw Web Server)، سبک و در عین حال سریع است. Kestrel به حدی ساده (Feature-less) طراحی شده که حتی نمی توانیم با آن اپلیشکن هایی را در پورت 80 یا 443 داشته باشیم.دوم. Kestrel هیچ مسئولیتی به جز دریافت درخواست های HTTP از سیستم عامل و سپردن آن ها به ASPNET Core ندارد. سوم. در Kestrel به هیچ از عنوان قابلیت های گسترده و متنوعِ وب سروری مثل IIS، نظیر مدیریت SSL، انواع ماژول ها و تنظیمات و ... خبری نیست.چهارم. Kestrel یک بسته Nuget می باشد که در کنار اپلیکشن ما قرار می گیرد. به این معنی که هر اپلیکشن ASPNET Core توسط وب سرور مربوط به خودش درخواست های HTTP را دریافت می کند. این برخلاف IIS است که فقط یک نسخه از آن در سرور نصب می شود.پنجم. اپلیکشن های ASPNET Core در واقع یک Console Application هستند که nuget مربوط به Kestrel را دارا بوده و در ابتدای اجرا شدن خود، Pipeline مربوط به Kestrel را راه اندازی می کنند تا بتوانند درخواست های HTTP را دریافت کنند.پس در واقع در هر سیستم عامل، Kestrel با لایه های مربوط به HTTP در تماس بوده و می تواند درخواست ها را به سمت اپلیکشن ها هدایت کند. همانطور که در قسمت قبلی تشریح شد، وب سرور Kestrel کمک می کند که اپلیکشن ما مستقل از سیستم عامل اجرا شود. این وب سرور بسیار سریع و در عین حال ساده (feature-less) می باشد. اما چه راهی برای استفاده از ویژگی های پیچیده و گسترده وب سرور های قدرتمندی نظیر Apache، Nginx و IIS وجود دارد؟راه حل استفاده از روشی به نام Reverse Proxy Server می باشد. به طور ساده، در این معماری، به جای استفاده از یک وب سرور، دو یا چند وب سرور خواهیم داشت. یک وب سرور به نام Reverse Proxy در لایه بیرونی خواهد بود و از بیرون دیده خواهد شد. بدین معنی که این وب سرور در جایی قرار خواهد گرفت که درخواست های کاربران به سمت آن ها می آید. این وب سرور ها بر اساس نیاز، تغییراتی را بر روی درخواست ها انجام می دهند (مثلا آی پی های خاصی را بلاک می کنند یا مدیریت SSL را بر عهده خواهند داشت و یا load balancing و غیره).سپس وب سرور های بیرونی، درخواست ها را به یک IP و Port که در مرزهای داخلی هستند، ارسال می کنند. با این معماری و توضیحات، ما می توانیم از هر وب سروری که می خواهیم برای مدیریت اپلیکشن های مان استفاده کنیم. بدین طریق که مثلا مانند سابق IIS را خواهیم داشت و تنظیماتی که می خواهیم را بر روی آن انجام می دهیم. اما این بار IIS یک Reverse Proxy می باشد و از او می خواهیم که درخواست ها را پس از اعمال تغییرات به یک پورت دیگر Forward و هدایت نماید. این پورت در واقع همان پورتی است که Kestrelِ مربوط به وب اپلیکشن ما مسئولیت اش را بر عهده گرفته است.در نتیجه نه Kestrel و نه ASPNET Core هیچ گونه وابستگی به سیستم عامل و وب سرور ها نداشته و تصوری ندارند که درخواست ها مستقیم به آن ها رسیده و یا از طریق یک وب سرور دیگر به آن ها فوروارد شده است.توضیحات بیشتر:1. https://weblog.west-wind.com/posts/2016/Jun/06/Publishing-and-Running-ASPNET-Core-Applications-with-IIS2. https://docs.asp.net/en/latest/publishing/linuxproduction.html