Apache HTTP Server Version 2.0
apxs - APache eXtenSion 도구
apxs
는 아파치 하이퍼텍스트 전송 프로토콜
(HTTP) 서버의 확장모듈을 컴파일하고 설치하는 도구이다. 이
도구는 여러 소스와 오브젝트파일을 가지고,
mod_so
의 LoadModule
지시어로 실행중에
아파치 서버로 읽어들일 수 있는 동적공유객체(DSO)를 만든다.
그래서 이런 확장방식을 사용하려면 플래폼이 DSO 기능을
지원하고 아파치 httpd
실행파일을
mod_so
모듈과 같이 컴파일해야 한다.
apxs
도구는 이 조건이 만족하지않으면 실행하지
않는다. 직접 명령어를 실행하여 조건이 만족하는지 알아볼
수 있다
$ httpd -l
목록에 mod_so
모듈이 나와야 한다. 조건을
만족하면 apxs
도구로 DSO 모듈을 설치하여
아파치서버의 기능을 쉽게 확장할 수 있다:
$ apxs -i -a -c mod_foo.c
gcc -fpic -DSHARED_MODULE -I/path/to/apache/include -c mod_foo.c
ld -Bshareable -o mod_foo.so mod_foo.o
cp mod_foo.so /path/to/apache/modules/mod_foo.so
chmod 755 /path/to/apache/modules/mod_foo.so
[activating module `foo' in /path/to/apache/etc/httpd.conf]
$ apachectl restart
/path/to/apache/sbin/apachectl restart: httpd not running, trying to start
[Tue Mar 31 11:27:55 1998] [debug] mod_so.c(303): loaded module foo_module
/path/to/apache/sbin/apachectl restart: httpd started
$ _
아규먼트 files에는 C 소스파일 (.c) 이나
오브젝트파일 (.o), 라이브러리모음 (.a)을 사용할 수 있다.
apxs
도구는 확장자를 보고 자동으로 C 소스파일은
컴파일하고, 오브젝트와 모음파일은 링크에만 사용한다. 그러나
컴파일한 오브젝트를 사용하려면 동적으로 읽어들일 수 있는
공유객체로 사용하기위해 반드시 오브젝트를 위치독립코드(PIC,
position independent code)로 컴파일해야 한다. GCC의 경우
-fpic
을 사용하면 된다. 다른 C 컴파일러는 설명서를
참고하거나 apxs
가 오브젝트파일을 컴파일할때
사용하는 옵션을 참고하라.
아파치의 DSO 지원에 대한 더 자세한 내용은
mod_so
문서를 참고하거나
src/modules/standard/mod_so.c
소스파일을 읽어봐라.
개요
apxs -g
[ -S name=value ]
-n modname
apxs -q
[ -S name=value ]
query ...
apxs -c
[ -S name=value ]
[ -o dsofile ]
[ -I incdir ]
[ -D name=value ]
[ -L libdir ]
[ -l libname ]
[ -Wc,compiler-flags ]
[ -Wl,linker-flags ]
files ...
apxs -i
[ -S name=value ]
[ -n modname ]
[ -a ]
[ -A ]
dso-file ...
apxs -e
[ -S name=value ]
[ -n modname ]
[ -a ]
[ -A ]
dso-file ...
옵션
공통 옵션
-n modname
-i
(install)과-g
(template generation) 옵션을 사용할때 직접 모듈명을 지정한다. 이 옵션을 사용하여 모듈명을 직접 지정한다.-g
옵션을 사용한다면 이 옵션을 반드시 사용해야하고,-i
옵션을 사용한다면apxs
도구는 소스나 (마지막 시도로) 파일명을 가지고 이름을 추측한다.
질의 옵션
-q
apxs
의 설정값을 알아낸다. query에는 다음을 사용할 수 있다:CC
,CFLAGS
,CFLAGS_SHLIB
,INCLUDEDIR
,LD_SHLIB
,LDFLAGS_SHLIB
,LIBEXECDIR
,LIBS_SHLIB
,SBINDIR
,SYSCONFDIR
,TARGET
.설정을 직접 알아낼때 사용한다.
INC=-I`apxs -q INCLUDEDIR`
예를 들어, 아파치 C 헤더파일을 직접 접근한다면 Makefile에서 위와 같이 사용한다.
설정 옵션
-S name=value
- 이 옵션은 위에서 설명한 apxs 설정을 변경한다.
견본(template) 생성 옵션
-g
- 하위디렉토리 name을 만들고 (
-n
옵션 참고) 그곳에 파일 두개를 만든다: 한 파일은mod_name.c
라는 견본 모듈소스파일로, 자신의 모듈을 만들때 견본으로 사용하거나 apxs 기능을 시험해볼때 사용한다. 다른 파일은 이 모듈을 쉽게 컴파일하고 설치하기위한Makefile
이다.
DSO 컴파일 옵션
-c
- 컴파일을 지시한다. 먼저 files에서 C
소스파일들(.c)을 오브젝트파일(.o)로 컴파일하고,
files의 나머지 오브젝트파일들(.o과 .a)과
링크하여 동적공유객체 dsofile을 만든다.
-o
옵션을 사용하지않으면 files의 첫번째 파일명에서 이름을 추측하여 보통mod_name.so
를 사용한다. -o dsofile
- 생성할 동적공유객체 파일명을 직접 지정한다. 이름을
지정하지않고 files 목록에서 이름을 추측하지
못하면 마지막으로
mod_unknown.so
를 이름으로 사용한다. -D name=value
- 이 옵션을 컴파일 명령어로 직접 전달한다. 컴파일때 자신의 define을 추가한다.
-I incdir
- 이 옵션을 컴파일 명령어로 직접 전달한다. 컴파일때 include를 찾을 디렉토리를 추가한다.
-L libdir
- 이 옵션을 링커 명령어로 직접 전달한다. 컴파일때 라이브러리를 찾을 디렉토리를 추가한다.
-l libname
- 이 옵션을 링커 명령어로 직접 전달한다. 컴파일때 사용할 라이브러리를 추가한다.
-Wc,compiler-flags
- 이 옵션은 추가 옵션 compiler-flags를 컴파일 명령어로 전달한다. 컴파일러 특유의 옵션을 추가할때 사용한다.
-Wl,linker-flags
- 이 옵션은 추가 옵션 linker-flags를 링커 명령어로 전달한다. 링커 특유의 옵션을 추가할때 사용한다.
DSO 설치과 설정 옵션
-i
- 설치를 지시한다. 여러 동적공유객체를 서버의 modules 디렉토리에 설치한다.
-a
- 아파치
httpd.conf
설정파일에 적절한LoadModule
줄을 추가하거나 이미 있다면 활성화하여 모듈을 사용하도록 만든다. -A
-a
와 비슷하지만,LoadModule
지시어 앞에 우물정자(#
)를 붙인다. 즉, 현재는 사용하지않지만 나중에 사용할 수 있도록 모듈을 준비한다.-e
- 편집을 지시한다.
-a
혹은-A
옵션과 같이 사용할 수 있으며,-i
명령과 비슷하지만 모듈을 설치하지않고 아파치httpd.conf
설정파일만 편집한다.
예제
아파치서버의 기능을 확장하는 mod_foo.c
라는
아파치 모듈이 있다고 가정하자. 먼저 다음 명령어를 사용하여
C 소스를 아파치 서버가 읽어들일 공유객체로 컴파일한다:
$ apxs -c mod_foo.c
gcc -fpic -DSHARED_MODULE -I/path/to/apache/include -c mod_foo.c
ld -Bshareable -o mod_foo.so mod_foo.o
$ _
그리고 이 공유객체를 읽어들이는 LoadModule
지시어를 아파치
설정에 추가한다. apxs
는 자동으로 공유객체를
"modules" 디렉토리에 설치하고 httpd.conf
파일을
알맞게 수정하여 간단히 작업을 마친다. 다음 같이 실행한다:
$ apxs -i -a mod_foo.c
cp mod_foo.so /path/to/apache/modules/mod_foo.so
chmod 755 /path/to/apache/modules/mod_foo.so
[activating module `foo' in /path/to/apache/etc/httpd.conf]
$ _
그러면 다음과 같은 줄을
LoadModule foo_module modules/mod_foo.so
설정파일에 없다면 추가한다. 이 설정을 기본적으로 사용하지
않는다면 -A
옵션을 사용한다. 즉
$ apxs -i -A mod_foo.c
apxs를 쉽게 사용하려고 다음과 같이 아파치 모듈 견본과 Makefile을 만들 수 있다:
$ apxs -g -n foo
Creating [DIR] foo
Creating [FILE] foo/Makefile
Creating [FILE] foo/mod_foo.c
$ _
그런후 바로 견본 모듈을 공유객체로 컴파일하여 아파치 서버가 읽도록한다:
$ cd foo
$ make all reload
apxs -c mod_foo.c
gcc -fpic -DSHARED_MODULE -I/path/to/apache/include -c mod_foo.c
ld -Bshareable -o mod_foo.so mod_foo.o
apxs -i -a -n "foo" mod_foo.so
cp mod_foo.so /path/to/apache/modules/mod_foo.so
chmod 755 /path/to/apache/modules/mod_foo.so
[activating module `foo' in /path/to/apache/etc/httpd.conf]
apachectl restart
/path/to/apache/sbin/apachectl restart: httpd not running, trying to start
[Tue Mar 31 11:27:55 1998] [debug] mod_so.c(303): loaded module foo_module
/path/to/apache/sbin/apachectl restart: httpd started
$ _
심지어 아파치 소스 밖에서 apxs
를 사용하여
PHP3와 같이 복잡한 모듈을 컴파일할 수 있다:
$ cd php3
$ ./configure --with-shared-apache=../apache-1.3
$ apxs -c -o libphp3.so mod_php3.c libmodphp3-so.a
gcc -fpic -DSHARED_MODULE -I/tmp/apache/include -c mod_php3.c
ld -Bshareable -o libphp3.so mod_php3.o libmodphp3-so.a
$ _
apxs
는 자동으로 C 소스파일과 오브젝트파일을
구별한다. C 소스파일만 컴파일하고 나머지 오브젝트파일은
링크할때 사용한다.