ASP.NET Core 모듈 살펴보기
- 본 번역문서의 원문은 Introduction to ASP.NET Core Module docs.microsoft.com 입니다.
ASP.NET Core 모듈(ANCM)을 사용하면 IIS의 뒷단에서 ASP.NET Core 응용 프로그램을 실행할 수 있습니다. IIS가 강점을 갖고 있는 부분에는 IIS를 사용하고 (보안, 관리 효율성 등 그 외 다수), Kestrel이 강점을 갖고 있는 부분에는 Kestrel을 사용함으로써 (빠른 실행 속도), 두 기술의 장점을 동시에 모두 얻을 수 있습니다. ANCM은 Kestrel에서만 동작하며, ASP.NET Core 1.x의 WebListener나 2.x의 HTTP.sys와는 호환되지 않습니다.
지원되는 Windows 버전:
- Windows 7 및 Windows 서버 2008 R2 이상
ASP.NET Core 모듈의 역할
ANCM은 IIS 파이프라인에 결합되어 배후의 ASP.NET Core 응용 프로그램으로 트래픽을 재전송하는 네이티브 IIS 모듈입니다. Windows 인증 같은 다른 대부분의 모듈도 여전히 실행될 수 있는 기회를 갖고 있습니다. ANCM은 요청에 대한 처리기가 선택되고 응용 프로그램의 web.config 파일에 처리기 매핑이 정의된 경우에만 제어권을 갖습니다.
ASP.NET Core 응용 프로그램은 IIS 작업자 프로세스와는 별도의 프로세스로 실행되기 때문에, ANCM은 프로세스 관리 역할도 수행합니다. ANCM은 첫 번째 요청이 들어오면 ASP.NET Core 응용 프로그램 프로세스를 시작하고, 충돌이 발생하면 프로세스를 재시작합니다. 이는 IIS에서 In-Process로 실행되고 WAS(Windows Activation Service)에 의해서 관리되는 클래식 ASP.NET 응용 프로그램과 본질적으로 동일한 동작입니다.
다음은 IIS, ANCM 및 ASP.NET Core 응용 프로그램 간의 관계를 보여주는 다이어그램입니다.
먼저 웹으로부터 들어온 요청은 커널 모드 Http.Sys 드라이버에 전달되며, 이 드라이버는 기본 포트(80)나 SSL 포트(443)를 사용하도록 구성된 IIS로 요청을 라우트합니다. 그러면 ANCM은 포트 80이나 443이 아닌, 응용 프로그램에 구성된 HTTP 포트로 실행 중인 ASP.NET Core 응용 프로그램에 요청을 전달합니다.
Kestrel이 ANCM으로부터 전달되는 트래픽을 수신합니다.
ANCM은 구동 시 환경 변수를 통해서 포트를 지정하고, UseIISIntegration 메서드는 http://localhost:{port}
를 수신 대기하도록 서버를 구성합니다.
이때 ANCM으로부터 전달된 요청이 아니면 추가적인 검사를 통해서 거부됩니다.
(ANCM은 HTTPS 전달을 지원하지 않기 때문에, IIS가 HTTPS를 통해서 수신한 요청도 HTTP를 통해서 전달됩니다.)
Kestrel은 ANCM으로부터 전달받은 요청을 ASP.NET Core 미들웨어 파이프라인으로 전달합니다.
그리고 ASP.NET Core 미들웨어 파이프라인은 요청을 처리한 다음, 다시 그 결과를 HttpContext
인스턴스의 형태로 응용 프로그램 로직에 전달합니다.
그러면 응용 프로그램의 응답이 다시 IIS로 전달되어 요청을 시작한 HTTP 클라이언트로 다시 돌아가게 됩니다.
ANCM은 다음과 같은 몇 가지 다른 기능을 갖고 있습니다:
- 환경 변수를 설정합니다.
-
stdout
출력 로그를 파일 저장소에 기록합니다. - Windows 인증 토큰을 전달합니다.
ASP.NET Core 응용 프로그램에서 ANCM을 사용하는 방법
이번 절에서는 IIS 서버 및 ASP.NET Core 응용 프로그램을 설정하는 전반적인 과정에 관해서만 살펴봅니다. 보다 자세한 정보는 Publishing to IIS 문서를 참고하시기 바랍니다.
ANCM 설치하기
서버의 IIS와 개발 머신의 IIS Express에 ASP.NET Core 모듈을 설치해야 합니다. 서버의 경우, .NET Core Windows Server Hosting 번들에 ANCM이 포함되어 있습니다. 개발 컴퓨터의 경우, Visual Studio가 자동으로 IIS Express에 ANCM을 설치하며, 이미 컴퓨터에 IIS가 설치되어 있을 경우 IIS에도 설치합니다.
IISIntegration NuGet 패키지 설치
Microsoft.AspNetCore.Server.IISIntegration 패키지는 ASP.NET Core 메타패키지에 포함되어 있습니다
(Microsoft.AspNetCore 및 Microsoft.AspNetCore.All).
메타패키지 중 하나를 사용하지 않으려면 별도로 Microsoft.AspNetCore.Server.IISIntegration
을 설치해야 합니다.
IISIntegration
패키지는 응용 프로그램을 설정하기 위해서 ANCM이 브로드캐스트하는 환경 변수를 읽는 상호 운용성 팩입니다.
이 환경 변수는 수신 대기할 포트 같은 구성 정보를 제공합니다.
UseIISIntegration 호출하기
IIS와 함께 실행할 경우, WebHostBuilder
클래스의 UseIISIntegration
확장 메서드가 자동으로 호출됩니다.
ASP.NET Core 메타패키지를 하나도 사용하지 않고 Microsoft.AspNetCore.Server.IISIntegration
패키지도 설치하지 않았다면 런타임 오류가 발생합니다.
또한 패키지가 설치되어 있지 않을 경우, 명시적으로 UseIISIntegration
확장 메서드를 호출하면 컴파일 타임 오류가 발생합니다.
UseIISIntegration
메서드는 먼저 ANCM이 설정한 환경 변수를 찾아보고, 발견되지 않으면 아무 작업도 하지 않습니다.
이와 같은 동작으로 인해서 개발 및 테스트는 macOS나 Linux에서 수행하고 배포는 IIS가 실행되는 서버에 하는 등의 시나리오를 수행하기가 용이합니다.
macOS나 Linux에서 실행되는 동안에는 Kestrel이 웹 서버로 동작하지만, 응용 프로그램이 IIS 환경에 배포되면 자동으로 ANCM과 IIS가 사용됩니다.
ANCM 포트 바인딩은 다른 포트 바인딩을 재정의합니다.
ANCM은 백엔드 프로세스에 할당할 동적 포트를 생성합니다.
UseIISIntegration
메서드는 해당 동적 포트를 선택한 다음, Kestrel이 http://locahost:{dynamicPort}/
에서 수신 대기하도록 구성합니다.
이 동작은 UseUrls
호출이나 Kestrel의 Listen API 같은 다른 URL 구성을 덮어씁니다.
따라서 ANCM을 사용할 때는 UseUrls
메서드나 Kestrel의 Listen
API를 호출할 필요가 없습니다.
반면 IIS 없이 응용 프로그램을 실행하는 경우에는 UseUrls
메서드나 Listen
메서드를 호출하면 Kestrel이 지정한 포트에서 수신 대기합니다.
Web.config의 ANCM 옵션 구성하기
ASP.NET Core 모듈의 구성은 응용 프로그램의 루트 폴더에 위치한 Web.config 파일에 저장됩니다. 이 파일의 설정은 ASP.NET Core 응용 프로그램을 시작하는 시작 명령과 인수를 가리킵니다. 예제 Web.config 코드 및 구성 옵션에 대한 설명은 ASP.NET Core Module Configuration Reference 문서를 참고하시기 바랍니다.
개발시 IIS Express로 실행하기
IIS Express는 Visual Studio에서 ASP.NET Core 템플릿에 정의된 기본 프로필을 이용해서 시작할 수 있습니다.
다음 단계
보다 자세한 내용은 다음 문서를 참고하시기 바랍니다:
- ASP.NET Core 기본 개요 2017-05-30 08:00
- ASP.NET Core와 응용 프로그램 Startup 클래스 2017-05-31 08:00
- ASP.NET Core 미들웨어의 기초 2017-06-01 08:00
- ASP.NET Core에서 정적 파일 서비스하기 2017-06-02 08:00
- ASP.NET Core의 오류 처리 살펴보기 2017-06-14 08:00
- 다양한 환경에서 작업하기 2017-08-21 08:00
- ASP.NET Core 구성하기 2017-08-28 08:00
- ASP.NET Core 파일 공급자 2017-09-04 08:00
- ASP.NET Core의 세션 및 응용 프로그램 상태 2017-09-11 08:00
- ASP.NET Core의 호스팅 살펴보기 2017-09-18 08:00
- ASP.NET Core의 웹 서버 구현 2017-09-25 08:00
- ASP.NET Core의 Kestrel 웹 서버 구현 살펴보기 2017-10-02 08:00
- ASP.NET Core 모듈 살펴보기 2017-10-09 08:00
- ASP.NET Core의 WebListener 웹 서버 구현 2017-10-16 08:00
- ASP.NET Core의 HTTP.sys 웹 서버 구현 2017-10-23 08:00
- ASP.NET Core의 요청 기능 2017-10-30 08:00
- ASP.NET Core와 URL 재작성 미들웨어 2018-05-07 08:00