apxs - APache eXtenSion 도구 - Apache HTTP Server

Apache HTTP Server Version 2.0

Apache > HTTP Server > Documentation > Version 2.0 > Programs

# apxs - APache eXtenSion 도구

가능한 언어: en | ko

`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` 소스파일을 읽어봐라.

### 참고

- apachectl
- httpd

## 개요

`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 소스파일만 컴파일하고 나머지 오브젝트파일은 링크할때 사용한다.

가능한 언어: en | ko