재우니의 블로그

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel

Kestrel은 크로스 플랫폼 비동기식 I / O 라이브러리 인 libuv를 기반으로 한 ASP.NET 코어 용 크로스 플랫폼 웹 서버입니다 . Kestrel은 기본적으로 ASP.NET 핵심 새 프로젝트 템플릿에 포함 된 웹 서버입니다.

Kestrel은 다음과 같은 기능을 지원합니다.

  • HTTPS
  • WebSocket 을 활성화하는 데 사용되는 불투명 한 업그레이드
  • Nginx 뒤에 고성능을위한 유닉스 소켓

Kestrel은 .NET Core가 지원하는 모든 플랫폼 및 버전에서 지원됩니다.

샘플 코드보기 또는 다운로드

Kestrel을 역 프록시와 함께 사용하는 경우

응용 프로그램이 내부 네트워크의 요청 만 수락하면 Kestrel을 단독으로 사용할 수 있습니다.

내부 네트워크에 대한 Kestrel1

응용 프로그램을 인터넷에 노출하는 경우 IIS, Nginx 또는 Apache를 역방향 프록시 서버 로 사용해야 합니다 . 역방향 프록시 서버는 인터넷에서 HTTP 요청을 수신하여 사전 처리 한 후 Kestrel로 전달합니다.

인터넷에 대한 Kestrel

보안상의 이유로 에지 배포 (인터넷 트래픽에 노출됨)에는 역방향 프록시가 필요합니다. Kestrel은 비교적 새롭고 공격에 대한 방어책을 아직 완전히 갖추고 있지 않습니다. 여기에는 적절한 제한 시간, 크기 제한 및 동시 연결 제한이 포함되지만 이에 국한되지는 않습니다.

역방향 프록시가 필요한 또 다른 시나리오는 단일 서버에서 동일한 포트를 공유하는 여러 응용 프로그램이있는 경우입니다. Kestrel은 여러 프로세스간에 포트 공유를 지원하지 않기 때문에 Kestrel에서는 직접 작동하지 않습니다. Kestrel을 포트에서 청취하도록 구성하면 호스트 헤더와 상관없이 해당 포트의 모든 트래픽을 처리합니다. 포트를 공유 할 수있는 리버스 프록시는 고유 한 포트에서 Kestrel로 전달해야합니다.

역방향 프록시 서버가 필요하지 않더라도로드 균형 조정과 SSL 설정을 단순화 할 수 있습니다. 역방향 프록시 서버에만 SSL 인증서가 필요하며 해당 서버는 일반 HTTP를 사용하여 내부 네트워크의 응용 프로그램 서버와 통신 할 수 있습니다 .2

Kestrel을 ASP.NET 핵심 응용 프로그램에서 사용하는 방법

Microsoft.AspNetCore.Server.Kestrel NuGet 패키지를 설치하십시오 .

다음 예제와 같이 필요한 Kestrel 옵션 을 지정 하여 메서드 에서 UseKestrel확장 메서드를 호출합니다 .WebHostBuilderMain

기음#
public static int Main(string[] args)
{
    Console.WriteLine("Running demo with Kestrel.");

    var config = new ConfigurationBuilder()
        .AddCommandLine(args)
        .Build();

    var builder = new WebHostBuilder()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseConfiguration(config)
        .UseStartup<Startup>()
        .UseKestrel(options =>
        {
            if (config["threadCount"] != null)
            {
                options.ThreadCount = int.Parse(config["threadCount"]);
            }
        })
        .UseUrls("http://localhost:5000");

    var host = builder.Build();
    host.Run();

    return 0;
}

URL 접두사

기본적으로 ASP.NET Core는에 바인딩됩니다 http://localhost:5000. Kestrel이 UseUrls확장 메서드, urls명령 줄 인수 또는 ASP.NET 핵심 구성 시스템 을 사용하여 수신 대기하도록 URL 접두사 및 포트를 구성 할 수 있습니다 . 이러한 방법에 대한 자세한 내용은 호스팅을 참조하십시오 . IIS를 역방향 프록시로 사용할 때 URL 바인딩이 작동하는 방법에 대한 자세한 내용은 ASP.NET 핵심 모듈을 참조하십시오 .

Kestrel의 URL 접두사는 다음 형식 중 하나 일 수 있습니다.

  • 포트 번호가있는 IPv4 주소

    http://65.55.39.10:80/
    https://65.55.39.10:443/
    

    0.0.0.0은 모든 IPv4 주소에 바인딩되는 특수한 경우입니다.

  • 포트 번호가있는 IPv6 주소

    http://[0:0:0:0:0:ffff:4137:270a]:80/ 
    https://[0:0:0:0:0:ffff:4137:270a]:443/ 
    

    [::]는 IPv4 0.0.0.0에 해당하는 IPv6입니다.

  • 포트 번호가있는 호스트 이름

    http://contoso.com:80/
    http://*:80/
    https://contoso.com:443/
    https://*:443/
    

    호스트 이름, * 및 +는 특별하지 않습니다. 인식 된 IP 주소 또는 "localhost"가 아닌 것은 모든 IPv4 및 IPv6 IP에 바인딩됩니다. 같은 포트의 다른 ASP.NET 코어 응용 프로그램에 다른 호스트 이름을 바인딩해야하는 경우 WebListener 또는 IIS, Nginx 또는 Apache와 같은 역방향 프록시 서버를 사용 하십시오 .

  • 포트 번호가있는 "Localhost"이름 또는 포트 번호가있는 루프백 IP

    http://localhost:5000/
    http://127.0.0.1:5000/
    http://[::1]:5000/
    

     localhost지정, 황조롱이는 IPv4 및 IPv6 루프백 인터페이스 모두에 결합을 시도합니다. 요청 된 포트가 두 루프백 인터페이스의 다른 서비스에서 사용 중이면 Kestrel을 시작하지 못합니다. 다른 이유로 든 루프백 인터페이스를 사용할 수없는 경우 (일반적으로 IPv6이 지원되지 않기 때문에) Kestrel은 경고를 기록합니다.

  • 유닉스 소켓

    http://unix:/run/dan-live.sock  
    

포트 번호 0을 지정하면 Kestrel은 사용 가능한 포트에 동적으로 바인딩합니다. 포트 0에 바인드하는 것은 name을 제외한 모든 호스트 이름이나 IP에 허용됩니다 localhost.

포트 0을 지정하면 IServerAddressesFeature런타임에 Kestrel이 실제로 바인딩 된 포트를 결정하는 데 사용할 수 있습니다 . 다음 예는 바운드 포트를 가져 와서 콘솔에 표시합니다.

기음#
public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole();

    var serverAddressesFeature = app.ServerFeatures.Get<IServerAddressesFeature>();

    app.UseStaticFiles();

    app.Run(async (context) =>
    {
        context.Response.ContentType = "text/html";
        await context.Response
            .WriteAsync("<p>Hosted by Kestrel</p>");

        if (serverAddressesFeature != null)
        {
            await context.Response
                .WriteAsync("<p>Listening on the following addresses: " +
                    string.Join(", ", serverAddressesFeature.Addresses) +
                    "</p>");
        }

        await context.Response.WriteAsync($"<p>Request URL: {context.Request.GetDisplayUrl()}<p>");
    });
}

SSL의 URL 접두사

아래에 표시된 것처럼 확장 메소드 https:를 호출하는 경우 URL 접두어를 포함해야 UseHttps합니다.2

기음#
var host = new WebHostBuilder() 
    .UseKestrel(options => 
    { 
        options.UseHttps("testCert.pfx", "testPassword"); 
    }) 
   .UseUrls("http://localhost:5000", "https://localhost:5001") 
   .UseContentRoot(Directory.GetCurrentDirectory()) 
   .UseStartup<Startup>() 
   .Build(); 
노트

HTTPS와 HTTP는 동일한 포트에서 호스팅 될 수 없습니다.

다음 단계

자세한 내용은 다음 리소스를 참조하십시오.