Apache HTTP Server Version 2.4
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/apache2.conf]
$ apache2ctl restart
/path/to/apache/sbin/apache2ctl 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/apache2ctl 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
-g
-n
옵션 참고) 그곳에 파일 두개를 만든다: 한 파일은
mod_name.c
라는 견본 모듈소스파일로,
자신의 모듈을 만들때 견본으로 사용하거나 apxs 기능을
시험해볼때 사용한다. 다른 파일은 이 모듈을 쉽게 컴파일하고
설치하기위한 Makefile
이다.-c
-o
옵션을 사용하지않으면 files의
첫번째 파일명에서 이름을 추측하여 보통
mod_name.so
를 사용한다.-o dsofile
mod_unknown.so
를 이름으로
사용한다.-D name=value
-I incdir
-L libdir
-l libname
-Wc,compiler-flags
libtool --mode=compile
명령어로 전달한다.
컴파일러 특유의 옵션을 추가할때 사용한다.-Wl,linker-flags
libtool --mode=link
명령어로 전달한다. 링커
특유의 옵션을 추가할때 사용한다.-i
-a
apache2.conf
설정파일에 적절한
LoadModule
줄을
추가하거나 이미 있다면 활성화하여 모듈을 사용하도록
만든다.-A
-a
와 비슷하지만, LoadModule
지시어 앞에
우물정자(#
)를 붙인다. 즉, 현재는
사용하지않지만 나중에 사용할 수 있도록 모듈을 준비한다.-e
-a
혹은 -A
옵션과 같이 사용할 수 있으며, -i
명령과
비슷하지만 모듈을 설치하지않고 아파치
apache2.conf
설정파일만 편집한다.아파치서버의 기능을 확장하는 mod_foo.c
라는
아파치 모듈이 있다고 가정하자. 먼저 다음 명령어를 사용하여
C 소스를 아파치 서버가 읽어들일 공유객체로 컴파일한다:
$ apxs -c mod_foo.c
/path/to/libtool --mode=compile gcc ... -c mod_foo.c
/path/to/libtool --mode=link gcc ... -o mod_foo.la mod_foo.slo
$ _
그리고 이 공유객체를 읽어들이는 LoadModule
지시어를 아파치
설정에 추가한다. apxs
는 자동으로 공유객체를
"modules" 디렉토리에 설치하고 apache2.conf
파일을
알맞게 수정하여 간단히 작업을 마친다. 다음 같이 실행한다:
$ apxs -i -a mod_foo.la
/path/to/instdso.sh mod_foo.la /path/to/apache/modules
/path/to/libtool --mode=install cp mod_foo.la /path/to/apache/modules
...
chmod 755 /path/to/apache/modules/mod_foo.so
[/path/to/apache/conf/apache2.conf에서 `foo' 모듈을 활성화한다]
$ _
그러면 다음과 같은 줄을
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/modules.mk
Creating [FILE] foo/mod_foo.c
Creating [FILE] foo/.deps
$ _
그런후 바로 견본 모듈을 공유객체로 컴파일하여 아파치 서버가 읽도록한다:
$ cd foo
$ make all reload
apxs -c mod_foo.c
/path/to/libtool --mode=compile gcc ... -c mod_foo.c
/path/to/libtool --mode=link gcc ... -o mod_foo.la mod_foo.slo
apxs -i -a -n "foo" mod_foo.la
/path/to/instdso.sh mod_foo.la /path/to/apache/modules
/path/to/libtool --mode=install cp mod_foo.la /path/to/apache/modules
...
chmod 755 /path/to/apache/modules/mod_foo.so
[/path/to/apache/conf/apache2.conf에서 `foo' 모듈을 활성화한다]
apache2ctl restart
/path/to/apache/sbin/apache2ctl 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/apache2ctl restart: httpd started
$ _