原文链接

Kestrel是一个基于libuv的跨平台ASP.NET Core web服务器,libuv是一个跨平台的异步I/O库。ASP.NET Core模板项目使用Kestrel作为默认的web服务器。

Kestrel支持以下功能:

  • HTTPS
  • 用于启用不透明升级的WebSockets
  • 位于Nginx之后的高性能Unix sockets

Kestrel 被.NET Core支持的所有平台和版本所支持

查看和下载示例代码

何时一起使用Kestrel和反向代理服务器?

ASP.NET CORE 2.x

你可以单独或者与反向代理服务器(如 IIS, Nginx, or Apache)一起使用Kestrel。反向代理从互联网接受HTTP请求,预处理后转发给Kestrel.

如果Kestrel仅暴露与内网中,有或没有反向代理的配置。

一个需要反向代理的场景是,你有多个需要在一个服务器上运行并共享同一端口的应用。因为Kestrel不支持在多进程间共享同一端口和同一个IP,在此情况下无法工作。当你配置Kestrel监听某个端口时,它会接管所有的流量,而不管主机标头是什么。反向代理可以共享出多个端口,然后转发给Ketrel的唯一IP和端口。

即时反向代理不是必须的,但在某些场景下,使用反向代理是一个更好的选择:

  • 它可以限定你面对的网络区域.
  • 它可以提供多一个附加层,以提供附加的的防护.
  • 它可以更好地与现有架构集成。
  • 使用它也可以简化负载均衡和SSL设置 -- 只要你的反向代理服务器需要SSL证书,并且该服务器可以和你的应用在内部网中通过普通HTTP进行通信。

如何在ASP.NET CORE APP中使用KESTREL

ASP.NET CORE 2.x

Microsoft.AspNetCore.Server.Kestrel 包已经包含在 Microsoft.AspNetCore.All metapackage中.

ASP.NET Core 工程模板缺省使用 Kestrel 。在 Program.cs中, 模板代码为 CreateDefaultBuilder, 它用这句语句调用 UseKestrel :

public static void Main(string[] args)
{
BuildWebHost(args).Run();
} public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseKestrel(options =>
{
options.Listen(IPAddress.Loopback, );
options.Listen(IPAddress.Loopback, , listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testPassword");
});
})
.Build();

如果你要配置Kestrel选项, 请在 Program.cs 如下例所示调用 UseKestrel :

public static void Main(string[] args)
{
BuildWebHost(args).Run();
} public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseKestrel(options =>
{
options.Listen(IPAddress.Loopback, );
options.Listen(IPAddress.Loopback, , listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testPassword");
});
})
.Build();

 Kestrel 选项

Kestrel web server有一些约束选项,做面对互联网的不是时会非常用用。下面是你能设置的一些限制条件:

  • 最大连接客户数
  • 最大请求体大小Maximum request body size
  • 最小请求提数据率Minimum request body data rate

你需要在 KestrelServerOptions 类的Limits属性中设置这些约束 。  Limits 属性控制 KestrelServerLimits 类的实例.

最大连接客户数

参考一下代码:

.UseKestrel(options =>
{
options.Limits.MaxConcurrentConnections = ;
options.Limits.MaxConcurrentUpgradedConnections = ;
options.Limits.MaxRequestBodySize = * ;
options.Limits.MinRequestBodyDataRate =
new MinDataRate(bytesPerSecond: , gracePeriod: TimeSpan.FromSeconds());
options.Limits.MinResponseDataRate =
new MinDataRate(bytesPerSecond: , gracePeriod: TimeSpan.FromSeconds());
options.Listen(IPAddress.Loopback, );
options.Listen(IPAddress.Loopback, , listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testPassword");
});
})

Maximum request body size

缺省值为30,000,000byte, 大约是28.6MB。

在ASP .NET CORE MVC 的APP中,建议在action方法中使用 RequestSizeLimit 属性来重写它:

[RequestSizeLimit()]
public IActionResult MyActionMethod()

下面是一个配置整个应用内每一个请求的Maximum request body size的例子:

.UseKestrel(options =>
{
options.Limits.MaxConcurrentConnections = ;
options.Limits.MaxConcurrentUpgradedConnections = ;
options.Limits.MaxRequestBodySize = * ;
options.Limits.MinRequestBodyDataRate =
new MinDataRate(bytesPerSecond: , gracePeriod: TimeSpan.FromSeconds());
options.Limits.MinResponseDataRate =
new MinDataRate(bytesPerSecond: , gracePeriod: TimeSpan.FromSeconds());
options.Listen(IPAddress.Loopback, );
options.Listen(IPAddress.Loopback, , listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testPassword");
});
})

你也可以在一个中间件中设置特定请求的值:

app.Run(async (context) =>
{
context.Features.Get<IHttpMaxRequestBodySizeFeature>()
.MaxRequestBodySize = *
context.Features.Get<IHttpMinRequestBodyDataRateFeature>()
.MinDataRate = new MinDataRate(bytesPerSecond: , gracePeriod: TimeSpan.FromSeconds());
context.Features.Get<IHttpMinResponseDataRateFeature>()
.MinDataRate = new MinDataRate(bytesPerSecond: , gracePeriod: TimeSpan.FromSeconds());

Kestrel的其他选项,参考下面的类:

 终端配置

ASP.NET CORE 2.x:

  缺省情况下,ASP.NET CORE绑定 http://localhost:5000. 通过在KestrelServerOptions上调用Listen 或者ListenUnixSocket方法可以配置Kestrel监听的URL和端口。(UseUrls, urls命令行参数,ASPNETCORE_URLS环境变量也能工作,定有一些限制,参考这里

 绑定到一个TCP socket

一下,Listen 方法绑定一个TCP socket,  lumbda 选项配置一个SSL验证:

public static void Main(string[] args)
{
BuildWebHost(args).Run();
} public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseKestrel(options =>
{
options.Listen(IPAddress.Loopback, );
options.Listen(IPAddress.Loopback, , listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testPassword");
});
})
.Build();

请注意这个例子是如何用ListenOptions为部分终端配置SSL的。你可以用同一个API为部分终端配置其他Kestrel设置。

在windows系统中,你可以使用PowerShell的命令 New-SelfSignedCertificate生成自签名SLL证书,当然也有其他更好用的第三方工具生成你的自签名证书,如:

在macOS 和 Linux你可以使用 OpenSSL创建自己的自签名证书。更多信息请参考 Setting up HTTPS for development.

绑定到Unix socket

You can listen on a Unix socket for improved performance with Nginx, as shown in this example:

.UseKestrel(options =>
{
options.ListenUnixSocket("/tmp/kestrel-test.sock");
options.ListenUnixSocket("/tmp/kestrel-test.sock", listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testpassword");
});
})

Port 0

如果你指定端口号为0, Kestrel 会动态绑定一个可用的端口.下面的例子显示如何找到Kestrel运行时实际绑定了哪个端口:

public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
{
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>");
});
}

UserUrsl的限制

你可以通过调用UseUrls方法,或者使用urls命令行参数,或者使用ASPNETCORE_URLS环境变量来配置终端。这在你想让你的代码工作于其他服务器而不是KESTREL时很有用。然后,请注意避免下面这些限制:

  • 不能在这些方法中使用SSL
  • 如果你同时使用Listen方法和UseUrls,Listen终端会重写UseUrls终端

IIS的终端配置

如果你使用IIS,绑定到IIS的的URL将重写其他所有通过调用LisrtenorUseUrls设置的绑定。 For more information, see Introduction to ASP.NET Core Module.

URL prefixes

如果你调用UseUrls或使用urls命令行参数或ASPNETCORE_URLS环境变量,URL prefixes可以是以下格式:

ASP.NET CORE 2.x:

仅有HTTP URL prefixes是合法的;当你使用UseUrls配置URL绑定时,Kestrel并不支持SSL。

  • 有小数点的IPv4地址

    Copy
    http://65.55.39.10:80/

    0.0.0.0 is a special case that binds to all IPv4 addresses.

  • 有小数点的IPv6地址

    Copy
    http://[0:0:0:0:0:ffff:4137:270a]:80/

    [::] is the IPv6 equivalent of IPv4 0.0.0.0.

  • 有小数点的主机名

    Copy
    http://contoso.com:80/
    http://*:80/

    Host names, *, and +, are not special. Anything that is not a recognized IP address or "localhost" will bind to all IPv4 and IPv6 IPs. If you need to bind different host names to different ASP.NET Core applications on the same port, use HTTP.sys or a reverse proxy server such as IIS, Nginx, or Apache.

  • 端口地址的"Localhost" 或回调 IP地址

    Copy
    http://localhost:5000/
    http://127.0.0.1:5000/
    http://[::1]:5000/

当指定localhost时,Kestrel会尝试绑定IPV4和IPV6的回调界面。如果请求端口在两个回调界面上都被其他服务使用,Ketrel会启动失败。如果因为其他原因(通常是因为IPV6不被支持)使得两个回调界面都不可用,Kestrel会记录一个报警。

下一步

进一步的信息,请访问以下资源:

ASP.NET CORE 2.x:

ASPNET Core 2.x中的Kestrel服务器的更多相关文章

  1. 【5min+】AspNet Core中的全局异常处理

    系列介绍 [五分钟的dotnet]是一个利用您的碎片化时间来学习和丰富.net知识的博文系列.它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,AspnetCore,微服务中的.net ...

  2. ASPNET Core笔试题

    1.如何在ASP.NET Core中激活Session功能? 首先要添加session包. 其次要在configservice方法里面添加session.然后又在configure方法里面调用 use ...

  3. ASP.NET Core的Kestrel服务器

    原文地址----Kestrel server for ASP.NET Core By Tom Dykstra, Chris Ross, and Stephen Halter Kestrel是一个基于l ...

  4. 【ASP.NET Core】如何隐藏响应头中的 “Kestrel”

    全宇宙人民都知道,ASP.NET Core 应用是不依赖服务器组件的,因此它可以独立运行,一般是使用支持跨平台的 Kestrel 服务器(当然,在 Windows 上还可以考虑用 HttpSys,但要 ...

  5. AspNet Core 下利用普罗米修斯+Grafana构建Metrics和服务器性能的监控 (无心打造文字不喜勿喷谢谢!)

    概述 Prometheus的主要特点 组件 结构图 适用场景 不适用场景 安装node_exporter,系统性能指数收集(收集系统性能情况) 下载文件 解压并复制node_exporter应用程序到 ...

  6. [转帖]ASP.NET Core的Kestrel服务器

    ASP.NET Core的Kestrel服务器 https://cloud.tencent.com/developer/article/1023247 在这篇文章中: 何时使用Kestrel和反向代理 ...

  7. ASP.NET Core的Kestrel服务器(转载)

    Kestrel是一个基于libuv的跨平台ASP.NET Core web服务器,libuv是一个跨平台的异步I/O库.ASP.NET Core模板项目使用Kestrel作为默认的web服务器.Kes ...

  8. [转] ASPNET Core 中获取应用程序物理路径

    如果要得到传统的ASP.Net应用程序中的相对路径或虚拟路径对应的服务器物理路径,只需要使用使用Server.MapPath()方法来取得Asp.Net根目录的物理路径,如下所示: // Classi ...

  9. ASP.NET Core技术研究-全面认识Web服务器Kestrel

    因为IIS不支持跨平台的原因,我们在升级到ASP.NET Core后,会接触到一个新的Web服务器Kestrel.相信大家刚接触这个Kestrel时,会有各种各样的疑问. 今天我们全面认识一下ASP. ...

随机推荐

  1. Canvas动画按钮

    在线演示 本地下载

  2. 搭建LoadRunner中的场景(三)场景的执行计划

    所谓场景操作,包括初始化用户组.启动用户组各用户以及停止虚拟用户的全过程.依据设置不同,执行过程中可以最多有5类操作,分别是启动用户组(start group).初始化(Initialize).启动虚 ...

  3. firfox 和 chrome 移动端Web开发页面调试

    Firefox浏览: 1."Alt+t" 选择工具栏中的“工具”>Web开发者工具>查看器>点击红框所指的地方 或者 F12 [当然这个歌前提是你没有安装fire ...

  4. listen 63

    Danger Explainers Convince Kids Better Than Do Edict Issuers An eight-year-old may view a hammer as ...

  5. Python 微信通知 先挖个坑

    桑心病狂,试试把报警信息发到微信上 原文  https://segmentfault.com/a/1190000009717078  

  6. (转)[sh] <defunct>进程

    我也碰到僵尸进程了,必须通过关闭僵尸进程的父进程或者重启解决. 来自:http://jerrybear.blog.51cto.com/629421/387846 今日发现服务器上多了一些名称为[sh] ...

  7. HDU-6035:Colorful Tree(虚树+DP)

    这里有三道长得像的题: 一:HDU6036: There is a tree with nn nodes, each of which has a type of color represented ...

  8. kettle及数据库导数_20160920

    一.kettle是什么. Kettle是一款国外开源的ETL( Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取(extract).转换(transform).加载 ...

  9. spring-data详解之spring-data-jpa:简单三步快速上手spring-data-jpa开发

    前言: 基于spring framework 4.x或spring boot 1.x开发环境 务必注意以下版本问题:Spring framework4.x(Spring boot1.x)对应sprin ...

  10. 有趣的Javascript:只需一个JS让万恶的IE5、IE6、IE7、IE8全都支持H5原生Canvas绘图(有演示demo)

    该demo支持IE5以上任意内核的浏览器 查看演示demo:支持IE5以上版本的浏览器Canvas绘图demo 补充:chats.js和echarts等图表库也可以使用本方法兼容IE6以上浏览器 1. ...