Apache HTTP Server Version 2.0

Apache > HTTP Server > Documentation > Version 2.0 > 모듈

# 아파치 모듈 mod_so

가능한 언어: en | ja | ko

설명: | 시작할때 혹은 재시작할때 실행가능한 코드와 모듈을 서버로 읽어들인다
상태: | Extension
모듈명: | so_module
소스파일: | mod_so.c
지원: | 윈도우즈에서 (항상 포함하는) Base 모듈이다.

### 요약

몇몇 운영체제에서 아파치는 동적공유객체 (DSO) 기술을 사용하여 서버를 다시 컴파일하지 않고도 실행중에 모듈을 읽어들일 수 있다.

읽어들일 코드는, 유닉스에서는 (`.so` 확장자를 가진) 일반적인 공유객체파일이고, 윈도우즈에서는 `.so` 혹은 `.dll` 확장자를 가진다.

### 경고

아파치 1.3 모듈을 아파치 2.0에서 사용할 수 없다. 아파치 2.0이 동적으로 읽어들이거나 아파치와 같이 컴파일하려면 모듈을 수정해야 한다.

### 지시어들

### 주제

- 윈도우즈에서 읽어들일 모듈 만들기

## 윈도우즈에서 읽어들일 모듈 만들기

### 주의

윈도우즈의 모듈명 형식은 아파치 1.3.15와 2.0에서 변경되었다. 모듈명은 이제 mod_foo.so식이다.

mod_so는 아직도 ApacheModuleFoo.dll 식의 모듈을 읽어들일 수 있지만, 새로운 이름 규칙을 선호한다. 모듈을 2.0에 맞게 수정한다면 이름을 2.0 규칙에 알맞게 고치길 바란다.

아파치 모듈 API는 유닉스 버전이거나 윈도우즈 버전이거나 같다. 몇몇 API는 윈도우즈에 없는 유닉스 구조에 의존하기때문에 사용할 수 없지만, 유닉스에서 실행되는 많은 모듈을 수정없이 혹은 조금 수정하여 윈도우즈에서 사용할 수 있다.

모듈은 두가지 방법으로 서버에 추가할 수 있다. 유닉스에서는 모듈을 서버와 같이 컴파일할 수 있다. 윈도우즈용 아파치는 유닉스와 달리 `Configure` 프로그램이 없기때문에 모듈의 소스파일을 ApacheCore 프로젝트 파일에 추가하고, 심볼을 `os\win32\modules.c` 파일에 추가해야 한다.

두번째 방법은 모듈을 서버가 ``LoadModule`` 지시어를 사용하여 시작할때 읽어들일 수 있는 공유라이브러리 DLL로 만드는 것이다. 이 모듈 DLL을 배포하면 서버를 재컴파일하지 않고 어떤 윈도우즈용 아파치에서도 모듈을 사용할 수 있다.

모듈 DLL을 만들기위해서는 모듈의 소스파일을 조금 수정해야 한다. DLL은 module record를 export해야 한다. (아래 참고) 이를 위해 모듈의 module record 정의에 (아파치 헤더파일에 정의된) `AP_MODULE_DECLARE_DATA`를 추가한다. 예를 들어, 다음과 같은 모듈이 있다면:

`module foo_module;`

다음과 같이 수정한다:

`module AP_MODULE_DECLARE_DATA foo_module;`

이 부분은 윈도우즈에서만 사용하기때문에 변경하여도 유닉스에서 소스를 그대로 사용할 수 있다. 또, `.DEF` 파일에 익숙하다면 대신 이 파일을 사용하여 module record를 export할 수도 있다.

이제 모듈을 포함한 DLL을 만든다. 이를 공유라이브러리 libhttpd.dll을 컴파일할때 만든 libhttpd.lib export 라이브러리와 링크한다. 아파치 헤더파일을 올바로 찾도록 컴파일러 설정을 수정해야 할지도 모른다. 서버의 modules 디렉토리에서 이 라이브러리를 찾을 수 있다. 컴파일환경을 올바로 설정하기위해 기존 모듈의 .dsp 파일을 가져다 쓰거나 직접 만든 .dsp와 컴파일러/링커 옵션을 비교하는 것이 좋다.

이제 모듈을 DLL로 만든다. 이것을 서버의 `modules` 디렉토리에 두고, `LoadModule` 지시어를 사용하여 읽어들인다.

## LoadFile 지시어

설명: | 지정한 목적파일이나 라이브러리를 읽어들인다
문법: | `LoadFile filename [filename] ...`
사용장소: | 주서버설정
상태: | Extension
모듈: | mod_so

LoadFile 지시어는 서버가 시작하거나 재시작할때 지정한 목적파일이나 라이브러리를 읽어들인다(link in). 이 지시어는 어떤 모듈이 동작하기위해 필요한 코드를 추가로 읽어들일때 사용한다. Filename은 절대경로이거나 ServerRoot에 대한 상대경로이다.

예를 들어:

`LoadFile libexec/libxmlparse.so`

## LoadModule 지시어

설명: | 목적파일이나 라이브러리를 읽어들이고, 사용가능한 모듈 목록에 추가한다
문법: | `LoadModule module filename`
사용장소: | 주서버설정
상태: | Extension
모듈: | mod_so

LoadModule 지시어는 목적파일 혹은 라이브러리 filename을 읽어들이고, 사용가능한 모듈 목록에 module이라는 모듈 구조체를 추가한다. Module은 파일의 `module` 자료형 외부변수명이며, 모듈 문서의 모듈명에 나온다. 예를 들면:

`LoadModule status_module modules/mod_status.so`

ServerRoot의 modules 하위디렉토리에서 지정한 모듈을 읽어들인다.

가능한 언어: en | ja | ko