ASP.NET Core의 웹 서버 구현Web server implementations in ASP.NET Core

작성자: Tom Dykstra, Steve Smith, Stephen HalterChris RossBy Tom Dykstra, Steve Smith, Stephen Halter, and Chris Ross

ASP.NET Core 앱은 In-Process HTTP 서버 구현을 사용하여 실행됩니다.An ASP.NET Core app runs with an in-process HTTP server implementation. 서버 구현은 HTTP 요청을 수신하고 HttpContext에 구성된 일련의 요청 기능으로 앱에 표시합니다.The server implementation listens for HTTP requests and surfaces them to the app as a set of request features composed into an HttpContext.

KestrelKestrel

Kestrel은 ASP.NET Core 프로젝트 템플릿에서 지정된 기본 웹 서버입니다.Kestrel is the default web server specified by the ASP.NET Core project templates.

다음과 같이 Kestrel을 사용할 수 있습니다.Use Kestrel:

  • 인터넷을 포함한 네트워크의 요청을 직접 처리하는 에지 서버로 단독 사용합니다.By itself as an edge server processing requests directly from a network, including the Internet.

    Kestrel이 역방향 프록시 서버 없이 직접 인터넷과 통신합니다.

  • IIS(인터넷 정보 서비스), Nginx 또는 Apache 같은 역방향 프록시 서버와 함께 사용합니다.With a reverse proxy server, such as Internet Information Services (IIS), Nginx, or Apache. 역방향 프록시 서버는 인터넷에서 HTTP 요청을 받아서 Kestrel에 전달합니다.A reverse proxy server receives HTTP requests from the Internet and forwards them to Kestrel.

    Kestrel이 IIS, Nginx 또는 Apache 같은 역방향 프록시 서버를 통해 간접적으로 인터넷과 통신합니다.

—역방향 프록시 서버가 있는 구성과 없는 구성 모두— 지원되는 호스팅 구성입니다.Either hosting configuration—with or without a reverse proxy server—is supported.

Kestrel을 역방향 프록시 구성에서 사용하는 경우에 대한 Kestrel 구성 지침 및 정보는 ASP.NET Core에서 Kestrel 웹 서버 구현을 참조하세요.For Kestrel configuration guidance and information on when to use Kestrel in a reverse proxy configuration, see ASP.NET Core에서 Kestrel 웹 서버 구현.

ASP.NET Core는 다음과 함께 제공됩니다.ASP.NET Core ships with the following:

IIS 또는 IIS Express를 사용하는 경우 앱은 다음 중 하나에서 실행됩니다.When using IIS or IIS Express, the app either runs:

ASP.NET Core 모듈은 IIS와 In-Process IIS HTTP 서버 또는 Kestrel 간의 네이티브 IIS 요청을 처리하는 네이티브 IIS 모듈입니다.The ASP.NET Core Module is a native IIS module that handles native IIS requests between IIS and the in-process IIS HTTP Server or Kestrel. 자세한 내용은 ASP.NET Core 모듈를 참조하세요.For more information, see ASP.NET Core 모듈.

호스팅 모델Hosting models

In-Process 호스팅을 사용하면 ASP.NET Core 앱은 IIS 작업자 프로세스와 동일한 프로세스에서 실행됩니다.Using in-process hosting, an ASP.NET Core app runs in the same process as its IIS worker process. 요청이 나가는 네트워크 트래픽을 동일한 머신에 다시 반환하는 네트워크 인터페이스인 루프백 어댑터를 통해 프록시되지 않기 때문에 In-Process 호스팅이 Out-of-Process 호스팅보다 향상된 성능을 제공합니다.In-process hosting provides improved performance over out-of-process hosting because requests aren't proxied over the loopback adapter, a network interface that returns outgoing network traffic back to the same machine. IIS는 Windows Process Activation Service(WAS)를 사용하여 프로세스 관리를 처리합니다.IIS handles process management with the Windows Process Activation Service (WAS).

Out-of-Process 호스팅을 사용하면 ASP.NET Core 앱은 IIS 작업자 프로세스와 별도의 프로세스에서 실행되고, 모듈이 프로세스 관리를 수행합니다.Using out-of-process hosting, ASP.NET Core apps run in a process separate from the IIS worker process, and the module handles process management. 모듈은 첫 번째 요청이 들어올 때 ASP.NET Core 앱용 프로세스를 시작하고 종료되거나 충돌이 발생하면 앱을 다시 시작합니다.The module starts the process for the ASP.NET Core app when the first request arrives and restarts the app if it shuts down or crashes. 이는 Windows Process Activation Service(WAS)로 관리되는 In-Process로 실행되는 앱에서 볼 수 있는 동작과 기본적으로 동일합니다.This is essentially the same behavior as seen with apps that run in-process that are managed by the Windows Process Activation Service (WAS).

자세한 내용 및 구성 지침은 다음 항목을 참조하세요.For more information and configuration guidance, see the following topics:

ASP.NET Core는 다음과 함께 제공됩니다.ASP.NET Core ships with the following:

IIS 또는 IIS Express를 사용하면 앱이 Kestrel 서버를 사용하여 IIS 작업자 프로세스와 다른 별도의 프로세스에서(Out-of-Process) 실행됩니다.When using IIS or IIS Express, the app runs in a process separate from the IIS worker process (out-of-process) with the Kestrel server.

ASP.NET Core 앱은 IIS 작업자 프로세스와 별도의 프로세스에서 실행되므로 이 모듈은 프로세스 관리를 수행합니다.Because ASP.NET Core apps run in a process separate from the IIS worker process, the module handles process management. 모듈은 첫 번째 요청이 들어올 때 ASP.NET Core 앱용 프로세스를 시작하고 종료되거나 충돌이 발생하면 앱을 다시 시작합니다.The module starts the process for the ASP.NET Core app when the first request arrives and restarts the app if it shuts down or crashes. 이는 Windows Process Activation Service(WAS)로 관리되는 In-Process로 실행되는 앱에서 볼 수 있는 동작과 기본적으로 동일합니다.This is essentially the same behavior as seen with apps that run in-process that are managed by the Windows Process Activation Service (WAS).

다음 다이어그램은 IIS, ASP.NET Core 모듈 및 Out-of-Process에 호스트된 앱 간의 관계를 보여 줍니다.The following diagram illustrates the relationship between IIS, the ASP.NET Core Module, and an app hosted out-of-process:

ASP.NET Core 모듈

요청은 웹에서 커널 모드 HTTP.sys 드라이버로 도착합니다.Requests arrive from the web to the kernel-mode HTTP.sys driver. 드라이버는 웹 사이트의 구성된 포트(일반적으로 80(HTTP) 또는 443(HTTPS))에서 IIS로 요청을 라우팅합니다.The driver routes the requests to IIS on the website's configured port, usually 80 (HTTP) or 443 (HTTPS). 모듈은 포트 80 또는 443이 아닌 앱의 임의의 포트에서 Kestrel로 요청을 전달합니다.The module forwards the requests to Kestrel on a random port for the app, which isn't port 80 or 443.

모듈은 시작 시 환경 변수를 통해 포트를 지정하고 IIS 통합 미들웨어http://localhost:{port}에서 수신 대기하도록 서버를 구성합니다.The module specifies the port via an environment variable at startup, and the IIS Integration Middleware configures the server to listen on http://localhost:{port}. 추가 검사가 수행되고 모듈에서 시작되지 않은 요청은 거부됩니다.Additional checks are performed, and requests that don't originate from the module are rejected. 모듈은 HTTPS 전달을 지원하지 않으므로 HTTPS를 통해 IIS에서 수신된 경우에도 HTTP를 통해 요청이 전달됩니다.The module doesn't support HTTPS forwarding, so requests are forwarded over HTTP even if received by IIS over HTTPS.

Kestrel이 모듈에서 요청을 선택한 후, 요청은 ASP.NET Core 미들웨어 파이프라인으로 푸시됩니다.After Kestrel picks up the request from the module, the request is pushed into the ASP.NET Core middleware pipeline. 미들웨어 파이프라인은 요청을 처리하고 앱의 논리에 HttpContext 인스턴스로 전달합니다.The middleware pipeline handles the request and passes it on as an HttpContext instance to the app's logic. IIS 통합에 의해 추가된 미들웨어는 체계, 원격 IP 및 경로 기준을 Kestrel에 요청을 전달하기 위한 계정으로 업데이트합니다.Middleware added by IIS Integration updates the scheme, remote IP, and pathbase to account for forwarding the request to Kestrel. 앱의 응답은 IIS로 다시 전달되고, 요청을 시작한 HTTP 클라이언트에 다시 푸시됩니다.The app's response is passed back to IIS, which pushes it back out to the HTTP client that initiated the request.

IIS 및 ASP.NET Core 모듈 구성 지침은 다음 토픽을 참조하세요.For IIS and ASP.NET Core Module configuration guidance, see the following topics:

Nginx 및 KestrelNginx with Kestrel

Linux에서 Kestrel에 대한 역방향 프록시 서버로 Nginx를 사용하는 방법은 Nginx를 사용하여 Linux에서 ASP.NET Core 호스트를 참조하세요.For information on how to use Nginx on Linux as a reverse proxy server for Kestrel, see Nginx를 사용하여 Linux에서 ASP.NET Core 호스트.

Apache 및 KestrelApache with Kestrel

Linux에서 Kestrel에 대한 역방향 프록시 서버로 Apache를 사용하는 방법은 Apache를 사용하여 Linux에서 ASP.NET Core 호스트를 참조하세요.For information on how to use Apache on Linux as a reverse proxy server for Kestrel, see Apache를 사용하여 Linux에서 ASP.NET Core 호스트.

HTTP.sysHTTP.sys

Windows에서 ASP.NET Core 앱을 실행할 경우 Kestrel 대신 HTTP.sys를 사용할 수 있습니다.If ASP.NET Core apps are run on Windows, HTTP.sys is an alternative to Kestrel. 최상의 성능을 위해 일반적으로 Kestrel을 사용하는 것이 좋습니다.Kestrel is generally recommended for best performance. 앱이 인터넷에 노출되고 필수 기능이 Kestrel이 아닌 HTTP.sys에서 지원되는 시나리오에서 HTTP.sys를 사용할 수 있습니다.HTTP.sys can be used in scenarios where the app is exposed to the Internet and required capabilities are supported by HTTP.sys but not Kestrel. 자세한 내용은 ASP.NET Core에서 HTTP.sys 웹 서버 구현를 참조하세요.For more information, see ASP.NET Core에서 HTTP.sys 웹 서버 구현.

HTTP.sys는 인터넷과 직접 통신합니다.

HTTP.sys는 내부 네트워크에만 노출되는 앱에도 사용할 수 있습니다.HTTP.sys can also be used for apps that are only exposed to an internal network.

HTTP.sys는 내부 네트워크와 직접 통신합니다.

HTTP.sys 구성 지침은 ASP.NET Core에서 HTTP.sys 웹 서버 구현를 참조하세요.For HTTP.sys configuration guidance, see ASP.NET Core에서 HTTP.sys 웹 서버 구현.

ASP.NET Core 서버 인프라ASP.NET Core server infrastructure

Startup.Configure 메서드에서 사용 가능한 IApplicationBuilderIFeatureCollection 형식의 ServerFeatures 속성을 노출합니다.The IApplicationBuilder available in the Startup.Configure method exposes the ServerFeatures property of type IFeatureCollection. Kestrel 및 HTTP.sys는 각각 단일 기능인 IServerAddressesFeature만을 노출하지만 다른 서버 구현은 추가 기능을 노출할 수 있습니다.Kestrel and HTTP.sys only expose a single feature each, IServerAddressesFeature, but different server implementations may expose additional functionality.

IServerAddressesFeature를 사용하여 런타임 시 서버 구현이 바인딩된 포트를 확인할 수 있습니다.IServerAddressesFeature can be used to find out which port the server implementation has bound at runtime.

사용자 지정 서버Custom servers

기본 제공 서버가 앱의 요구 사항을 충족하지 않으면 사용자 지정 서버 구현을 만들 수 있습니다.If the built-in servers don't meet the app's requirements, a custom server implementation can be created. OWIN(Open Web Interface for .NET) 가이드에서는 Nowin 기반 IServer 구현을 작성하는 방법을 보여 줍니다.The Open Web Interface for .NET (OWIN) guide demonstrates how to write a Nowin-based IServer implementation. 앱이 사용하는 기능 인터페이스에만 구현이 필요하지만, 최소한 IHttpRequestFeatureIHttpResponseFeature는 지원되어야 합니다.Only the feature interfaces that the app uses require implementation, though at a minimum IHttpRequestFeature and IHttpResponseFeature must be supported.

서버 시작Server startup

IDE(통합 개발 환경)이나 편집기가 앱을 시작하는 경우 서버가 실행됩니다.The server is launched when the Integrated Development Environment (IDE) or editor starts the app:

프로젝트의 폴더에 있는 명령 프롬프트에서 앱을 시작할 때 dotnet run은 서버 및 앱을 시작합니다(Kestrel 및 HTTP.sys만 해당).When launching the app from a command prompt in the project's folder, dotnet run launches the app and server (Kestrel and HTTP.sys only). Debug(기본값) 또는 Release로 설정되어 있는 -c|--configuration 옵션으로 구성을 지정합니다.The configuration is specified by the -c|--configuration option, which is set to either Debug (default) or Release.

launchSettings.json 파일은 dotnet run을 사용하거나 Visual Studio와 같은 도구에 기본 제공되는 디버거를 사용하여 앱을 시작할 때 구성을 제공합니다.A launchSettings.json file provides configuration when launching an app with dotnet run or with a debugger built into tooling, such as Visual Studio. 시작 프로필이 launchSettings.json 파일에 있는 경우 dotnet run 명령에 --launch-profile {PROFILE NAME} 옵션을 사용하거나 Visual Studio에서 프로필을 선택합니다.If launch profiles are present in a launchSettings.json file, use the --launch-profile {PROFILE NAME} option with the dotnet run command or select the profile in Visual Studio. 자세한 내용은 dotnet run.NET Core 배포 패키징을 참조하세요.For more information, see dotnet run and .NET Core distribution packaging.

HTTP/2 지원HTTP/2 support

HTTP/2는 다음과 같은 배포 시나리오에서 ASP.NET Core에서 지원됩니다.HTTP/2 is supported with ASP.NET Core in the following deployment scenarios:

  • KestrelKestrel
    • 운영 체제Operating system
      • Windows Server 2016/Windows 10 이상†Windows Server 2016/Windows 10 or later†
      • Linux 및 OpenSSL 1.0.2 이상(예: Ubuntu 16.04 이상)Linux with OpenSSL 1.0.2 or later (for example, Ubuntu 16.04 or later)
      • macOS에서는 이후 릴리스에서 HTTP/2가 지원됩니다.HTTP/2 will be supported on macOS in a future release.
    • 대상 프레임워크: .NET Core 2.2 이상Target framework: .NET Core 2.2 or later
  • HTTP.sysHTTP.sys
    • Windows Server 2016/Windows 10 이상Windows Server 2016/Windows 10 or later
    • 대상 프레임워크: HTTP.sys 배포에는 적용되지 않습니다.Target framework: Not applicable to HTTP.sys deployments.
  • IIS(In-Process)IIS (in-process)
    • Windows Server 2016/Windows 10 이상, IIS 10 이상Windows Server 2016/Windows 10 or later; IIS 10 or later
    • 대상 프레임워크: .NET Core 2.2 이상Target framework: .NET Core 2.2 or later
  • IIS(Out-of-Process)IIS (out-of-process)
    • Windows Server 2016/Windows 10 이상, IIS 10 이상Windows Server 2016/Windows 10 or later; IIS 10 or later
    • 공개 에지 서버 연결은 HTTP/2를 사용하지만 Kestrel에 대한 역방향 프록시 연결은 HTTP/1.1을 사용합니다.Public-facing edge server connections use HTTP/2, but the reverse proxy connection to Kestrel uses HTTP/1.1.
    • 대상 프레임워크: IIS Out-of-Process 배포에는 적용되지 않습니다.Target framework: Not applicable to IIS out-of-process deployments.

†Kestrel은 Windows Server 2012 R2와 Windows 8.1에서의 HTTP/2 지원을 제한했습니다.†Kestrel has limited support for HTTP/2 on Windows Server 2012 R2 and Windows 8.1. 이러한 운영 체제에서 사용할 수 있는 지원 가능 TLS 암호 그룹 목록이 제한되므로 지원이 제한됩니다.Support is limited because the list of supported TLS cipher suites available on these operating systems is limited. TLS 연결을 보호하는 데 ECDSA(타원 곡선 디지털 서명 알고리즘)를 사용하여 생성된 인증서가 필요할 수 있습니다.A certificate generated using an Elliptic Curve Digital Signature Algorithm (ECDSA) may be required to secure TLS connections.

  • HTTP.sysHTTP.sys
    • Windows Server 2016/Windows 10 이상Windows Server 2016/Windows 10 or later
    • 대상 프레임워크: HTTP.sys 배포에는 적용되지 않습니다.Target framework: Not applicable to HTTP.sys deployments.
  • IIS(Out-of-Process)IIS (out-of-process)
    • Windows Server 2016/Windows 10 이상, IIS 10 이상Windows Server 2016/Windows 10 or later; IIS 10 or later
    • 공개 에지 서버 연결은 HTTP/2를 사용하지만 Kestrel에 대한 역방향 프록시 연결은 HTTP/1.1을 사용합니다.Public-facing edge server connections use HTTP/2, but the reverse proxy connection to Kestrel uses HTTP/1.1.
    • 대상 프레임워크: IIS Out-of-Process 배포에는 적용되지 않습니다.Target framework: Not applicable to IIS out-of-process deployments.

HTTP/2 연결은 ALPN(Application-Layer Protocol Negotiation) 및 TLS 1.2 이상을 사용해야 합니다.An HTTP/2 connection must use Application-Layer Protocol Negotiation (ALPN) and TLS 1.2 or later. 자세한 정보는 서버 배포 시나리오와 관련된 항목을 참조하세요.For more information, see the topics that pertain to your server deployment scenarios.

추가 자료Additional resources