什么是Kestrel?
Kestrel 是一個(gè)跨平臺的Web服務(wù)器,會(huì)默認(rèn)在ASP.NET Core 項(xiàng)目模板中對其進(jìn)行配置。未使用 IIS 托管時(shí),ASP.NET Core 項(xiàng)目模板默認(rèn)使用 Kestrel。
Kestrel 的功能包括:
- 跨平臺:Kestrel 是可在 Windows、Linux 和 macOS 上運(yùn)行的跨平臺 Web 服務(wù)器。
- 高性能:Kestrel 經(jīng)過優(yōu)化,可有效處理大量并發(fā)連接。
- 輕量級:它經(jīng)過優(yōu)化,可在資源受限的環(huán)境(如容器和邊緣設(shè)備)中運(yùn)行。
- 強(qiáng)化了安全性:Kestrel支持 HTTPS 并經(jīng)過強(qiáng)化可抵御 Web 服務(wù)器漏洞。
-
寬協(xié)議支持:Kestrel 支持常見的 Web 協(xié)議,包括:
- HTTP/1.1、HTTP/2?和?HTTP/3
- WebSockets
- 與 ASP.NET Core 集成:與其他 ASP.NET Core 組件(例如中間件管道、依賴項(xiàng)注入和配置系統(tǒng))無縫集成。
-
靈活工作負(fù)載:Kestrel 支持許多工作負(fù)載:
- ASP.NET 應(yīng)用框架,例如最小 API、MVC、Razor 頁、SignalR、Blazor 和 gRPC。
- 使用?YARP?生成反向代理。
- 擴(kuò)展性:通過配置、中間件和自定義傳輸自定義 Kestrel。
- 性能診斷:Kestrel 提供內(nèi)置的性能診斷功能,例如日志記錄和指標(biāo)。
在下面的模板生成的?Program.cs
?中,WebApplication.CreateBuilder?方法在內(nèi)部調(diào)用?UseKestrel:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();
一、終結(jié)點(diǎn)配置
ASP.NET Core 項(xiàng)目配置為綁定到 5000-5300 之間的隨機(jī) HTTP 端口和 7000-7300 之間的隨機(jī) HTTPS 端口。 所選端口存儲在生成的?Properties/launchSettings.json
?文件中,開發(fā)人員可以對其進(jìn)行修改。?launchSetting.json
?文件僅用于本地開發(fā)。
如果沒有終結(jié)點(diǎn)配置,則 Kestrel 綁定到?http://localhost:5000
。
在 appsettings.json 中配置終結(jié)點(diǎn)
Kestrel 可以從?IConfiguration?實(shí)例加載終結(jié)點(diǎn)。 默認(rèn)情況下,Kestrel 配置從?Kestrel
?部分加載,終結(jié)點(diǎn)在?Kestrel:Endpoints
?中配置:
{
"Kestrel": {
"Endpoints": {
"MyHttpEndpoint": {
"Url": "http://localhost:8080"
}
}
}
}
上面的示例:
- 使用?
appsettings.json
?作為配置源。 但是,可以使用任何?IConfiguration
?源。 - 在端口 8080 上添加名為?
MyHttpEndpoint
?的終結(jié)點(diǎn)。
在代碼中配置終結(jié)點(diǎn)
KestrelServerOptions?提供用于在代碼中配置終結(jié)點(diǎn)的方法:
- Listen
- ListenLocalhost
- ListenAnyIP
- ListenUnixSocket
- ListenNamedPipe
如果同時(shí)使用?Listen
?和?UseUrls?API,Listen
?終結(jié)點(diǎn)將覆蓋?UseUrls
?終結(jié)點(diǎn)。
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 的終結(jié)點(diǎn)。
- 使用?ListenOptions?上的?UseHttps?擴(kuò)展方法為終結(jié)點(diǎn)配置 HTTPS。 有關(guān)詳細(xì)信息,請參閱在代碼中配置 HTTPS。
在 Windows 上,可以使用?New-SelfSignedCertificate?PowerShell cmdlet?創(chuàng)建自簽名證書。 有關(guān)不受支持的示例,請參閱?UpdateIISExpressSSLForChrome.ps1。
在 macOS、Linux 和 Windows 上,可以使用?OpenSSL?創(chuàng)建證書。
二、配置 HTTPS
Kestrel 支持使用 HTTPS 保護(hù)終結(jié)點(diǎn)。 通過 HTTPS 發(fā)送的數(shù)據(jù)使用傳輸層安全性 (TLS)?進(jìn)行加密,以提高在客戶端和服務(wù)器之間傳輸?shù)臄?shù)據(jù)的安全性。
HTTPS 需要 TLS 證書。 TLS 證書存儲在服務(wù)器上,并將 Kestrel 配置為使用該證書。 應(yīng)用可以在本地開發(fā)環(huán)境中使用?ASP.NET Core HTTPS 開發(fā)證書。 開發(fā)證書未安裝在非開發(fā)環(huán)境中。 在生產(chǎn)環(huán)境中,必須顯式配置 TLS 證書。 至少必須提供默認(rèn)證書。
配置 HTTPS 和 TLS 證書的方式取決于終結(jié)點(diǎn)的配置方式:
- 如果?URL 前綴或僅指定端口用于定義終結(jié)點(diǎn),則僅當(dāng) HTTPS 終結(jié)點(diǎn)配置中提供了默認(rèn)證書時(shí),才能使用 HTTPS。 可以使用以下選項(xiàng)之一配置默認(rèn)證書:
- 在 appsettings.json 中配置 HTTPS
- 在代碼中配置 HTTPS
在 appsettings.json 中配置 HTTPS
Kestrel 可以使用默認(rèn) HTTPS 應(yīng)用設(shè)置配置架構(gòu)。 從磁盤上的文件或從證書存儲中配置多個(gè)終結(jié)點(diǎn),包括要使用的 URL 和證書。
任何未指定證書的 HTTPS 終結(jié)點(diǎn)(下例中的?HttpsDefaultCert
)會(huì)回退至在?Certificates:Default
?下定義的證書或開發(fā)證書。
以下示例適用于?appsettings.json
,但可以使用任何配置源:
{
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://localhost:5000"
},
"HttpsDefaultCert": {
"Url": "https://localhost:5004"
}
}
}
}
在代碼中配置 HTTPS
上面已經(jīng)介紹過,使用?Listen
?API 時(shí),ListenOptions?上的?UseHttps?擴(kuò)展方法可用于配置 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
?參數(shù):
-
filename
?是證書文件的路徑和文件名,關(guān)聯(lián)包含應(yīng)用內(nèi)容文件的目錄。 -
password
?是訪問 X.509 證書數(shù)據(jù)所需的密碼。 -
configureOptions
?是配置?HttpsConnectionAdapterOptions
?的?Action
。 返回?ListenOptions
。 -
storeName
?是從中加載證書的證書存儲。 -
subject
?是證書的主題名稱。 -
allowInvalid
?指示是否存在需要留意的無效證書,例如自簽名證書。 -
location
?是從中加載證書的存儲位置。 -
serverCertificate
?是 X.509 證書。
有關(guān)?UseHttps
?重載的完整列表,請參閱?UseHttps。
三、為Kestrel 服務(wù)器配置選項(xiàng)
上面介紹過,要配置 Kestrel 配置選項(xiàng),可以在?Program.cs
?中調(diào)用?ConfigureKestrel:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
// ...
});
還可以從?appsettings.json
?或?appsettings.{Environment}.json
?文件配置?Kestrel :
{
"Kestrel": {
"Limits": {
"MaxConcurrentConnections": 100,
"MaxConcurrentUpgradedConnections": 100
},
"DisableStringReuse": true
}
}
常用配置:
保持活動(dòng)狀態(tài)超時(shí)
KeepAliveTimeout?獲取或設(shè)置保持活動(dòng)狀態(tài)超時(shí):
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(2);
});
將調(diào)試器附加到 Kestrel 進(jìn)程時(shí),不會(huì)強(qiáng)制實(shí)施此超時(shí)限制。
客戶端最大連接數(shù)
MaxConcurrentConnections?獲取或設(shè)置最大打開的連接數(shù):
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.MaxConcurrentConnections = 100;
});
MaxConcurrentUpgradedConnections?獲取或設(shè)置最大打開、升級的連接數(shù):
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
});
升級的連接是已從 HTTP 切換到另一個(gè)協(xié)議(如 WebSocket)的連接。 連接升級后,不會(huì)計(jì)入?MaxConcurrentConnections
?限制。
請求正文最大大小
MaxRequestBodySize?獲取或設(shè)置允許的請求正文的最大大小(以字節(jié)為單位)。
以下示例為所有請求配置?MaxRequestBodySize
:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.MaxRequestBodySize = 100_000_000;
});
在 ASP.NET Core MVC 應(yīng)用中替代限制的推薦方法是在操作方法上使用?RequestSizeLimitAttribute?屬性:
[RequestSizeLimit(100_000_000)]
public IActionResult Get()
以下示例在一個(gè)自定義中間件中使用?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);
});
如果應(yīng)用在開始讀取請求后嘗試配置請求的限制,則會(huì)引發(fā)異常。 使用?IHttpMaxRequestBodySizeFeature.IsReadOnly?屬性檢查設(shè)置?MaxRequestBodySize
?屬性是否安全。
請求正文最小數(shù)據(jù)速率
Kestrel 每秒檢查一次數(shù)據(jù)是否以指定的速率(字節(jié)/秒)傳入。 如果速率低于最小值,則連接超時(shí)。寬限期是 Kestrel 允許客戶端將其發(fā)送速率提升到最小值的時(shí)間量。 在此期間不會(huì)檢查速率。 寬限期有助于避免最初由于 TCP 慢啟動(dòng)而以較慢速率發(fā)送數(shù)據(jù)的連接中斷。 最小速率也適用于響應(yīng)。
MinRequestBodyDataRate?獲取或設(shè)置請求正文的最小數(shù)據(jù)速率(以字節(jié)/秒為單位)。?MinResponseDataRate?獲取或設(shè)置響應(yīng)最小數(shù)據(jù)速率(以字節(jié)/秒為單位)。
以下示例為所有請求配置?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));
});
請求標(biāo)頭超時(shí)
RequestHeadersTimeout?獲取或設(shè)置服務(wù)器接收請求頭所需的最大時(shí)間量:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(1);
});
HTTP/2 限制
該部分中的限制在?KestrelServerLimits.Http2?上設(shè)置。
每個(gè)連接的最大流
MaxStreamsPerConnection?限制每個(gè) HTTP/2 連接的并發(fā)請求流的數(shù)量。 拒絕過多的流:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.MaxStreamsPerConnection = 100;
});
標(biāo)題表大小
HeaderTableSize?限制了服務(wù)器上 HPACK 編碼器與解碼器可以使用的標(biāo)頭壓縮表的大小(以八進(jìn)制數(shù)表示)。 HPACK 解碼器為 HTTP/2 連接解壓縮 HTTP 標(biāo)頭:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.HeaderTableSize = 4096;
});
最大幀大小
MaxFrameSize?指示允許接收的最大幀有效負(fù)載的大?。ㄒ园诉M(jìn)制數(shù)表示):
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.MaxFrameSize = 16_384;
});
最大請求標(biāo)頭大小
MaxRequestHeaderFieldSize?指示請求頭字段序列的最大允許大小。 此限制適用于名稱和值序列的壓縮和未壓縮表示形式:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.MaxRequestHeaderFieldSize = 8192;
});
初始連接窗口大小
InitialConnectionWindowSize?表示服務(wù)器一次愿意接收和緩沖多少請求正文數(shù)據(jù),這些數(shù)據(jù)在每個(gè)連接的所有請求(流)中匯總:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.InitialConnectionWindowSize = 131_072;
});
請求也受?InitialStreamWindowSize?限制。
初始流窗口大小
InitialStreamWindowSize?表示服務(wù)器愿意為每個(gè)流一次接收和緩沖多少請求正文數(shù)據(jù):文章來源:http://www.zghlxwxcb.cn/news/detail-839127.html
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.InitialStreamWindowSize = 98_304;
});
請求也受?InitialConnectionWindowSize?限制。文章來源地址http://www.zghlxwxcb.cn/news/detail-839127.html
到了這里,關(guān)于.NET core 中的Kestrel 服務(wù)器的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!