十念 发表于 2024-7-29 04:05:36

.NET core 中的Kestrel 服务器

什么是Kestrel?
Kestrel 是一个跨平台的Web服务器,会默认在ASP.NET Core 项目模板中对其进行设置。未使用 IIS 托管时,ASP.NET Core 项目模板默认使用 Kestrel。
Kestrel 的功能包括:


[*]跨平台:Kestrel 是可在 Windows、Linux 和 macOS 上运行的跨平台 Web 服务器。
[*]高性能:Kestrel 颠末优化,可有效处理大量并发毗连。
[*]轻量级:它颠末优化,可在资源受限的情况(如容器和边沿设备)中运行。
[*]强化了安全性:Kestrel支持 HTTPS 并颠末强化可抵御 Web 服务器漏洞。
[*]宽协议支持:Kestrel 支持常见的 Web 协议,包括:

[*]HTTP/1.1、HTTP/2 和 HTTP/3
[*]WebSockets

[*]与 ASP.NET Core 集成:与其他 ASP.NET Core 组件(比方中间件管道、依靠项注入和设置体系)无缝集成。
[*]机动工作负载:Kestrel 支持许多工作负载:

[*]ASP.NET 应用框架,比方最小 API、MVC、Razor 页、SignalR、Blazor 和 gRPC。
[*]使用 YARP 生成反向代理。

[*]扩展性:通过设置、中间件和自定义传输自定义 Kestrel。
[*]性能诊断:Kestrel 提供内置的性能诊断功能,比方日志记载和指标。

在下面的模板生成的 Program.cs 中,WebApplication.CreateBuilder 方法在内部调用 UseKestrel:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", () => "Hello World!");

app.Run(); 一、终结点设置

ASP.NET Core 项目设置为绑定到 5000-5300 之间的随机 HTTP 端口和 7000-7300 之间的随机 HTTPS 端口。 所选端口存储在生成的 Properties/launchSettings.json 文件中,开发职员可以对其进行修改。 launchSetting.json 文件仅用于当地开发。
如果没有终结点设置,则 Kestrel 绑定到 http://localhost:5000。
https://i-blog.csdnimg.cn/blog_migrate/d29c665fc63302d65532f74cc2a08979.png
在 appsettings.json 中设置终结点

Kestrel 可以从 IConfiguration 实例加载终结点。 默认情况下,Kestrel 设置从 Kestrel 部分加载,终结点在 Kestrel:Endpoints 中设置:
{
"Kestrel": {
    "Endpoints": {
      "MyHttpEndpoint": {
      "Url": "http://localhost:8080"
      }
    }
}
} 上面的示例:


[*]使用 appsettings.json 作为设置源。 但是,可以使用任何 IConfiguration 源。
[*]在端口 8080 上添加名为 MyHttpEndpoint 的终结点。
在代码中设置终结点

KestrelServerOptions 提供用于在代码中设置终结点的方法:


[*]Listen
[*]ListenLocalhost
[*]ListenAnyIP
[*]ListenUnixSocket
[*]ListenNamedPipe
如果同时使用 Listen 和 UseUrls API,Listen 终结点将覆盖 UseUrls 终结点。
Listen、ListenLocalhost 和 ListenAnyIP 方法绑定到 TCP 套接字:
var builder = WebApplication.CreateBuilder(args);

builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
    serverOptions.Listen(IPAddress.Loopback, 5000);
    serverOptions.Listen(IPAddress.Loopback, 5001, listenOptions =>
    {
      listenOptions.UseHttps("testCert.pfx", "testPassword");
    });
}); 上面的示例:


[*]设置侦听端口 5000 和 5001 的终结点。
[*]使用 ListenOptions 上的 UseHttps 扩展方法为终结点设置 HTTPS。 有关具体信息,请参阅在代码中设置 HTTPS。
在 Windows 上,可以使用 New-SelfSignedCertificate PowerShell cmdlet 创建自署名证书。 有关不受支持的示例,请参阅 UpdateIISExpressSSLForChrome.ps1。
在 macOS、Linux 和 Windows 上,可以使用 OpenSSL 创建证书。

二、设置 HTTPS

Kestrel 支持使用 HTTPS 掩护终结点。 通过 HTTPS 发送的数据使用传输层安全性 (TLS) 进行加密,以提高在客户端和服务器之间传输的数据的安全性。
HTTPS 需要 TLS 证书。 TLS 证书存储在服务器上,并将 Kestrel 设置为使用该证书。 应用可以在当地开发情况中使用 ASP.NET Core HTTPS 开发证书。 开发证书未安装在非开发情况中。 在生产情况中,必须显式设置 TLS 证书。 至少必须提供默认证书。
设置 HTTPS 和 TLS 证书的方式取决于终结点的设置方式:


[*]如果 URL 前缀或仅指定端口用于定义终结点,则仅当 HTTPS 终结点设置中提供了默认证书时,才能使用 HTTPS。 可以使用以下选项之一设置默认证书:
[*]在 appsettings.json 中设置 HTTPS
[*]在代码中设置 HTTPS
在 appsettings.json 中设置 HTTPS

Kestrel 可以使用默认 HTTPS 应用设置设置架构。 从磁盘上的文件或从证书存储中设置多个终结点,包括要使用的 URL 和证书。
任何未指定证书的 HTTPS 终结点(下例中的 HttpsDefaultCert)会回退至在 Certificates:Default 下定义的证书或开发证书。
以下示例适用于 appsettings.json,但可以使用任何设置源:
{
"Kestrel": {
    "Endpoints": {
      "Http": {
      "Url": "http://localhost:5000"
      },
      "HttpsDefaultCert": {
      "Url": "https://localhost:5004"
      }
    }
}
} 在代码中设置 HTTPS

上面已经介绍过,使用 Listen API 时,ListenOptions 上的 UseHttps 扩展方法可用于设置 HTTPS。
var builder = WebApplication.CreateBuilder(args);

builder.WebHost.ConfigureKestrel((context, serverOptions) =>
{
    serverOptions.Listen(IPAddress.Loopback, 5000);
    serverOptions.Listen(IPAddress.Loopback, 5001, listenOptions =>
    {
      listenOptions.UseHttps("testCert.pfx", "testPassword");
    });
}); ListenOptions.UseHttps 参数:


[*]filename 是证书文件的路径和文件名,关联包罗应用内容文件的目录。
[*]password 是访问 X.509 证书数据所需的暗码。
[*]configureOptions 是设置 HttpsConnectionAdapterOptions 的 Action。 返回 ListenOptions。
[*]storeName 是从中加载证书的证书存储。
[*]subject 是证书的主题名称。
[*]allowInvalid 指示是否存在需要留意的无效证书,比方自署名证书。
[*]location 是从中加载证书的存储位置。
[*]serverCertificate 是 X.509 证书。
有关 UseHttps 重载的完整列表,请参阅 UseHttps。


三、为Kestrel 服务器设置选项

上面介绍过,要设置 Kestrel 设置选项,可以在 Program.cs 中调用 ConfigureKestrel:
var builder = WebApplication.CreateBuilder(args);

builder.WebHost.ConfigureKestrel(serverOptions =>
{
    // ...
}); 还可以从 appsettings.json 或 appsettings.{Environment}.json 文件设置 Kestrel :
{
"Kestrel": {
    "Limits": {
      "MaxConcurrentConnections": 100,
      "MaxConcurrentUpgradedConnections": 100
    },
    "DisableStringReuse": true
}
} 常用设置:

保持运动状态超时

KeepAliveTimeout 获取或设置保持运动状态超时:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(2);
}); 将调试器附加到 Kestrel 进程时,不会强制实行此超时限制。
客户端最大毗连数

MaxConcurrentConnections 获取或设置最大打开的毗连数:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.MaxConcurrentConnections = 100;
}); MaxConcurrentUpgradedConnections 获取或设置最大打开、升级的毗连数:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
}); 升级的毗连是已从 HTTP 切换到另一个协议(如 WebSocket)的毗连。 毗连升级后,不会计入 MaxConcurrentConnections 限制。
哀求正文最大巨细

MaxRequestBodySize 获取或设置允许的哀求正文的最大巨细(以字节为单位)。
以下示例为所有哀求设置 MaxRequestBodySize:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.MaxRequestBodySize = 100_000_000;
}); 在 ASP.NET Core MVC 应用中替代限制的保举方法是在操作方法上使用 RequestSizeLimitAttribute 属性:

public IActionResult Get() 以下示例在一个自定义中间件中使用 IHttpMaxRequestBodySizeFeature 为特定哀求设置 MaxRequestBodySize:
app.Use(async (context, next) =>
{
    var httpMaxRequestBodySizeFeature = context.Features.Get<IHttpMaxRequestBodySizeFeature>();

    if (httpMaxRequestBodySizeFeature is not null)
      httpMaxRequestBodySizeFeature.MaxRequestBodySize = 10 * 1024;

    // ...

    await next(context);
}); 如果应用在开始读取哀求后实验设置哀求的限制,则会引发异常。 使用 IHttpMaxRequestBodySizeFeature.IsReadOnly 属性检查设置 MaxRequestBodySize 属性是否安全。
哀求正文最小数据速率

Kestrel 每秒检查一次数据是否以指定的速率(字节/秒)传入。 如果速率低于最小值,则毗连超时。宽限期是 Kestrel 允许客户端将其发送速率提升到最小值的时间量。 在此期间不会检查速率。 宽限期有助于制止最初由于 TCP 慢启动而以较慢速率发送数据的毗连停止。 最小速率也适用于相应。
MinRequestBodyDataRate 获取或设置哀求正文的最小数据速率(以字节/秒为单位)。 MinResponseDataRate 获取或设置相应最小数据速率(以字节/秒为单位)。
以下示例为所有哀求设置 MinRequestBodyDataRate 和 MinResponseDataRate:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.MinRequestBodyDataRate = new MinDataRate(
      bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
    serverOptions.Limits.MinResponseDataRate = new MinDataRate(
      bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
}); 哀求标头超时

RequestHeadersTimeout 获取或设置服务器吸收哀求头所需的最大时间量:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(1);
});

HTTP/2 限制

该部分中的限制在 KestrelServerLimits.Http2 上设置。
每个毗连的最大流

MaxStreamsPerConnection 限制每个 HTTP/2 毗连的并发哀求流的数量。 拒绝过多的流:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.MaxStreamsPerConnection = 100;
}); 标题表巨细

HeaderTableSize 限制了服务器上 HPACK 编码器与解码器可以使用的标头压缩表的巨细(以八进制数表现)。 HPACK 解码器为 HTTP/2 毗连解压缩 HTTP 标头:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.HeaderTableSize = 4096;
}); 最大帧巨细

MaxFrameSize 指示允许吸收的最大帧有效负载的巨细(以八进制数表现):
builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.MaxFrameSize = 16_384;
}); 最大哀求标头巨细

MaxRequestHeaderFieldSize 指示哀求头字段序列的最大允许巨细。 此限制适用于名称和值序列的压缩和未压缩表现情势:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.MaxRequestHeaderFieldSize = 8192;
}); 初始毗连窗口巨细

InitialConnectionWindowSize 表现服务器一次愿意吸收和缓冲多少哀求正文数据,这些数据在每个毗连的所有哀求(流)中汇总:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.InitialConnectionWindowSize = 131_072;
}); 哀求也受 InitialStreamWindowSize 限制。
初始流窗口巨细

InitialStreamWindowSize 表现服务器愿意为每个流一次吸收和缓冲多少哀求正文数据:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.InitialStreamWindowSize = 98_304;
}); 哀求也受 InitialConnectionWindowSize 限制。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: .NET core 中的Kestrel 服务器