"原文地址 Kestrel server for ASP.NET Core" By [Tom Dykstra][1], [Chris Ross][2], and [Stephen Halter][3] Kestrel是一個基於libuv的跨平臺[ASP.NET Core web伺服器][4],[li ...
原文地址----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作為反向代理伺服器。