ASPNET Core 2.x中的Kestrel服务器
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地址
Copyhttp://65.55.39.10:80/
0.0.0.0 is a special case that binds to all IPv4 addresses.
有小数点的IPv6地址
Copyhttp://[0:0:0:0:0:ffff:4137:270a]:80/
[::] is the IPv6 equivalent of IPv4 0.0.0.0.
有小数点的主机名
Copyhttp://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地址
Copyhttp://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服务器的更多相关文章
- 【5min+】AspNet Core中的全局异常处理
系列介绍 [五分钟的dotnet]是一个利用您的碎片化时间来学习和丰富.net知识的博文系列.它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,AspnetCore,微服务中的.net ...
- ASPNET Core笔试题
1.如何在ASP.NET Core中激活Session功能? 首先要添加session包. 其次要在configservice方法里面添加session.然后又在configure方法里面调用 use ...
- ASP.NET Core的Kestrel服务器
原文地址----Kestrel server for ASP.NET Core By Tom Dykstra, Chris Ross, and Stephen Halter Kestrel是一个基于l ...
- 【ASP.NET Core】如何隐藏响应头中的 “Kestrel”
全宇宙人民都知道,ASP.NET Core 应用是不依赖服务器组件的,因此它可以独立运行,一般是使用支持跨平台的 Kestrel 服务器(当然,在 Windows 上还可以考虑用 HttpSys,但要 ...
- AspNet Core 下利用普罗米修斯+Grafana构建Metrics和服务器性能的监控 (无心打造文字不喜勿喷谢谢!)
概述 Prometheus的主要特点 组件 结构图 适用场景 不适用场景 安装node_exporter,系统性能指数收集(收集系统性能情况) 下载文件 解压并复制node_exporter应用程序到 ...
- [转帖]ASP.NET Core的Kestrel服务器
ASP.NET Core的Kestrel服务器 https://cloud.tencent.com/developer/article/1023247 在这篇文章中: 何时使用Kestrel和反向代理 ...
- ASP.NET Core的Kestrel服务器(转载)
Kestrel是一个基于libuv的跨平台ASP.NET Core web服务器,libuv是一个跨平台的异步I/O库.ASP.NET Core模板项目使用Kestrel作为默认的web服务器.Kes ...
- [转] ASPNET Core 中获取应用程序物理路径
如果要得到传统的ASP.Net应用程序中的相对路径或虚拟路径对应的服务器物理路径,只需要使用使用Server.MapPath()方法来取得Asp.Net根目录的物理路径,如下所示: // Classi ...
- ASP.NET Core技术研究-全面认识Web服务器Kestrel
因为IIS不支持跨平台的原因,我们在升级到ASP.NET Core后,会接触到一个新的Web服务器Kestrel.相信大家刚接触这个Kestrel时,会有各种各样的疑问. 今天我们全面认识一下ASP. ...
随机推荐
- 升级GCC 6.2编译LLVM的问题
[ 55%] Built target RTInterception.x86_64 [ 55%] Building ASM object projects/compiler-rt/lib/saniti ...
- SDUT OJ 1479 数据结构实验之栈:行编辑器
数据结构实验之栈:行编辑器 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 一个简单的行编辑程序的功能是:接受用户从终端输入的程 ...
- haproxy 修改 访问路径
# 匹配 jsessionid,并去除 jessionid参数reqrep ^([^\ :]*)\ /a/test.html;jsessionid=.*\?(.*) \1\ /b/test.html? ...
- npm使用淘宝镜像安装包
npm使用registry这个属性指定仓库,因此配置这个属性即可.修改npm配置属性的几种方法详见官方文档. 这里只贴出修改registry的方法,以下三种任意一种即可: 修改~/.npmrc文件(没 ...
- hdu-5656 CA Loves GCD(dp+数论)
题目链接: CA Loves GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Ot ...
- dmidecode 命令
dmidecode # 查看全面硬件信息dmidecode | grep "Product ...
- BZOJ - 2553 :禁忌(AC自动机+贪心+奇怪的矩阵)
Magic Land上的人们总是提起那个传说:他们的祖先John在那个东方岛屿帮助Koishi与其姐姐Satori最终战平.而后,Koishi恢复了读心的能力…… 如今,在John已经成为传说的时代, ...
- JVM endianness
JVM endianness StackOverflow topic to summarize JVM class file is big-endian; JVM multi-byte instruc ...
- Linux 下安装配置 JDK7(2)
Linux 下安装配置 JDK7 自从从Oracle收购Sun近三年来,已经有很多变化.早在8月,甲骨文将"Operating System Distributor License for ...
- 《Java多线程编程核心技术》读后感(十六)
线程组 线程组的作用是,可以批量的管理线程或线程组对象,有效地对线程或线程组对象进行组织 线程对象关联线程组:1级关联 package Seven; public class ThreadA exte ...