Kestrel: O Servidor Web do ASP.NET Core em Detalhes

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;

Tags: ASP.NET Core Kestrel Servidor Web HTTP/2 Proxy Reverso

Publicado em 6-6 20:01 por Thomas