ASP.NET Core의 웹 서버 구현

작성자: Tom Dykstra, Steve Smith, Stephen HalterChris Ross

ASP.NET Core 앱은 In-Process HTTP 서버 구현을 사용하여 실행됩니다. 서버 구현은 HTTP 요청을 수신하고 HttpContext에 구성된 일련의 요청 기능으로 앱에 표시합니다.

ASP.NET Core는 다음과 함께 제공됩니다.

IIS 또는 IIS Express를 사용하는 경우 앱은 다음 중 하나를 실행합니다.

ASP.NET Core 모듈은 IIS와 In-Process IIS HTTP 서버 또는 Kestrel 간의 네이티브 IIS 요청을 처리하는 네이티브 IIS 모듈입니다. 자세한 내용은 IIS용 ANCM(ASP.NET Core 모듈)을 참조하세요.

Kestrel과 HTTP.sys 비교

Kestrel은 HTTP.sys에 비해 다음과 같은 이점이 있습니다.

  • 향상된 성능 및 메모리 사용률.
  • 플랫폼 간
  • 민첩성 - OS와 독립적으로 개발되고 패치됨.
  • 프로그래밍 방식 포트 및 TLS 구성
  • PPv2와 같은 프로토콜 및 대체 전송을 허용하는 확장성.

Http.Sys는 kestrel에서 제공하지 않는 다음과 같은 기능을 사용하여 공유 커널 모드 구성 요소로 작동합니다.

호스팅 모델

몇 가지 호스팅 모델을 사용할 수 있습니다.

  • Kestrel 자체 호스팅: 웹 서버는 Kestrel IIS 또는 HTTP.sys와 같은 다른 외부 웹 서버를 요구하지 않고 실행됩니다.

  • HTTP.sys 자체 호스팅은 Kestrel. Kestrel에서 제공하지 않는 기능이 앱에 필요하지 않는 한 HTTP.sys보다 Kestrel을 사용하는 것이 좋습니다.

  • IIS In Process 호스팅: ASP.NET Core 앱은 IIS 작업자 프로세스와 동일한 프로세스에서 실행됩니다. 요청이 동일한 컴퓨터로 나가는 네트워크 트래픽을 반환하는 네트워크 인터페이스인 루프백 어댑터를 통해 프록시되지 않으므로 IIS In-Process 호스팅은 IIS Out-of-process 호스팅에 비해 향상된 성능을 제공합니다. IIS는 Windows Process Activation Service(WAS)를 사용하여 프로세스 관리를 처리합니다.

  • IIS out-of-process 호스팅: ASP.NET Core 앱은 IIS 작업자 프로세스와는 별도로 프로세스에서 실행되고 모듈은 프로세스 관리를 처리합니다. 모듈은 첫 번째 요청이 들어올 때 ASP.NET Core 앱용 프로세스를 시작하고 종료되거나 충돌이 발생하면 앱을 다시 시작합니다. 이는 Windows Process Activation Service(WAS)로 관리되는 In-Process로 실행되는 앱에서 볼 수 있는 동작과 기본적으로 동일합니다. 별도의 프로세스를 사용하면 동일한 앱 풀에서 두 개 이상의 앱을 호스팅할 수도 있습니다.

자세한 내용은

Kestrel

Kestrel 서버는 기본 플랫폼 간 HTTP 서버 구현입니다. Kestrel은 최상의 성능과 메모리 사용률을 제공하지만 HTTP.sys의 고급 기능 중 일부를 제공하지 않습니다. 자세한 내용은 이 문서의 Kestrel과 HTTP.sys 비교를 참조하세요.

Kestrel는 다음 용도로 사용합니다.

  • 인터넷을 포함한 네트워크의 요청을 직접 처리하는 에지 서버로 단독 사용합니다.

    Kestrel communicates directly with the Internet without a reverse proxy server

  • IIS(인터넷 정보 서비스), Nginx 또는 Apache 같은 역방향 프록시 서버와 함께 사용합니다. 역방향 프록시 서버는 인터넷에서 HTTP 요청을 받아 Kestrel에 전달합니다.

    Kestrel communicates indirectly with the Internet through a reverse proxy server, such as IIS, Nginx, or Apache

역방향 프록시 서버가 있는 구성과 없는 구성 모두 지원되는 호스팅 구성입니다.

Kestrel 역방향 프록시 구성에서 사용해야 Kestrel 하는 경우에 대한 구성 지침 및 정보는 ASP.NET Core의 웹 서버를 참조 Kestrel 하세요.

ASP.NET Core는 다음과 함께 제공됩니다.

IIS 또는 IIS Express를 사용하면 앱이 Kestrel 서버를 사용하여 IIS 작업자 프로세스와 다른 별도의 프로세스에서(Out-of-Process) 실행됩니다.

ASP.NET Core 앱은 IIS 작업자 프로세스와 별도의 프로세스에서 실행되므로 이 모듈은 프로세스 관리를 수행합니다. 모듈은 첫 번째 요청이 들어올 때 ASP.NET Core 앱용 프로세스를 시작하고 종료되거나 충돌이 발생하면 앱을 다시 시작합니다. 이는 Windows Process Activation Service(WAS)로 관리되는 In-Process로 실행되는 앱에서 볼 수 있는 동작과 기본적으로 동일합니다.

다음 다이어그램은 IIS, ASP.NET Core 모듈 및 Out-of-Process에 호스트된 앱 간의 관계를 보여 줍니다.

ASP.NET Core Module

요청은 웹에서 커널 모드 HTTP.sys 드라이버로 도착합니다. 드라이버는 웹 사이트의 구성된 포트(일반적으로 80(HTTP) 또는 443(HTTPS))에서 IIS로 요청을 라우팅합니다. 모듈은 포트 80 또는 443이 아닌 앱의 임의의 포트에서 Kestrel으로 요청을 전달합니다.

모듈은 시작 시 환경 변수를 통해 포트를 지정하고 IIS 통합 미들웨어http://localhost:{port}에서 수신 대기하도록 서버를 구성합니다. 추가 검사가 수행되고 모듈에서 시작되지 않은 요청은 거부됩니다. 모듈은 HTTPS 전달을 지원하지 않으므로 HTTPS를 통해 IIS에서 수신된 경우에도 HTTP를 통해 요청이 전달됩니다.

Kestrel이 모듈에서 요청을 선택한 후 요청은 ASP.NET Core 미들웨어 파이프라인으로 푸시됩니다. 미들웨어 파이프라인은 요청을 처리하고 앱의 논리에 HttpContext 인스턴스로 전달합니다. IIS 통합에 의해 추가된 미들웨어는 체계, 원격 IP 및 PathBase를 Kestrel에 요청을 전달하기 위한 계정으로 업데이트합니다. 앱의 응답은 IIS로 다시 전달되고, 요청을 시작한 HTTP 클라이언트에 다시 푸시됩니다.

IIS 및 ASP.NET Core 모듈 구성 지침은 다음 토픽을 참조하세요.

Nginx 및 Kestrel

Linux에서 Kestrel에 대한 역방향 프록시 서버로 Nginx를 사용하는 방법에 대한 자세한 내용은 Nginx를 사용하여 Linux에서 ASP.NET Core 호스팅을 참조하세요.

Apache 및 Kestrel

Linux에서 Kestrel에 대한 역방향 프록시 서버로 Apache를 사용하는 방법에 대한 자세한 내용은 Apache를 사용하여 Linux에서 ASP.NET Core 호스팅을 참조하세요.

HTTP.sys

Windows에서 ASP.NET Core 앱을 실행할 경우 Kestrel 대신 HTTP.sys를 사용할 수 있습니다. Kestrel에서 제공하지 않는 기능이 앱에 필요하지 않는 한 HTTP.sys보다 Kestrel을 사용하는 것이 좋습니다. 자세한 내용은 ASP.NET Core의 HTTP.sys 웹 서버 구현을 참조하세요.

HTTP.sys communicates directly with the Internet

HTTP.sys는 내부 네트워크에만 노출되는 앱에도 사용할 수 있습니다.

HTTP.sys communicates directly with the internal network

HTTP.sys 구성 지침은 ASP.NET Core에서 HTTP.sys 웹 서버 구현을 참조하세요.

ASP.NET Core 서버 인프라

Startup.Configure 메서드에서 사용 가능한 IApplicationBuilderIFeatureCollection 형식의 ServerFeatures 속성을 노출합니다. Kestrel 및 HTTP.sys는 각각 단일 기능인 IServerAddressesFeature만을 노출하지만 다른 서버 구현은 추가 기능을 노출할 수 있습니다.

IServerAddressesFeature를 사용하여 런타임 시 서버 구현이 바인딩된 포트를 확인할 수 있습니다.

사용자 지정 서버

기본 제공 서버가 앱의 요구 사항을 충족하지 않으면 사용자 지정 서버 구현을 만들 수 있습니다. OWIN(Open Web Interface for .NET) 가이드에서는 Nowin 기반 IServer 구현을 작성하는 방법을 보여 줍니다. 앱이 사용하는 기능 인터페이스에만 구현이 필요하지만, 최소한 IHttpRequestFeatureIHttpResponseFeature는 지원되어야 합니다.

서버 시작

IDE(통합 개발 환경)이나 편집기가 앱을 시작하는 경우 서버가 실행됩니다.

프로젝트의 폴더에 있는 명령 프롬프트에서 앱을 시작할 때 dotnet run은 앱 및 서버를 시작합니다(Kestrel 및 HTTP.sys만 해당). Debug(기본값) 또는 Release로 설정되어 있는 -c|--configuration 옵션으로 구성을 지정합니다.

launchSettings.json 파일은 dotnet run를 사용하거나 Visual Studio와 같은 도구에 기본 제공되는 디버거를 사용하여 앱을 시작할 때 구성을 제공합니다. 시작 프로필이 파일에 있는 launchSettings.json 경우 명령과 함께 dotnet run 옵션을 사용 --launch-profile {PROFILE NAME} 하거나 Visual Studio에서 프로필을 선택합니다. 자세한 내용은 dotnet run.NET Core 배포 패키징을 참조하세요.

HTTP/2 지원

HTTP/2는 다음과 같은 배포 시나리오에서 ASP.NET Core에서 지원됩니다.

  • Kestrel
    • 운영 체제
      • Windows Server 2016/Windows 10 이상†
      • Linux 및 OpenSSL 1.0.2 이상(예: Ubuntu 16.04 이상)
      • macOS 10.15 이상
    • 대상 프레임워크: .NET Core 2.2 이상
  • HTTP.sys
    • Windows Server 2016/Windows 10 이상
    • 대상 프레임워크: HTTP.sys 배포에는 적용할 수 없습니다.
  • IIS(In-Process)
    • Windows Server 2016/Windows 10 이상, IIS 10 이상
    • 대상 프레임워크: .NET Core 2.2 이상
  • IIS(Out-of-process)
    • Windows Server 2016/Windows 10 이상, IIS 10 이상
    • 공용 에지 서버 연결은 HTTP/2를 사용하지만 Kestrel에 대한 역방향 프록시 연결은 HTTP/1.1을 사용합니다.
    • 대상 프레임워크: IIS Out-of-process 배포에는 적용할 수 없습니다.

†Kestrel은 Windows Server 2012 R2 및 Windows 8.1에서 HTTP/2를 제한적으로 지원합니다. 이러한 운영 체제에서 사용할 수 있는 지원 가능 TLS 암호 그룹 목록이 제한되므로 지원이 제한됩니다. TLS 연결을 보호하는 데 ECDSA(타원 곡선 디지털 서명 알고리즘)를 사용하여 생성된 인증서가 필요할 수 있습니다.

  • Kestrel
    • 운영 체제
      • Windows Server 2016/Windows 10 이상†
      • Linux 및 OpenSSL 1.0.2 이상(예: Ubuntu 16.04 이상)
      • macOS에서는 이후 릴리스에서 HTTP/2가 지원됩니다.
    • 대상 프레임워크: .NET Core 2.2 이상
  • HTTP.sys
    • Windows Server 2016/Windows 10 이상
    • 대상 프레임워크: HTTP.sys 배포에는 적용할 수 없습니다.
  • IIS(In-Process)
    • Windows Server 2016/Windows 10 이상, IIS 10 이상
    • 대상 프레임워크: .NET Core 2.2 이상
  • IIS(Out-of-process)
    • Windows Server 2016/Windows 10 이상, IIS 10 이상
    • 공용 에지 서버 연결은 HTTP/2를 사용하지만 Kestrel에 대한 역방향 프록시 연결은 HTTP/1.1을 사용합니다.
    • 대상 프레임워크: IIS Out-of-process 배포에는 적용할 수 없습니다.

†Kestrel은 Windows Server 2012 R2 및 Windows 8.1에서 HTTP/2를 제한적으로 지원합니다. 이러한 운영 체제에서 사용할 수 있는 지원 가능 TLS 암호 그룹 목록이 제한되므로 지원이 제한됩니다. TLS 연결을 보호하는 데 ECDSA(타원 곡선 디지털 서명 알고리즘)를 사용하여 생성된 인증서가 필요할 수 있습니다.

  • Kestrel
    • 운영 체제
      • Windows Server 2016/Windows 10 이상†
      • Linux 및 OpenSSL 1.0.2 이상(예: Ubuntu 16.04 이상)
      • macOS에서는 이후 릴리스에서 HTTP/2가 지원됩니다.
    • 대상 프레임워크: .NET Core 2.2 이상
  • HTTP.sys
    • Windows Server 2016/Windows 10 이상
    • 대상 프레임워크: HTTP.sys 배포에는 적용할 수 없습니다.
  • IIS(In-Process)
    • Windows Server 2016/Windows 10 이상, IIS 10 이상
    • 대상 프레임워크: .NET Core 2.2 이상
  • IIS(Out-of-process)
    • Windows Server 2016/Windows 10 이상, IIS 10 이상
    • 공용 에지 서버 연결은 HTTP/2를 사용하지만 Kestrel에 대한 역방향 프록시 연결은 HTTP/1.1을 사용합니다.
    • 대상 프레임워크: IIS Out-of-process 배포에는 적용할 수 없습니다.

†Kestrel은 Windows Server 2012 R2 및 Windows 8.1에서 HTTP/2를 제한적으로 지원합니다. 이러한 운영 체제에서 사용할 수 있는 지원 가능 TLS 암호 그룹 목록이 제한되므로 지원이 제한됩니다. TLS 연결을 보호하는 데 ECDSA(타원 곡선 디지털 서명 알고리즘)를 사용하여 생성된 인증서가 필요할 수 있습니다.

  • HTTP.sys
    • Windows Server 2016/Windows 10 이상
    • 대상 프레임워크: HTTP.sys 배포에는 적용할 수 없습니다.
  • IIS(Out-of-process)
    • Windows Server 2016/Windows 10 이상, IIS 10 이상
    • 공용 에지 서버 연결은 HTTP/2를 사용하지만 Kestrel에 대한 역방향 프록시 연결은 HTTP/1.1을 사용합니다.
    • 대상 프레임워크: IIS Out-of-process 배포에는 적용할 수 없습니다.

HTTP/2 연결은 ALPN(Application-Layer Protocol Negotiation) 및 TLS 1.2 이상을 사용해야 합니다. 자세한 정보는 서버 배포 시나리오와 관련된 항목을 참조하세요.

추가 리소스