O Kestrel é o servidor web padrão no ASP.NET Core, projetado para ser cross-platform e de alto desempenho. Ele substitui o IIS em cenários onde o suporte a múltiplas plataformas é necessário, rodando nativamente em Windows, macOS e Linux.
Este servidor suporta uma variedade de recursos, incluindo HTTPS, atulaizações opacas para WebSockets, sockets Unix para otimização com proxies reversos como Nginx e HTTP/2 (com exceção de versões atuais do macOS).
Modos de Uso Principal
O Kestrel pode ser utilizado de duas maneirsa principais:
- Como servidor web independente, processando diretamente todas as requisições HTTP.
- Em conjunto com um proxy reverso (como Nginx, Apache ou IIS), onde o proxy recebe as requisições e as encaminha para o Kestrel.
Utilizar um proxy reverso oferece benefícios como expor apenas serviços HTTP limitados, camadas adicionais de segurança e filtragem, balanceamento de carga, redução de custos com firewalls e configuração simplificada de HTTPS, onde apenas o proxy necessita de certificados X.509.
Suporte ao HTTP/2
O Kestrel oferece suporte ao HTTP/2 em sistemas operacionais específicos:
- Windows Server 2016 ou Windows 10 e versões superiores.
- Linux com OpenSSL 1.0.2 ou superior (por exemplo, Ubuntu 16.04+).
- macOS: suporte planejado para versões futuras.
Requer o framework .NET Core 2.2 ou posterior. Detalhes sobre o HTTP/2 podem ser encontrados em recursos como https://http2.github.io/.
Integração no ASP.NET Core
O Kestrel está incluído no pacote Microsoft.AspNetCore.App do ASP.NET Core, eliminando a necessidade de referências adicionais. Em um projeto ASP.NET Core, o arquivo Program.cs configura o host, habilitando implicitamente o Kestrel através de métodos de extensão.
Exemplo de código inicial em um projeto típico:
public class Aplicacao
{
public static void Iniciar(string[] parametros)
{
MontarHost(parametros).Build().Run();
}
public static IHostBuilder MontarHost(string[] parametros) =>
Host.CreateDefaultBuilder(parametros)
.ConfigurarWebPadroes(construtor =>
{
construtor.UseStartup<configuracaopadrao>();
});
}</configuracaopadrao>
Ao investigar a implementação interna de ConfigurarWebPadroes, percebe-se que ele invoca UseKestrel(), confirmando que o Kestrel é o servidor padrão.
Opções de Configuração
O Kestrel pode ser configurado via webBuilder.ConfigurarKestrel, oferecendo diversas opções de limites e comportamentos.
KeepAliveTimeout
Controla o tempo de espera para manter conexões ativas. Padrão: 2 minutos.
configuracao.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(2);
Limites de Conexão
MaxConcurrentConnections define o número máximo de conexões TCP simultâneas. MaxConcurrentUpgradedConnections aplica-se a conexões atualizadas (ex: WebSockets), que não contam para o limite anterior.
configuracao.Limits.MaxConcurrentConnections = 100;
configuracao.Limits.MaxConcurrentUpgradedConnections = 100;
Tamanho Máximo do Corpo da Requisição
Por padrão, é de 30 MB. Em MVC, o atributo RequestSizeLimitAttribute pode sobrescrever isso por ação.
configuracao.Limits.MaxRequestBodySize = 10 * 1024;
[RequestSizeLimit(100000000)]
public IActionResult MinhaAcao()
{
// Lógica da ação
}
Taxas Mínimas de Dados
MinRequestBodyDataRate e MinResponseDataRate estipulam taxas mínimas em bytes/segundo, com períodos de tolerância para evitar desconexões por lentidão inicial.
configuracao.Limits.MinRequestBodyDataRate = new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
configuracao.Limits.MinResponseDataRate = new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
Timeout para Headers
RequestHeadersTimeout define o tempo máximo para receber cabeçalhos de requisição. Padrão: 30 segundos.
configuracao.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(1);
Configurações HTTP/2
Várias opções controlam aspectos do HTTP/2, como fluxos por conexão, tamanhos de tabela de cabeçalho e janelas de transmissão.
configuracao.Limits.Http2.MaxStreamsPerConnection = 100;
configuracao.Limits.Http2.HeaderTableSize = 4096;
configuracao.Limits.Http2.MaxFrameSize = 16384;
configuracao.Limits.Http2.MaxRequestHeaderFieldSize = 8192;
configuracao.Limits.Http2.InitialConnectionWindowSize = 131072;
configuracao.Limits.Http2.InitialStreamWindowSize = 98304;
IO Síncrono
AllowSynchronousIO, quando definido como true, permite operações de IO síncronas, mas deve ser usado com cautela devido a potenciais problemas de desempenho.
configuracao.AllowSynchronousIO = true;