### Apache HTTP Server Version 2.0

# 컴파일과 설치

이 문서는 유닉스와 유닉스류 시스템에서 아파치를 컴파일하고 설치하는 것만을 다룬다. 윈도우즈에서 컴파일과 설치에 대해서는 마이크로소프트 윈도우즈에서 아파치 사용을 참고하라. 다른 플래폼에 대해서는 플래폼 문서를 참고하라.

아파치 2.0의 구성과 설치 환경은 1.3과 매우 다르다. 아파치 1.3은 쉬운 설치를 위해 자체 스크립트를 사용했다. 아파치 2.0은 이제 다른 여러 오픈소스 프로젝트와 비슷한 환경을 만들기위해 libtool과 autoconf를 사용한다.

- 성미 급한 사람을 위한 개요
- 요구사항
- 다운로드
- 압축 풀기
- 소스 트리 구성하기
  - 환경변수
  - autoconf 출력 옵션
  - 경로명
  - 모듈
  - Suexec
- 컴파일
- 설치
- 설정
- 검사

### 성미 급한 사람을 위한 개요

다운로드 | `$ lynx http://www.apache.org/dist/httpd/httpd-2_0_NN.tar.gz`
압축 풀기 | `$ gzip -d httpd-2_0_NN.tar.gz $ tar xvf httpd-2_0_NN.tar`
구성 | `$ ./configure --prefix=PREFIX`
컴파일 | `$ make`
설치 | `$ make install`
설정 | `$ vi PREFIX/conf/httpd.conf`
검사 | `$ PREFIX/bin/apachectl start`

NN은 현재 작은 버전 숫자로, PREFIX는 서버가 설치될 파일시스템 경로로 대체해야 한다. PREFIX를 지정하지 않으면 기본값으로 `/usr/local/apache2`가 사용된다.

아래에서 아파치 웹서버를 컴파일하고 설치하기위한 요구사항부터 각 컴파일과 설치 과정을 자세히 설명한다.

### 요구사항

아파치를 컴파일하기위해 다음과 같은 것들이 필요하다:

- 디스크 공간
  디스크 여유공간이 최소 50 MB 이상인지 확인하라. 설치후 아파치는 약 10 MB의 디스크 공간을 차지한다. 실제 필요한 디스크 공간은 선택한 구성 옵션과 추가 모듈에 따라 상당히 차이가 난다.
- ANSI-C 컴파일러와 컴파일 시스템
  ANSI-C 컴파일러가 설치되있는지 확인하라. Free Software Foundation (FSF)의 GNU C compiler (GCC)를 추천한다. (버전 2.7.2면 된다.) GCC가 없다면 최소한 사용하는 컴파일러가 ANSI 호환인지 확인하라. 추가로 `PATH` 환경변수는 `make`와 같은 기본적인 컴파일 도구를 포함해야 한다.
- 정확한 시간
  HTTP 프로토콜의 일부는 하루중 시간으로 표현된다. 그래서 이제 시스템의 시간 동기화 기능을 살펴볼 시간이다. 보통 이를 위해 Network Time Protocol (NTP)에 기반한 ntpdate나 xntpd를 사용한다. NTP 소프트웨어와 공개 시간 서버에 대한 정보는 뉴스그룹 comp.protocols.time.ntp와 NTP 홈페이지를 참고하라.
- Perl 5 [선택사항]
  (Perl로 쓰여진) apxs나 dbmmanage와 같은 지원 스크립트를 위해 Perl 5 인터프리터가 필요하다. (버전 5.003과 5.004면 된다.) `configure' 스크립트가 이런 인터프리터를 찾지 못해도 문제없이, 아파치 2.0을 컴파일하고 설치할 수 있다. 다만 지원 스크립트를 사용하지 못할 뿐이다. 여러 Perl 인터프리터가 설치되있다면 (아마도 살때 포함된 Perl 4와 직접 컴파일한 Perl 5) ./configure가 올바른 것을 찾기위해 --with-perl 옵션을 사용하길 바란다.

### 다운로드

아파치는 Apache Software Foundation 다운로드 사이트나 가까운 미러에서 다운로드할 수 있다.

`alpha`로 끝나는 버전은 이른 검사전 버전으로 동작하지 않을 수 있다. `beta`로 끝나는 버전은 더 믿을만 하지만 검사와 버그 수정을 더 해야할 버전이다. 실제 사용하기에 가장 나은 아파치 웹서버를 원한다면 파일명에서 `alpha`나 `beta`가 없는 가장 최근 버전을 선택하라.

다운로드후, 특히 미러 사이트를 사용했다면, 완전하고 변경되지않은 아파치 웹서버임을 확인하는 것이 중요하다. PGP 서명을 가지고 다운로드한 타볼을 검사하여 확인한다. 이는 두 과정을 거친다. 먼저 Apache 배포 사이트에서 `KEYS` 파일을 얻는다. (`KEYS` 파일 자체가 수정되지 않았음을 확인하기위해 이전 아파치 버전의 파일을 사용하거나 공개 키 서버에서 키를 가져오는 것은 좋은 생각이다.) 키를 (pgp 버전에 따라) 다음 명령어 중 하나로 개인적인 키 링에 포함한다:

> `$ pgp < KEYS`

혹은

> `$ gpg --import KEYS`

다음 과정은 Apache 웹사이트에서 얻은 PGP 서명을 가지고 타볼을 검사하는 일이다. 서명 파일 이름은 소스 타볼 파일명뒤에 `.asc`가 붙은 것이다. (또, pgp 버전에 따라) 다음 명령어중 하나로 배포본을 확인할 수 있다:

> `$ pgp httpd-2_0_NN.tar.gz.asc`

혹은

> `$ gpg --verify httpd-2_0_NN.tar.gz.asc`

다음과 같은 메세지가 나와야 한다.

> `Good signature from user "Martin Kraemer <martin@apache.org>".`

키 링에 포함된 신뢰관계에 따라 키와 키 서명자 사이의 관계를 확인할 수 없다는 메세지가 나올 수도 있다. 이는 당신이 `KEYS` 파일를 신뢰한다면 문제가 아니다.

### 압축 풀기

아파치 웹서버 타볼에서 소스를 푸는 일은 단순히 압축과 tar를 푸는 것이다:

> `$ gzip -d httpd-2_0_NN.tar.gz
> $ tar xvf httpd-2_0_NN.tar`

그러면 현재 디렉토리 아래에 배포본의 소스코드를 담은 새로운 디렉토리가 생긴다. 서버를 컴파일하기 전에 그 디렉토리로 `cd`해야 한다.

### 소스 트리 구성하기

다음 과정은 특정 플래폼과 개인적인 요구에 따라 아파치 소스 트리를 구성하는 일이다. 이를 위해 배포본의 루트 디렉토리에 있는 `configure` 스크립트를 사용한다. (아파치 소스 트리의 CVS 버전을 다운로드받은 개발자는 `autoconf`와 `libtool`가 설치되있고, 다음 과정으로 넘어가기 전에 `buildconf`를 실행해야 한다. 이는 정식 버전에서는 필요없다.)

모두 기본 옵션을 사용하여 소스 트리를 구성하려면 간단히 `./configure`를 치면된다. 기본 옵션을 수정하려면 `./configure`에 여러 변수와 명령행 옵션을 사용한다. 다른 옵션은 `./configure` 명령어 뒤에 위치하지만, 환경변수는 일반적으로 앞에 나온다. 여기서 가장 중요한 옵션은 아파치가 정상적으로 작동하기위해 구성되는 장소이자 아파치가 설치될 장소인 prefix다. 그러나 입맛에 맞는 다른 다양한 옵션들이 있다.

여러분이 선택할 수 있는 가능성을 보여주기위해 다음은 특정 컴파일러와 플래그를 사용하고 나중에 DSO로 로드할 두 모듈 mod_rewrite와 mod_speling을 추가하여 /sw/pkg/apache에 설치할 아파치를 컴파일하는 전형적인 예이다:

> `$ CC="pgcc" CFLAGS="-O2" \
> ./configure --prefix=/sw/pkg/apache \
> --enable-rewrite=shared \
> --enable-speling=shared`

configure를 실행하면 몇분간 시스템의 기능을 검사하여 나중에 서버를 컴파일하는데 사용할 Makefile들을 만든다.

아파치의 모든 구성 플래그를 볼 수 있는 가장 쉬운 방법은 ./configure --help이다. 다음은 대부분의 아규먼트와 환경변수에 대한 간단한 설명이다.

#### 환경변수

autoconf은 컴파일 환경을 구성하기위해 여러 환경변수를 사용한다. 일반적으로 이 환경변수들은 서버의 기능이 아니라 아파치를 컴파일하는 방법에 영향을 미친다. 이 변수를 `configure`를 실행하기 전에 환경에 위치시킬 수도 있지만, 위의 예와 같이 `configure` 명령행에 써주는 것이 더 쉽다.

`CC=...`
  C 컴파일러 명령어 이름.
`CPPFLAGS=...`
  기타 C 선처리기와 컴파일러 옵션.
`CFLAGS=...`
  C 컴파일러의 디버깅과 최적화 옵션.
`LDFLAGS=...`
  기타 링커에 넘겨줄 옵션.
`LIBS=...`
  링커에 넘겨줄 라이브러리 위치 정보 ("-L"과 "-l" 옵션).
`INCLUDES=...`
  헤더파일를 찾을 디렉토리들 ("-Idir").
`TARGET=...` [기본값: apache]
  만들 실행파일 이름.
`NOTEST_CPPFLAGS=...`
`NOTEST_CFLAGS=...`
`NOTEST_LDFLAGS=...`
`NOTEST_LIBS=...`
  이 변수들은 NOTEST가 안붙은 것들과 같은 기능을 한다. 단, 이 변수들은 autoconf가 기능 검사를 마친후 컴파일 과정에만 영향을 미친다. 그래서 기능 검사중에는 문제를 일으키지만 마지막 컴파일때는 사용해야할 플래그를 포함할 수 있다.
`SHLIB_PATH=...`
  컴파일러와 링커에 공유라이브러리 경로를 지정하는 옵션.

#### autoconf 출력 옵션

`--help`
  모든 옵션과 같이 사용법을 출력한다. 실제 구성을 하지는 않는다.
`--quiet`
  일반적인 "checking..." 문구를 출력하지 않는다.
`--verbose`
  구성 과정중 사용하는 모든 파일명을 포함한 매우 많은 정보를 출력한다.

#### 경로명

아파치가 설치될 경로명을 구성하는 방법은 현재 두가지다. 하나는 디렉토리를 지정하고, 아파치가 그 기본 장소 밑에 설치되는 경우다.

`--prefix=PREFIX` [기본값: /usr/local/apache2]
  아파치 파일들이 설치될 디렉토리를 지정한다.

아키텍쳐 특유의 파일들을 다른 디렉토리에 설치할 수도 있다.

`--exec-prefix=EPREFIX` [기본값: PREFIX]
  아키텍쳐 특유의 파일들이 위치할 디렉토리를 지정한다.

두번째로 아파치 설치 경로 위치를 구성하는 더 유연한 방법은 `config.layout` 파일을 사용하는 것이다. 이 방법을 사용하여 파일들의 종류마다 위치를 따로 지정할 수 있다. `config.layout` 파일은 여러 구성 예를 담고있고, 이를 참고하여 자신만의 구성을 만들 수도 있다. 이 파일 내용은 `<Layout FOO>...</Layout>`로 구분되며 `FOO`와 같은 이름으로 지칭한다.

`--enable-layout=LAYOUT`
  `config.layout`의 해당 레이아웃을 사용하여 설치 경로를 지정한다.

현재 `--enable-layout`과 `--prefix` 옵션을 같이 사용하지 못한다. 또 `configure` 명령행에 개별적으로 자세한 경로명을 지정할 수 없다. 기본적인 설치를 원한다면 간단히 `--prefix` 옵션을 사용한다. 설치 장소를 구체적으로 설정하고 싶다면 `config.layout` 파일을 편집하여 `--enable-layout` 옵션을 사용해야 한다.

#### 모듈

아파치는 모듈로 구성된 서버다. 서버 핵심에는 가장 기본적인 기능만이 포함되있다. 여러 모듈에서 확장 기능을 제공한다. 구성 과정에서 서버에 사용하기위해 컴파일할 모듈을 선택해야 한다. 문서에 포함된 모듈 목록을 볼 수 있다. 상태가 "Base"인 모듈은 기본적으로 포함되므로, 원하지 않는다면 명시적으로 빼줘야 한다. 다른 상태인 모듈은 사용하길 원한다면 명시적으로 넣어줘야 한다.

모듈을 컴파일하고 사용하는 방법은 두 가지다. 정적으로 컴파일된 모듈은 아파치 실행파일에 영구히 포함된다. 이외에 운영체제가 동적공유객체(Dynamic Shared Objects, DSO)를 지원하고 autoconf가 이 사실을 알아낸다면 모듈을 동적으로 컴파일할 수도 있다. DSO 모듈은 아파치 실행파일에 포함되지 않지만, mod_so이 제공하는 실행중 구성 지시어를 사용하여 서버에 포함하거나 뺄 수 있다. mod_so는 컴파일에 동적 모듈이 포함되면 자동으로 서버에 포함된다. 동적 모듈을 컴파일하지 않고 서버가 DSO를 읽어들일 수 있게 하려면 `--enable-so` 옵션을 직접 사용해야 한다.

`--enable-MODULE[=shared]`
  모듈 MODULE을 컴파일하여 포함한다. MODULE은 모듈 문서중에 모듈인식자에서 "_module"을 뺀 이름이다. 모듈을 DSO로 컴파일하려면 `=shared` 옵션을 붙인다.
`--disable-MODULE`
  이 옵션을 사용하지 않으면 컴파일되어 포함될 모듈 MODULE을 제거한다.
`--enable-modules=MODULE-LIST`
  공백으로 구분된 MODULE-LIST에 나온 모듈들을 컴파일하여 포함한다.
`--enable-mods-shared=MODULE-LIST`
  공백으로 구분된 MODULE-LIST에 나온 모듈들을 동적으로 로드가능한 (DSO) 모듈로 컴파일하여 포함한다.

`--enable-modules`와 `--enable-mods-shared` 옵션에서 MODULE-LIST은 모듈명들을 공백으로 구분한 목록이다. 예를 들어 mod_dav와 mod_info를 포함하려면 아래 두 가지 모두 가능하다.

> `./configure --enable-dav --enable-info`

나

> `./configure --enable-modules="dav info"`

추가로 특별한 키워드 `all`이나 `most`로 한번에 모든 혹은 대부분의 모듈을 포함시킬 수 있다. 그런후 원하지 않는 모듈은 `--disable-MODULE` 옵션으로 제거한다. 예를 들어 mod_info를 제외한 모든 모듈을 DSO로 포함한다면,

> `./configure --enable-mods-shared=all --disable-info`

표준 모듈들외에 아파치 2.0은 Multi-Processing Modules (MPM)을 선택할 수 있다. 오직 한 MPM만을 컴파일 과정에 포함할 수 있다. 각 플래폼의 기본 MPM은 MPM 문서 페이지에 쓰여있으나, `configure` 명령행에서 교체할 수 있다.

`--with-mpm=NAME`
  mpm NAME을 선택한다.

#### Suexec

아파치는 사용자 CGI 프로그램을 격리시키는데 사용할 수 있는 suexec라는 지원 프로그램을 포함한다. 그러나 suexec를 잘못 설정하면 심각한 보안 문제를 만들 수 있다. 그러므로 이 기능을 사용하기 전에 suexec 문서를 주의있게 읽고 생각해야 한다.

### 컴파일

다음 명령어 하나로 아파치의 여러 부분을 컴파일한다:

> `$ make`

여기서 좀 기다려라. 펜티엄 III/리눅스 2.2 시스템에서 기본 구성을 컴파일하는데 약 3분 정도 걸린다. 이 시간은 하드웨어와 포함한 모듈수에 따라 크게 변한다.

### 설치

이제 다음 명령어로 패키지를 (위의 `--prefix` 옵션 참고) 구성한 설치 위치 PREFIX에 설치한다:

> `$ make install`

업그레이드한다면 설치는 설정파일이나 문서를 덮어쓰지 않는다.

### 설정

다음으로 PREFIX/conf/에 있는 설정 파일을 편집하여 아파치 웹서버를 설정한다.

> `$ vi PREFIX/conf/httpd.conf`

사용가능한 설정 지시어에 대한 완전한 설명은 docs/manual/이나 http://httpd.apache.org/docs/에 있는 아파치 매뉴얼을 참고하라.

### 검사

이제 다음과 같이 아파치 웹서버를 시작할 수 있다:

> `$ PREFIX/bin/apachectl start`

그리고 URL http://localhost/로 첫번째 문서를 요청한다. 보게되는 웹페이지는 아마도 `PREFIX/htdocs/`일 DocumentRoot 아래에 있다. 그리고 다음 명령어로 다시 서버를 중단한다:

> `$ PREFIX/bin/apachectl stop`

### Apache HTTP Server Version 2.0