Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Programs

#### Please note

This document refers to a legacy release (2.2) of Apache httpd. The active release (2.4) is documented here. If you have not already upgraded, please follow this link for more information.

You may follow this link to go to the current version of this document.

# apxs - APache eXtenSion 도구

가능한 언어: en | ko | tr

이 문서는 최신판 번역이 아닙니다. 최근에 변경된 내용은 영어 문서를 참고하세요.

`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

- Comments

## 개요

`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를 `libtool --mode=compile` 명령어로 전달한다. 컴파일러 특유의 옵션을 추가할때 사용한다.
`-Wl,linker-flags`
  이 옵션은 추가 옵션 linker-flags를 `libtool --mode=link` 명령어로 전달한다. 링커 특유의 옵션을 추가할때 사용한다.

### 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
/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" 디렉토리에 설치하고 `httpd.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/httpd.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/httpd.conf에서 `foo' 모듈을 활성화한다]
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
$ _`

가능한 언어: en | ko | tr

## Comments

Notice:
This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed again by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Freenode, or sent to our mailing lists.