심재운 블로그

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는 동일한 포트에서 호스팅 될 수 없습니다.

다음 단계

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


이 글을 공유합시다

facebook twitter kakaoTalk kakaostory naver band

본문과 관련 있는 내용으로 댓글을 남겨주시면 감사하겠습니다.

비밀글모드

  1. 진우
    몇가지 문의좀 드려도 될까요??

    1. 내부 네트워크에서 kestrel 을 사용하고 리버스 프록시는 nginx 를 쓰는데 이걸 굳이 두가지를 써야하나요?
    kestrel, kestrel 또는 nginx, nginx 이렇게 한가지 서버로 웹서버, 프록시 서버로 사용하면 되는거 아닌가요??
    kestrel 과 nginx 가 사용 목적이 좀 다른건가요?

    2. 홈페이지를 개발하면 웹개발자가 프록시 서버도 설정해야하나요? 아니면 네트워크 관리자가 설정해주는건가요?

    3. 집에서 인터넷 사용시 프록시 서버는 어디에 위치하나요? 따로 설정하지 않아도 공유기가 프록시 서버 역할도 하는건가요?

    4. 프록시 서버는 웹서버와 물리적으로 다른 컴퓨터에 구축해야하나요?

    5. 포워드 프록시, 리버스 프록시서버는 내부 네트워크에 구축하는것같은데
    외국 사이트 우회접속 해주는 프록시 서버같은 경우에는 어떤 유형의 프록시 인가요?? 그냥 프록시 서버라고 부르나요??
    2020.08.22 18:29