ASP.NET Core的Kestrel服務器
原文地址----Kestrel server for ASP.NET Core
By Tom Dykstra, Chris Ross, and Stephen Halter
Kestrel是一個基於libuv的跨平臺ASP.NET Core web服務器,libuv是一個跨平臺的異步I/O庫。ASP.NET Core模板項目使用Kestrel作為默認的web服務器。
Kestrel支持以下功能:
- HTTPS
- 用於啟用不透明升級的WebSockets
- 位於Nginx之後的高性能Unix sockets
Kestrel 被.NET Core支持的所有平臺和版本所支持
查看或下載示例代碼
何時使用Kestrel和反向代理服務器
如果你的應用只接收來自內部網絡的請求,你可以只使用Kestrel本身。
如果你將你的應用部署在公共網絡上,我們建議你使用IIS,Nginx或者Apache作為反向代理服務器。一個反向代理服務器接收來自網絡的HTTP請求並且在經過一些初步處理後將請求傳遞到Kestrel服務器。
出於安全性的理由,反向代理常常被edge deployments所采用。因為Kestrel相對較新,對抵禦安全攻擊至今還沒有一個完整的功能補充。安全性處理包括但不限於適當的超時,大小的限制,以及並發連接限制等問題。
另一個需要反向代理的場景是,你有多個需要在單獨的服務器上運行並分享同一端口的應用。因為Kestrel不支持在多進程間分享同一端口,所以應用並不能直接和Kestrel合作。當你在某個端口上配置Kestrel運行偵聽時,不算主機頭如何標識,Kestrel會為該端口處理所有的流量。反向代理可以為多個應用共享唯一端口並將流量發送給Kestrel。
即使不需要反向代理服務器,使用它也可以簡化負載均衡和SSL設置 -- 只要你的反向代理服務器需要SSL證書,並且該服務器可以和你的應用在內部網中通過普通HTTP進行通信。
如何在ASP.NET Core應用中使用Kestrel
安裝 Microsoft.AspNetCore.Server.Kestrel Nuget包。
在應用的Main
方法中調用WebHostBuilder
的UseKestrel
擴展方法,指定你需要的Kestrel選項,如以下示例所示:
public static int Main(string[] args) { Console.WriteLine("Running demo with Kestrel."); var config = new ConfigurationBuilder() .AddCommandLine(args) .Build(); var builder = new WebHostBuilder() .UseContentRoot(Directory.GetCurrentDirectory()) .UseConfiguration(config) .UseStartup<Startup>() .UseKestrel(options => { if (config["threadCount"] != null) { options.ThreadCount = int.Parse(config["threadCount"]); } }) .UseUrls("http://localhost:5000"); var host = builder.Build(); host.Run(); return 0; }
URL 前綴
默認情況下,ASP.NET Core項目綁定了http://localhost:5000
。通過使用UseUrls
擴展方法——編輯urls
命令行參數,或者是通過ASP.NET Core配置系統,你可以為Ketrel配置URL前綴和端口號以用來偵聽請求。關於這些方法更多的信息,請參考Hosting。有關於當你使用IIS作為反向代理時,URL綁定是如何工作的信息,請參考ASP.NET Core 模塊。
Kestrel URL前綴可以是以下格式中的任一種。
- IPv4 地址和端口號
http://65.55.39.10:80/
https://65.55.39.10:443/
- IPv6 地址和端口號
http://[0:0:0:0:0:ffff:4137:270a]:80/
https://[0:0:0:0:0:ffff:4137:270a]:443/
IPv6中的 [::] 等價於 IPv4 0.0.0.0。
- 主機名和端口號
http://contoso.com:80/
http://*:80/
https://contoso.com:443/
https://*:443/
主機名稱,*,以及+,都不是特殊的。任何沒有公認的IP 或是“localhost”的地址將綁定到所有的IPv4和IPv6的IP上。如果你需要為不同的ASP.NET Core應用在同一端口上綁定不同的主機名,請使用WebListener或者諸如IIS,Nginx或Apache這樣的反向代理服務器。
* "Localhost" 名稱和端口號或回送IP地址和端口號
http://localhost:5000/
http://127.0.0.1:5000/
http://[::1]:5000/
當localhost
被指定時,Kestrel會嘗試去綁定到IPv4和IPv6的環回接口。如果被請求的端口號正在任一環回接口上被其他服務所使用,Kestrel將會啟動失敗。如果任一環回接口出於各種原因而不可用(最通常的情況是因為IPv6暫不被支持),Kestrel將記錄下一個警告信息。
- Unix socket
http://unix:/run/dan-live.sock
如果你指定了端口號0,Kestrel將動態地綁定到合適的端口號。除了localhost
名稱,綁定到0端口號被其他任何主機名稱或IP地址所允許。
當你指定了端口號0,你可以使用IServerAddressesFeature
接口去決定運行時Kestrel實際綁定到哪個端口。下列示例用於獲取綁定端口並且在console上顯示出來。
public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole();
var serverAddressesFeature = app.ServerFeatures.Get<IServerAddressesFeature>();
app.UseStaticFiles();
app.Run(async (context) =>
{
context.Response.ContentType = "text/html";
await context.Response
.WriteAsync("<p>Hosted by Kestrel</p>");
if (serverAddressesFeature != null)
{
await context.Response
.WriteAsync("<p>Listening on the following addresses: " +
string.Join(", ", serverAddressesFeature.Addresses) +
"</p>");
}
await context.Response.WriteAsync($"<p>Request URL: {context.Request.GetDisplayUrl()}<p>");
});
}
SSL的URL前綴
如果你調用UseSSL
擴展方法,請確保在https:
中包含URL前綴,如下所示:
var host = new WebHostBuilder()
.UseKestrel(options =>
{
options.UseHttps("testCert.pfx", "testPassword");
})
.UseUrls("http://localhost:5000", "https://localhost:5001")
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup<Startup>()
.Build();
Note
HTTPS和HTTP不能在同一端口上被托管。
下一步
更多的信息,請參考以下資源:
- Sample app for this article
- Kestrel source code
- Your First ASP.NET Core Application on a Mac Using Visual Studio Code
本教程在本地僅使用Kestrel,在將該應用部署到Azure之後,它將在Windows上使用IIS作為反向代理服務器。
ASP.NET Core的Kestrel服務器