아파치의 동작중 우리가 주의깊게 살펴봐야하는 부분은 첫째 아파치의 Configuraion을 읽어오는 부분, 둘째 실제로 통신이 일어나는 Request loop 이렇게 두가지 측면이 아닐까 싶다.

이 두가지 측면을 이해하기 위해서는 HTTP가 일어나는 phase(단계)와 아파치서버를 구성하는 각각의 module(모듈)에 대한 이해가 있어야 한다.

phase란 아파치서버가 시작되고, 사용자가 브라우져를 통해 웹서버에 정보를 요청하고 웹서버에서 정보를 받아가는, 그리고 종국적으로는 웹서버가 종료하기까지의 과정을 시간적 측면에서 나누어 놓은 분류를 말한다.

예를 들면 시작단계, 환경설정 읽어 오는 단계, 요청받는단계, 요청처리하는 단계, 요청보내는단계, 서버종료하는단계 등을 들 수 있겠다.

두번째로 모듈이란 아파치서버를 기능별로 나눈 분류를 말한다. URI(흔히 말하는 주소, http://daum.net/test.html)를 해석하는 모듈,
html을 처리하는 모듈,mime타입을 해석하는 모듈,php를 처리하는 모듈 등등이 그 예이다.


각각의 모든 모듈(module)은 모든 단계(phase)에서 동작할 수 있도록 구성되어 있다.

php모듈, URI해석하는 모듈,html해석모듈 등등의 모든 모듈들은 서버 시작단계,요청받는 단계,요청처리 단계에서 해야 할 일에 대해 정의한다. 만약 그 단계에서 할 일이 없다면 해당단계의 일을 정의하지 않으면 된다.

아파치서버는 모듈 하나하나의 기능이 합쳐져 웹서버란 역할을 하고, 각각의 모듈은 아파치서버가 시작하고,환경설정파일을 적용하고, 사용자 요청을 받고,요청을 처리하고, 요청에 대한 응답을 보내고,종료되는 웹을 통해 이뤄지는 단계들을 처리해야 한다.

잘 이해가 되지 않는다면 다시 한번 위에 쓴 글을 읽어보쌞~
아파치모듈플밍에 대해 알아보자.

[단계를 그림으로나타내면]


################################################
## 각 phase에서 일어나는 일을 간단히 정리해보면##
################################################
1.Server Startup and Configuration
- 모든 모듈은 런타임에 Global top_module을 root로 하는 linked list에 적재된다. 아파치는 어떤 단계(phase)에서 어떤 모듈이 작동되어야 하는지 module structure를 보고 알 수 있다.

예-1) turbo08 모듈의 module structure. 각 단계(phase)에 대한 정의를 하고 있다.

module MODULE_VAR_EXPORT turbo08_module =
{
STANDARD_MODULE_STUFF,
NULL, /* module initializer */
NULL, /* per-directory config creator */
NULL, /* dir config merger */
NULL, /* server config creator */
NULL, /* server config merger */
NULL, /* config directive table */
turbo08_handlers, /* [9] content handlers */
NULL, /* [2] URI-to-filename translation */
NULL, /* [5] check/validate user_id */
NULL, /* [6] check user_id is valid *here* */
NULL, /* [4] check access by host address */
NULL, /* [7] MIME type checker/setter */
NULL, /* [8] fixups */
NULL, /* [10] logger */
NULL, /* [3] header parser */
NULL, /* process initialization */
NULL, /* process exit/cleanup */
NULL /* [1] post read_request handling */
};

- 아파치서버가 시작될 때, 모든 리소스를 초기화하고, 설정파일의 지시자(directive)를 각 모듈에 해당되는 command table의 prototype에 따라 해석한다. 각각의 모듈들은 자신에게 맞는 설정 지시자를 가지고 있다. 예-1의 turbo08의 모듈같은 경우, config directive table 이 부분에 지시자를 정의함으로써 httpd.conf 에 적힌 지시자를 인식할 수 있다.


2. Module Initialization
- 이 작업은 서버가 시작할때 하는 것이고, 모듈 데이터를 초기화하고, 모듈에 사용되는 설정지시자를 인식한다.

- 예-1)의 module structure 에 module initializer가 정의되어 있다면, 모듈초기화하는 단계에서 정의된 일을 하게 될 것이다.
하지만 예-1)에는 module initializer가 정의되어있지 않기 때문에 turbo08 모듈은 모듈초기화 단계에서 아무런 일을 하지 않을 것이다.


3. Child Initialization


4. Request Loop



우리가 소스코드를 바꾸거나 모듈을 추가함으로써 가장많은 변화를 느끼는 부분. 실제로 HTTP프로토콜로 USER-AGENT(익스플러등)과 통신하는 부분이다.

아파치가 Request를 받으면 크게 8단계의 일을 한다.

1) What is if for? (URI translation)
- mod_alias( translation handler )
mod_alias 모듈이 우선 Alias, ScriptAlias, Redirect 등의 지시자에 따라 URI를 physical file path와 부가정보를 먼저 분리해낸다.
mod_alias 작업을 마치면 http_core에서 DocumentRoot값을 가져와서 URI와 비교하여 URI를 physical file path와 부가정보로 분리한다.

2) Where is it coming from? (access control phase)

3) Who is it coming from? (authentication phase)

4) Who is allowed to perform this particular request? (authorization phase)

5) What is the document's type? (MIME type checking phase)
- 파일의 확장자와 MIME table을 비교해서 해당 파일을 다룰 content handler를 결정한다.

확장자가 없는 디렉토리일경우, MIME TYPE은 "magic" MIME(DIR_MAGIC_TYPE)이 되고, 기본적으로 디렉토리 리스트를 보여준다.
mod_mime_magic 모듈을 설치했다면, 파일의 몇 byte를 content type을 정하기위해 비교한다.

runtime에 handler를 사용하기위해 AddHandler, SetHandler를 사용한다. 이것은 core에서 지원하는 것이 아니라 mod_action에 의해 지원되고, mod_action은 default로 설치가 된다.

6) Who will generate the content for this document? (response phase)

7) Who's going to log this transaction? (logging phase)

8) Who's going to clean up? (cleanup phase)


5. Child Exit
Posted by 백구씨쥔장
,