原文地址:Servers overview for ASP.NET Core
By Tom Dykstra, Steve Smith, Stephen Halter, and Chris Ross
ASP.NET Core應用通過一個進程內的HTTP服務器實例實現運行,這個服務器實例偵聽HTTP請求並將請求作為組成HttpContext的一組請求功能集暴露給我們的應用程序。
ASP.NET Core搭載兩個服務器實現:
- Kestrel是一個基於libuv的跨平台HTTP服務器,libuv是一個跨平台的異步I/O庫
- WebListener是一個基於HTTP.SYS內核驅動的“Windows專用”HTTP服務器
Kestrel
Kestrel是包含在ASP.NET Core新項目模板中默認的web服務器。如果你的應用只接收來自內部網絡的請求,你可以只使用Kestrel本身。
如果你將你的應用部署在公共網絡上,我們建議你使用IIS,Nginx或者Apache作為反向代理服務器。一個反向代理服務器接收來自網絡的HTTP請求並且在經過一些初步處理后將請求傳遞到Kestrel服務器。過程如下圖所示。
對edge deployments(從公共網絡上接觸到流量的部署方式)使用反向代理最重要的一個原因就是安全性。因為Kestrel相對較新,對抵御安全攻擊至今還沒有一個完整的功能補充。安全性處理包括但不限於適當的超時,大小的限制,以及並發連接限制等問題。有關何時使用Kestrel與反向代理的更多信息,請參見Kestrel。
IIS with Kestrel
當你使用IIS或者IIS Express作為對ASP.NET Core的反向代理時,ASP.NET Core應用將運行在由該IIS工作進程分離出的一個進程中。在該IIS進程中,存在着一個特殊的IIS模塊,它被用來協調反向代理的關系。它就是ASP.NET Core模塊。ASP.NET Core模塊的主要功能包括啟動ASP.NET Core應用,當應用崩潰時處理重啟,向應用傳送HTTP流量。更多的信息,請參考ASP.NET Core Module。
Nginx with Kestrel
有關如何在Linux使用Nginx作為對Kestrel的反向代理服務器的更多信息,請參考Publish to a Linux Production Environment。
Apache with Kestrel
有關如何在Linux使用Apache作為對Kestrel的反向代理服務器的更多信息,請參考Using Apache Web Server as a reverse proxy。
WebListener
如果你在Windows上運行你的ASP.NET Core應用,你可以會遇到以下場景——你既想要在公共網絡上部署你的應用,又不能使用IIS,這時,WebListener會是一個可供替代的選擇。
當你只想要在內網中部署你的應用時,WebListener可以被用來代替Kestrel,特別是當你需要Weblistener服務器支持功能中的某項而Kestrel恰好不支持的時候。
對於內部網絡場景,為了能達到最好的性能表現,我們通常推薦Kestrel服務器,但是在另一些場景中,你可以想要使用某項僅WebListener支持的功能。關於WebListener功能的更多信息,請參考WebListener。
ASP.NET Core 服務器基礎組件說明
IApplicationBuilder
在Startup
類中的Configure
方法暴露了IFeatureCollection
類的ServerFeatures
屬性。Kestrel和WebListener服務器都只提供了一個單一的功能,IServerAddressesFeature
,但是不同的服務器實現可能會顯示額外的功能。
IServerAddressesFeature
可以用來找出哪些服務器實例端口在運行時被綁定。
ServerFeatures
的注釋為“Gets the set of HTTP features the application's server providers”。
自定義服務器
你可以創建自定義服務器實現以用來替代Kestrel或者WebListener。Open Web Interface for .NET(OWIN) guide 說明了怎么去實現一個Nowin-based IServer。你可以自由地實現你的應用所需的功能接口,但至少必須支持IHttpRequestFeature
和IHttpResponseFeature
接口。
下一步
更多的信息, 請參考以下資源: