1. 程式人生 > >ASP.NET Core的Kestrel服務器

ASP.NET Core的Kestrel服務器

master 高性能 本地 oot content wing 啟動 azure 版本

原文: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方法中調用WebHostBuilderUseKestrel 擴展方法,指定你需要的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服務器