컴퓨터이야기/APACHE

2. Apache Content Handler

백구씨쥔장 2005. 1. 24. 20:23
아파치서버는 별개의 모듈들이 유기적으로 작동하여 하나의 Request를 처리한다.

Content Handler 라는 것은 아파치서버가 사용자에게 Response를 보내기 전에 요청파일의 확장자를 보고, 확장자에 맞는 임의의 작업을 하는 루틴을 말한다.

예를 들어 아파치웹서버가 http://127.0.0.1/a.php 라는 요청(Request)을 받게 되면, 아파치웹서버는 우선 이 URI를 파일시스템에 쉽게 매칭시키기 위해 URI 정보를 해석하고 결국 a.php 라는 파일을 요청한다는 것을 알게 될 것이다. 그리고 아파치웹서버는 a.php 라는 파일을 파일 시스템에서 찾을 테고, 그 다음 .php라는 확장자가 붙은 것을 보고 php라는 확장자를 처리할 Content Handler 찾게 된다.

php가 아파치모듈로 설치되어 있는 아파치서버의 httpd.conf 설정파일을 열어보면,

AddType application/x-httpd-php .php

와 같은 설정구문을 찾아볼 수 있을 것이다.

이것은 php확장자를 가진 파일을 "application/x-httpd-php"라는 Content Handler 에게 넘겨서 파일을 처리하라는 뜻이다.

만약 http://localhost/a.asp 라는 요청(Request)을 받게되었면, 위와 비슷하게 .asp라는 확장자에 맞는 Content Handler를 찾아서 파일을 그 Handler에게 넘기게 될 것이다.


아주 간단한 Content Handler 모듈을 만들어보자~!!

우선 DSO컴파일로 모듈을 붙이겠다. 컴파일에 관한 글은 다음에 ^^;; 자세히 하기로 하고, 여기서는 간단히 컴파일하는 방법만 알아보자.

1. 아파치소스( http://ftp.apache-kr.org/httpd/apache_1.3.33.tar.gz )를 받아서 자신의 디렉토리에 압축을 푼다. 그리고 DSO를 지원하게 컴파일 한다.

/home/turbo08 폴더에 압축을 풀면 아파치의 디렉토리 레이아웃은 다음과 같을 것이다.

+ /home/turbo08/apache_1.3.33/
+ ./logs
+ ./support
+ ./src
+ ./main
+ ./modules
.. etc

bash#cd /home/turbo08/apache_1.3.33
bash#./configure --prefix=/usr/local/apache --enable-module=so
bash#make
bash#make install


/usr/local/apache에 아파치가 설치된다.


2. 모듈의 Skeleton을 만든다.

모듈의 Skeleton을 만들기위해서는 /usr/local/apache/bin폴더 밑에 apxs명령어를 사용하면 된다.
/usr/local/apache/bin/apxs -g -n 모듈이름

예) 모듈이름이 turbo08일 경우
bash#cd /home/turbo08/apache_1.3.33/src/modules
bash#/usr/local/apache/bin/apxs -g -n turbo08


이렇게 명령어를 실행하면 /home/turbo08/apache_1.3.33/src/modules/밑에 turbo08이란 디렉토리가 생성되고, 그 안에 Makefile 파일과 mod_turbo08.c 파일이 생성될 것이다.

mod_turbo08.c 소스를 잠깐 살펴보면 별거 없다.

turbo08_handler 라는 Content Handler하나가 정의되어 있고, 이 핸들러는 브라우져상에

The sample page from mod_turbo08.c


라고 출력하는 일을 한다.


#### mod_turbo08.c ####
[CODE] #include "httpd.h" #include "http_config.h" #include "http_protocol.h" #include "ap_config.h" /* The sample content handler */ static int turbo08_handler(request_rec *r) { r->content_type = "text/html"; ap_send_http_header(r); if (!r->header_only) ap_rputs("The sample page from mod_turbo08.c\n", r); return OK; } /* Dispatch list of content handlers */ static const handler_rec turbo08_handlers[] = { { "turbo08", turbo08_handler }, { NULL, NULL } }; /* Dispatch list for API hooks */ module MODULE_VAR_EXPORT turbo08_module = { STANDARD_MODULE_STUFF, NULL, /* module initializer */ NULL, /* create per-dir config structures */ NULL, /* merge per-dir config structures */ NULL, /* create per-server config structures */ NULL, /* merge per-server config structures */ NULL, /* table of config file commands */ turbo08_handlers, /* [#8] MIME-typed-dispatched handlers */ NULL, /* [#1] URI to filename translation */ NULL, /* [#4] validate user id from request */ NULL, /* [#5] check if the user is ok _here_ */ NULL, /* [#3] check access by host address */ NULL, /* [#6] determine MIME type */ NULL, /* [#7] pre-run fixups */ NULL, /* [#9] log a transaction */ NULL, /* [#2] header parser */ NULL, /* child_init */ NULL, /* child_exit */ NULL /* [#0] post read-request */ }; [/CODE]

3. so 파일 만들기.

bash#cd /home/turbo08/apache_1.3.33/src/modules/turbo08
bash#make


위와 같이 make를 통해 컴파일하면 mod_turbo08.so 파일이 생성될 것이다.

4. httpd.conf를 수정하여 모듈로드시키기

httpd.conf를 직접 수정하여도 되지만, 이를 대신해주는 명령이 있다.

/usr/local/apache/bin/apxs -i -a -n 모듈이름 mod_모듈이름.so

예) 모듈이름이 turbo08 일 경우,

bash#/usr/local/apache/bin/apxs -i -a -n turbo08 mod_turbo08.so

위와 같이 apxs를 실행하면 자동으로 httpd.conf에 다음과 같은 내용이 추가된다.

LoadModule turbo08_module libexec/mod_turbo08.so

모듈이 추가되었다면, 특정 MIME타입을 turbo08 Content Handler로 처리하겠다고 설정파일을 수정해줘야한다.

/usr/local/apache/conf/httpd.conf 파일을 열어서 turbo08 Handler를 다음과 같이 추가해주자.

<IfModule mod_alias.c>
.
.
#
# If you wish to use server-parsed imagemap files, use
#
#AddHandler imap-file map

#
# To enable type maps, you might want to use
#
#AddHandler type-map var

AddHandler turbo08 turbo08
</IfModule>


turbo08 이란 확장자를 가진 파일을 turbo08 Content Handler로 처리하겠다는 뜻이다.

5. 아파치 재시작

/usr/local/apache/bin/apachectl restart

[결과]


여기서 hasuni.com 은 제 개인 테스트 도메인입니다. -_-;;