Giriş
Kestrel, ASP.NET Core uygulamalarının varsayılan ve önerilen web sunucusudur; doğru yapılandırıldığında düşük gecikme, yüksek throughput ve modern protokollerle üretimde sağlam bir temel sunar. Bu rehber, .NET 8/9 hedefli Kestrel ince ayarlarını; Thread Pool, Socket/protokol seçimi ve HTTP/2–3 yapılandırmalarına odaklanarak pratik ve ölçülebilir önerilerle sunar.
Kestrel temelleri ve sınırlar
KestrelServerOptions ile Limits, endpoint ve HTTPS varsayılanları koddan veya yapılandırmadan yönetilebilir. Üretimde MaxConcurrentConnections, MaxRequestBodySize, RequestHeadersTimeout gibi limitler ayarlanarak kötü niyetli trafiğe ve beklenmedik yük dalgalarına karşı savunma hattı oluşturulur. appsettings üzerinden Kestrel bölümünü bağlamak, ortam bazlı farklı profillerle güvenli denemeyi kolaylaştırır.
-
Mini özet: Önce sınırlamaları belirle; sonra endpoint ve protokol seçeneklerini iş yüküne göre aç.
HTTP/1.1, HTTP/2 ve HTTP/3 seçimi
- HTTP/1.1: Geniş uyumluluk; basit sistemler ve klasik web yükleri için yeterli.
- HTTP/2: Başlık sıkıştırma, çoklama (multiplexing) ve daha verimli bağlantı kullanımı; gRPC için gerekli.
- HTTP/3 (QUIC): UDP tabanlı, baştan bağlantı göçü ve yüksek gecikmeli ağlarda avantaj; ancak operasyonel gözlemcilik ve ağ altyapısı olgunluğunu gerektirir.
Pratik öneri: Sadece ihtiyacı olan endpoint’lerde HTTP/2/3’ü aç; hepsini her yerde aktif etmek yerine hedefli etkinleştir. - Mini özet: Protokolleri işlev bazlı seç; gRPC ve yüksek eşzamanlılık için HTTP/2, zorlu ağlar için HTTP/3.
Sockets ve bağlantı yaşam döngüsü
Kestrel, IP/port bazlı Listen yapılandırmaları ve Unix domain socket desteği ile esnektir. .UseHttps ile TLS ayarlarını merkezîleştir; TLS sürümlerini (ör. TLS 1.2/1.3) ve sertifika rotasyonunu otomasyona bağla. Keep-alive ve idle timeout’lar, aşırı kaynak tüketimini önleyerek thread ve soket basıncını azaltır.
-
Mini özet: TLS, keep-alive ve timeout’ları netleştir; SO_REUSEPORT gibi gelişmiş ayarlar platforma göre değerlendir.
Thread Pool ve backpressure
ASP.NET Core istek işleme .NET ThreadPool üzerine oturur; aşırı paralellik, GC basıncı ve context switching maliyetlerini artırabilir. Hedef, kuyruklanmayı kabul edilebilir seviyede tutup thread havuzunu aşırı genişletmeden gecikmeyi optimize etmektir. CPU-bound işler için Task.Run yerine asenkron I/O tercih edin; uzun süren CPU işler için arka plan işleyicileri ve kuyruklar (Channel, Queue) kullanın.
-
Mini özet: IO-bound akışta async/await ve minimal senkron blok; CPU-bound yükleri web istek hattından ayır.
Timeout, limit ve boyut politikaları
- RequestHeadersTimeout: Yavaş başlık saldırılarına karşı koruma.
- MaxRequestBodySize: Büyük yükler için endpoint bazlı esnet, genel varsayılanı düşük tut.
- Min/MaxResponseDataRate: Aşırı yavaş istemcileri dışarıda bırakmaya yardımcı olabilir.
- MaxConcurrentConnections ve MaxConcurrentUpgradedConnections: WebSocket/SSE gibi yükseltilmiş bağlantıları dengele.
- Mini özet: Limitler “fail-fast” davranışı sağlar; SLO’lara göre ölçüp ayarla.
HTTP/2-3 spesifik ayarlar
- HTTP/2: Akış (stream) başına limitler, başlık sıkıştırması ve bağlantı başına eşzamanlı akış sayısı.
- HTTP/3: QUIC için UDP/443, firewall/Load Balancer uyumluluğu ve gözlemlenebilirlik (metrics, logs) kritik.
gRPC için HTTP/2 zorunlu; HTTP/3 desteği aşamalı rollout ile test edilmelidir. - Mini özet: gRPC’de HTTP/2 sabit; HTTP/3’ü canary ile doğrula.
Reverse proxy ve topoloji
Üretimde genellikle Nginx/Apache/Envoy gibi reverse proxy arkasında Kestrel kullanılır; TLS sonlandırma, gzip/brotli, caching ve istek başlıklarının standardizasyonu burada ele alınabilir. Proxy arkası dağıtımlarda X-Forwarded-* başlıklarını doğrula ve KnownProxies/Networks ayarlarını yapılandır.
-
Mini özet: Reverse proxy, güvenlik ve performans ayarlarını sadeleştirir; başlık güvenliği ve kaynak sınırlarına dikkat.
Gözlemlenebilirlik ve tuning döngüsü
OpenTelemetry ile istek gecikmesi, hata oranı, throughput ve bağlantı/yaygın 4 altın sinyal izlenmeli. K6/JMeter ile yük profilleri (peak/soak/stress) hazırlanıp, her tuning sonrası tekrar ölçülmeli. Hedef, “ölç-uygula-doğrula” döngüsünü CI/CD’ye entegre etmek.
-
Mini özet: Ölçüm olmadan tuning yok; telemetry verisiyle ayarla.
Karşılaştırma tablosu
| Konu | Varsayılan/Öneri | Not |
|---|---|---|
| Protokoller | HTTP/1.1 + hedefli HTTP/2 | gRPC için HTTP/2 şart |
| HTTP/3 | Canary ile kademeli | Ağ ve LB olgunluğu önemli |
| Timeout’lar | Sıkı (headers/body) | Yavaş istemciyi erken kapat |
| Limits | İhtiyaca göre artır | “Fail-fast” stratejisi |
| TLS | 1.2/1.3 | Sertifika rotasyonu otomasyon |
| Reverse proxy | Önerilir | X-Forwarded ve KnownProxies |
Kod Örnekleri (C#, CLI)
-
appsettings.json (Kestrel kesiti):
{
"Kestrel": {
"Limits": {
"MaxConcurrentConnections": 5000,
"RequestHeadersTimeout": "00:00:10",
"MaxRequestBodySize": 10485760
},
"EndpointDefaults": {
"Protocols": "Http1AndHttp2"
},
"Endpoints": {
"Http": { "Url": "http://0.0.0.0:8080" },
"Https": {
"Url": "https://0.0.0.0:8443",
"Protocols": "Http1AndHttp2"
}
}
}
}
-
Program.cs’de Kestrel bağlama ve HTTPS varsayılanı:
using Microsoft.AspNetCore.Server.Kestrel.Core;
var builder = WebApplication.CreateBuilder(args);
// appsettings'den Kestrel kesitini yükle
builder.WebHost.ConfigureKestrel((context, options) =>
{
options.Configure(context.Configuration.GetSection("Kestrel"));
// HTTPS varsayılanları
options.ConfigureHttpsDefaults(https =>
{
// Örnek: TLS sürümleri ve sertifika seçimi burada yapılabilir
// https.SslProtocols = System.Security.Authentication.SslProtocols.Tls12 | System.Security.Authentication.SslProtocols.Tls13;
});
// Endpoint varsayılanları
options.ConfigureEndpointDefaults(listen =>
{
// Örnek: Altyapısal ayarlar
// listen.NoDelay = true; // TCP Nagle kapatma
});
});
// HTTP/3 (canary) örneği: yalnızca belirli endpoint’te
builder.WebHost.ConfigureKestrel(options =>
{
options.ListenAnyIP(8443, listen =>
{
listen.UseHttps();
#if NET9_0_OR_GREATER
listen.Protocols = HttpProtocols.Http3; // .NET 9+ için
#endif
});
});
var app = builder.Build();
app.MapGet("/", () => "OK");
app.Run();
-
dotnet CLI:
dotnet dev-certs https --trust
dotnet run --urls "http://0.0.0.0:8080;https://0.0.0.0:8443"
Sonuç + Check-list
- Limits: Headers/body timeout ve boyut limitleri tanımlı mı?
- Protokoller: gRPC için HTTP/2, HTTP/3 canary mi?
- TLS: 1.2/1.3 politikası ve sertifika rotasyonu otomatik mi?
- Threading: IO-bound akışta async; CPU işlerini kuyruğa/arka plana taşıdın mı?
- Observability: P95/P99 gecikme, hata oranı ve bağlantı metrikleri izleniyor mu?
SSS
- HTTP/3’ü hemen açmalı mıyım?
Canary ve A/B ile kademeli geçiş önerilir; LB/firewall uyumluluğu ve gözlemlenebilirlik olgunluğu şarttır. - gRPC için hangi protokol?
HTTP/2 zorunlu; HTTP/3 desteği istemci/sunucu uyumuna bağlı olarak aşamalı denenmelidir. - Limits neden önemli?
Kaynak tüketimini kontrol eder, saldırı yüzeyini daraltır ve SLO ihlallerini azaltır. - ThreadPool’u elle ayarlamalı mıyım?
Genellikle hayır; asenkron I/O ve doğru timeout/limitlerle kuyruk yönetimi daha etkilidir.