原文地址----Kestrel server for ASP.NET Corehtml
By Tom Dykstra, Chris Ross, and Stephen Haltergit
Kestrel是一个基于libuv的跨平台ASP.NET Core web服务器,libuv是一个跨平台的异步I/O库。ASP.NET Core模板项目使用Kestrel做为默认的web服务器。github
Kestrel支持如下功能:web
Kestrel 被.NET Core支持的全部平台和版本所支持api
若是你的应用只接收来自内部网络的请求,你能够只使用Kestrel自己。服务器
若是你将你的应用部署在公共网络上,咱们建议你使用IIS,Nginx或者Apache做为反向代理服务器。一个反向代理服务器接收来自网络的HTTP请求而且在通过一些初步处理后将请求传递到Kestrel服务器。websocket
出于安全性的理由,反向代理经常被edge deployments所采用。由于Kestrel相对较新,对抵御安全攻击至今尚未一个完整的功能补充。安全性处理包括但不限于适当的超时,大小的限制,以及并发链接限制等问题。网络
另外一个须要反向代理的场景是,你有多个须要在单独的服务器上运行并分享同一端口的应用。由于Kestrel不支持在多进程间分享同一端口,因此应用并不能直接和Kestrel合做。当你在某个端口上配置Kestrel运行侦听时,不算主机头如何标识,Kestrel会为该端口处理全部的流量。反向代理能够为多个应用共享惟一端口并将流量发送给Kestrel。并发
即便不须要反向代理服务器,使用它也能够简化负载均衡和SSL设置 -- 只要你的反向代理服务器须要SSL证书,而且该服务器能够和你的应用在内部网中经过普通HTTP进行通讯。
安装 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; }
默认状况下,ASP.NET Core项目绑定了http://localhost:5000
。经过使用UseUrls
扩展方法——编辑urls
命令行参数,或者是经过ASP.NET Core配置系统,你能够为Ketrel配置URL前缀和端口号以用来侦听请求。关于这些方法更多的信息,请参考Hosting。有关于当你使用IIS做为反向代理时,URL绑定是如何工做的信息,请参考ASP.NET Core 模块。
Kestrel URL前缀能够是如下格式中的任一种。
http://65.55.39.10:80/ https://65.55.39.10:443/
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将记录下一个警告信息。
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>"); }); }
若是你调用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不能在同一端口上被托管。
更多的信息,请参考如下资源:
本教程在本地仅使用Kestrel,在将该应用部署到Azure以后,它将在Windows上使用IIS做为反向代理服务器。