IIS 가 웹 리소스 요청을 받았을때 처리 하는 방식에 대해 기술 합니다.
IIS 5.x 버전과 IIS 6.0 을 비교하여 설명 합니다.
IIS 웹 서버를 기반으로 하는 프로젝트를 수행 할 경우 이와 같은 IIS 실행 흐름을 자세히 익혀둘 필요가 있습니다.
[1] IIS 5.x 에서의 웹 리소스 처리 아키텍처

1. 클라이언트의 모든 HTTP 요청은 IIS의 실행프로세스인 inetinfo.exe 가 받아 들인다. inetinfo는 요청 리소스의
형식을 확인하여 확장자와 매핑되어 있는 ISAPI Extension 모듈로 요청을 전달한다.
(ex: asp -> asp.dll , aspx,asmx,ashx -: aspnet_isapi.dll)
만일 txt,이미지,스크립트 없는 asp 파일이 요청되었다면 inetinfo는 외부 모듈 연계 없이 직접 처리한다.
2. aspnet_isapi.dll 은 닷넷 웹 리소스를 직접 처리 하지 않고ASP.NET Worker Process 인 aspnet_wp.exe 에게로
요청을 전달하는 dispatcher 로 서의 역할을 수행한다.
3. aspnet_isapi.dll 과 aspnet_wp.exe 사이의 연결은 프로세스 경계를 넘어 데이터를 전송하기 위한 Win32
메커니즘 인 명명 파이프를 통해 이루어 진다.
4. ASP.NET Worker Process 인 aspnet_wp.exe 는 닷넷공용언어런타임(CLR)을 호스트 하며 HTTP 파이프라인을
활성화 해서 웹 리소스의 실제 처리를 시작한다.
5. 각 웹 응용프로그램들은 Worker Process 의 가상 디렉터리로 식별되며, AppDomain 이라는 응용프로그램
도메인에 속하게 된다. 즉, 각각의 웹 응용프로그램들은 논리적으로 격리됨을 알 수 있다.
다시 말해 응용 프로그램 설정(Application,Session,Cache등이 공유 되지 않는다.
AppDomain 은 Win32 내의 프로세스 분리와 유사한 방식으로 서로 분리되고, 격리 되어 진다. CLR 은 서로 다른
AppDomain 내에 있는 개체들 사이의 직접적인 호출을 막음으로써 격리를 강제한다.
(여기서 웹 응용프로그램이라 함은 웹 사이트 혹은 응용프로그램으로 구성된 웹사이트 하위 가상 디랙터리를
말한다)
6. 기본적으로 모든 활성 웹 응용프로그램들은 하나의 Worker process에서 호스트 한다.
그러나 멀티 CPU를 가진 웹 서버라면 다중 Worker process 가실행되도록 할 수 있다(웹 가든)
machine.config 파일의 <processModel> 섹션의 webGarden 속성을 true 로 설정하고 cpuMask 속성을
비트 마스크값으로 지정
[1] IIS 6.0 에서의 웹 리소스 처리 아키텍처

1. 클라이언트의 모든 HTTP 요청은 커널 모드에서 작동하는http.sys 디바이스 드라이버가 받아 들인다.
http.sys 리스너는 요청을 적절한 응용프로그램 풀 요청 대기열에 배치한다.
다수의 웹 응용프로그램들이 하나의 응용프로그램 풀을 사용하더라도 응용프로그램 풀의 요청 대기열은 오직
하나이다
2. 응용프로그램 풀은 worker process 와 가상디렉터리를 구별한다. 요청을 올바른 worker process 로 보내기 위해
http.sys 매퍼가 사용하는 논리 프로세스 경계에 의해 정의되는 구성 개체이다.
3. WAS는 메타베이스와 응용프로그램 풀을 관리하는 중추적인 역할을 담당한다
(WAS 는 Worker Process 를 생성,관리한다)
이 프로세스는 공유되지 않는 svchost.exe의 사용자 모드에서 Local System 권한으로 실행된다.
또한 worker process 의 모니터링, 리사이클링 등 관리를 담당한다
4. IIS 6.0 의 메타베이스는 XML 기반의 파일로 관리된다. WAS 는 이 메타베이스의 변경사항을 실시간으로 반영한다
5. 닷넷 웹 리소스를 처리하기 위한 worker process 는 더 이상 aspnet_wp.exe 가 아닌 w3wp.exe 이다.
W3wp.exe 는 응용프로그램 풀 대기열로부터 요청을 읽어온다. W3wp.exe 는 또한 asp 와 같은 닷넷
이전버전의 웹 리소스도 처리한다.
6. inetinfo.exe 에서 호스트 되었던 aspnet_isapi.dll 은 이제 w3wp 라는 worker process 가 로드 한다.
aspnet_isapi.dll 은 CLR 을 로드하고 파이프라인을 시작한다.
※ IIS6.0에서는 WWW 서비스가 더 이상 inetinfo.exe 프로세스에 호스트 되지 않고 별도의 작업자 프로세서인
w3wp.exe 에 의해 처리된다. 단, 요청 프로세스 설정, FTP,SMTP,NNTP,IIS Admin 와 같은 서비스는 여전히
inetinfo.exe에서 호스트 한다
참고> 커널 모드(Kernel Mode)와 사용자 모드(User Mode)
커널 모드는 컴퓨터의 모든 메모리에 접근할 수 있고 다른 어플리케이션의 프로세스로부터 격리된 메모리 공간에서
실행된다. 커널 모드 구성요소만이 하드웨어와 같은 리소스에 직접 접근이 가능하다. 반면 어플리케이션과 이를 지원하는 서브시스템은 사용자 모드에서 실행된다. 사용자 모드의 프로세스는 직접 자원에 접근할 수 없으며 자원에 대한 접근 요구가 커널 모드 구성 요소에 의해 허가되어야 한다.