제 4 회 리눅스 공동체 세미나 B 4-5 세션

차례

1. DNS

1.1 DNS(Domain Name Service) 는 무엇인가?

1.2 네임서버 설정

1.3 하나의 named 로 여러개 도메인 관리하기

1.4 네임서버 동작 확인

2. 센드메일

2.1 메일 서비스 동작 방식

2.2 SMTP

2.3 센드메일의 설치

2.4 센드메일의 구동

2.5 /etc/sendmail.cf 파일에 대하여

2.6 메일 alias 기능

2.7 sendmail.cf 파일의 기본적인 설정

2.8 센드메일의 상태 확인

3. POP3 (Post Office Protocol version 3)

3.1 POP3 기능

3.2 POP3 서버 설치를 위한 IMAP 패키지 설치 및 설정

4. Qmail

4.1 개요

4.2 왜 Qmail인가?

4.3 역사

4.4 기능 리스트

4.5 Qmail 기능 향상 패키지 내용

4.6 lIcense

4.7 다른 MTA 들과의 비교

4.8 준비하기

4.9 컴파일 전 해주어야 할 일

4.10 Qmail 의 홈디렉토리 생성

4.11 사용자와 그룹 생성

4.12 컴파일 및 설치

4.13 최소한의 환경 설정

4.14 Alias 설정

4.15 Maildir 생성에 앞서 결정해야 할 사항

4.16 Mailbox, Maildir 의 설치

4.17 실행 스크립트의 생성

4.18 설치 테스트

4.19 Sendmail 의 제거

4.20 tcpserver, checkpassword 의 설치

4.21 부트 스크립트의 설치

4.22 Sendmail wrapper 의 설치

4.23 Qmail 의 시동

4.24 관련 사이트 정리

4.25 Qmail 강좌를 끝마치며...

5. 아파치 서버

5.1 개요

5.2 준비하기

5.3 파일 내용

5.4 컴파일 전 해주어야 할 일

5.5 모듈 설정

5.6 컴파일 및 설치

5.7 아파치 서버의 실행 및 종료

5.8 설정 파일

5.9 아파치 강의를 마치며...

1.1. DNS(Domain Name Service) 는 무엇인가?

인터넷의 모델은 지금의 우편시스템을 그대로 모방하고 있다. 모든 집에는 해당하는 주소를 가지고 있듯이 인터넷에는 IP 주소가 있다. 집에 모두 다른 이름을 가진 가족이 살 듯이 해당 IP 주소를 가진 서버에는 서로 다른 이름을 가진 사용자가 있다. 같은 집 주소를 가진 집이 없듯이, 인터넷에서 같은 IP 주소를 가진 컴퓨터는 없다. 인터넷은 이러한 명백히 구분되는 고유한 키로써 서로 연결된 컴퓨터에서 자신을 증명한다. 인터넷에 연결된 컴퓨터가  자신을 구분하는 IP 주소는 32bit 로 자연수를 8bit를 4개로 나누어 사용한다. 166.104.90.152 와 같은 구조이다. 불행하게도 컴퓨터가 구분하는 이런 IP 주소는 사람이 외우기에는 너무 어렵다.(전화번호도 외우기가 어려운데, IP 주소는 자리수가 4~5개가 더 많다.) 그래서, 등장한 것이 DNS(Domain   Name Service)이다. 외우기 어려운 숫자들 대신이 사람이 알아보기 쉽고, 추측이 가능한 단어들로 이루어진 주소 체계이다.

DNS의 목적은 사람들이 서버에 편하게 접속할 수 있도록 IP 주소를 도메인네임으로 바꿔주는 역할을 하기 위해서이다. 간단하게 166.104.90.152를 hlug.hanyang.ac.kr 으로 바꿔주는 역할을 한다. 물론, 반대의 역할도 가능하다. 사용자가 주로 이용하게 되는 방식은 도메인네임을 IP 주소 바꾸는 작업이다. 사용자는 정보를 서비스 해주는 홈페이지에 접속하기 위해 그곳의 IP 주소를 기억할 필요가 없다. 외우기 쉬운 도메인 이름만 알면 된다. 한양대학교 리눅스 사용자 모임의 홈페이지에 접속하고자 할 때, 서비스를 해주는 서버의 IP 주소 166.104.90.152를 알 필요가 없으며, hlug.hanyang.ac.kr 이라는 도메인이름을 알고 있으면 된다. IP 주소에 할당 체계가 있듯이 도메인이름에도 이름을 부여하는 방식이 정해져 있다. 그래서, 그 방식을 이해하면 한양대학교 리눅스 사용자 모임이 위의 이름을 가지는 것이 좋은지 쉽게 이해할 수 있을 것이다.

초기에 DNS는 /etc/hosts 파일에서 관리를 했는데, 인터넷 초창기 시절 인터넷에 물려있는 호스트의 수가 별로 되지 않았을 때에는 /etc/hosts 파일에 각각의 IP와 도메인 이름을 기록을 해두고서 주기적으로 서로 교환을 했던 것인데 점차 그 수가 증가함으로써 hosts 파일의 크기가 감당하지 못할 정도로 커지게 되어버렸다. 이러한 문제점을 해결하기 위해서 DNS를 사용하게 되었다. 현재 가장 널리 이용되고 있는 것은 BIND(Bekeley Internet Name Domain)로 BSD용으로 개발되었던 것이며 현재는 거의 모든 유닉스 시스템에서 사용 가능하다. bind는 현재 bind-8.2 버전까지 나와있다.

DNS는 기본적으로 클라이언트와 서버 환경에서 작동한다. 네임서버가 설치된 곳이 서버가 되는 것이고, 네임서버에 질의을 하는 쪽이 클라이언트가 된다. 일반적인 사용자들은 전부 클라이언트에 해당한다.

클라이언트의 질의에 대해 서버는 호스트의 IP주소를 매핑시켜주고, 만일 서버가 가지고 있지 않은 도메인에 대한 요청이 오면 상위 레벨의 서버로부터 가져온다. 쉽게 실제 작동하는 방식을 살펴보자.

사용자가 hlug.hanyang.ac.kr를 웹 브라우저에 입력하면 어떤 식으로 작동이 되는 것일까? 일단 hanyang.ac.kr 의 도메인이 있는지 확인을 해야 할 것이다. 이 확인은 kr 도메인을 담당하는 루트 서버에서 네임서버 루트 정보를 참조하여 도메인이 존재하면 hanyang.ac.kr 의 네임서버가 hynetm.hanyang.ac.kr 임을 알려주고 다시 hynetm.hanyang.ac.kr 은 hlug.hanyang.ac.kr 의 정보를 전달해 주는 것이다. 아주 짧은 시간에 이러한 작용이 사용자 모르게 진행이 되는 것이다. DNS는 제일 먼저 가장 큰 데이터 베이스를 참조하면서 가장 하위로 내려오는 방식으로 구성되어 있다.

그 이유는 다음과 같다. hanyang.ac.kr 이란 도메인이 존재 유무를 하위 네임서버에서 찾고, 없으면 그 상위로 가고, 거기서도 없다면 그 상위로 가고, 이런 동작 보다는 제일 상위 네임서버에서 맨 처음 찾는 것이 더 빠른 동작을 한다. 일반적으로 생각할 때에는 반대로 생각하기가 쉬운데 네임서버는 제일 큰 것에서 제일 작은 것으로 찾는다고 생각하면 된다.

원하는 도메인을 할당 받길 원한다면 먼저 그 도메인이 다른 누군가의 의해 할당 되어 있는 상태인지를 확인해야 한다. 확인하는 서비스를 해주는 곳이 여럿 있는데, 그 중에서 한국인터넷정보센터의 홈페이지에서 알아 보도록 하자. http://whois.nic.or.kr 에 접속하면 도메인 존재 유무를 확인할 수 있다.

도메인 이름을 정하는 일은 신중히 생각해야 할 필요가 있다. 도메인이 많이 알려지는 데까지는 상당한 시간과 노력이 필요한데, 도메인 이름이 이 수고를 덜어줄 수 있다. 각 기관이나 업체의 특성에 맞는 이름을 정하는 것이 사용자들에가 편할 것이라는 것은 두말할 필요가 없는 것이다. 여기서는 개인 도메인에 해당하는 pe.kr 중에서 linuxinfo.pe.kr를 가지고 설명할 것이다.

1.2. DNS 설정

필요한 패키지 : bind-8.2-7.i386.rpm

bind-devel-8.2-7.i386.rpm

bind-utils-8.2-7.i386.rpm

caching-nameserver-6.0-3.noarch.rpm

홈페이지 : http://www.isc.org/bind.html

bind 패키지를 설치한다.

# rpm -Uvh bind-* caching-nameserver-6.0-3.noarch.rpm

네임서버에는 크게 세 가지로 나눌 수 있다. Primary, Secondary, Cache only server로 구분된다. Primary server는 해당 도메인을 관리하는 주 네임서버이고, Secondary는 특정 도메인에 대한 보조서버이다. Secondary는 Primary에 문제가 생겼을 경우나 또는 부하를 분산시키기 위해  운용하며, 여러 개가 존재할 수 있다. 보통 작은 네트웍이라면 Primary만으로 관리가 가능하며, Secondary는 원칙적으론 Primary와 다른 네트웍에 위치시켜 Primary가 문제 발생시(정전이나 시스템 다운 등) 대비한다. Cache only server는 도메인에 대한 관리하지는 않고, 도메인 네임들에 대한 캐쉬만을 처리한다. 모뎀 사용자들은 캐슁 네임서버를 운영하면 인터넷 접속시 속도의 향상을 기대할 수가 있다.

/etc/named.conf 파일의 설정

이 파일은 항상 /etc 에 있어야 한다. 네임서버 대몬 bind 가 시작하면서 참조하는 설정파일이다. 이 파일이 존재하지 않는다면 named는 작동을 하지 않을 것이다. bind 4.x 대에서이 파일은 /etc/named.boot 파일이었으나 8.x대로 버전이 올라가면서 파일명이 변경이 되었다. bind 4.x와 bind 8.x대의 설정 중에 이 파일만이 달라졌다.

bind 8.x named.conf 파일의 기본적인 구성은 bind 4.x대와 많은 부분이 비슷하고 여기에 추가 확장이 되었다. 그리고 4.x대의 부트 파일과의 혼동을 막기 위해 named.conf로 파일명이 달라졌다. 설정을 좀더 세밀하게 할 수 있도록 바뀌었을 뿐, 4.대의 부트 파일과 크게 다를 것은 없다.

1.3. 네임서버 설정

/etc/named.conf

// generated by named-bootconf.pl

options {

directory "/var/named";

/*

* If there is a firewall between you and nameservers you want

* to talk to, you might need to uncomment the query-source

* directive below.  Previous versions of BIND always asked

* questions using port 53, but BIND 8.1 uses an unprivileged

* port by default.

*/

// query-source address * port 53;

};

//

// a caching only nameserver config

//

zone "." {

type hint;

file "named.ca";

};

zone "0.0.127.in-addr.arpa" {

type master;

file "named.local";

};

zone "linuxinfo.pe.kr" {

type master;

file "linuxinfo.db";

};

zone "27.104.166.in-addr.arpa" {

type master;

file "named.rev";

};

zone "bigbook.pe.kr" {

type master;

file "bigbook.db";

};

위의 내용은 linuxinfo.pe.kr 의 설정 파일이다. 지금부터 실제 자신의 시스템에 적용하기 위해 위의 내용이 의미하는 바를 하나씩 살펴 보도록 하자.

directory  □/var/named□;

설정파일이 위치할 디렉터리를 정해준다. 실제 뒤에 나오는 설정파일들은 전부 이 디렉터리에서 가져온다고 알려주는 역할을 한다.

zone "." {

type hint;

file "named.ca";

};

루트 네임서버들에 대한 정보를 가지고 있는 파일을 지정한다. 루트 네임서버들에 대한 캐쉬 파일이다. 이 파일은 스스로 만들 필요는 없고 이미 만들어져 있는 것을 가져오면 된다. FTP.RS.INTERNIC.NET/domain/named.ca 파일을 가져오면 된다.

zone "linuxinfo.pe.kr" {

type master;

file "linuxinfo.db";

};

이 서버가 관리하는 도메인과 그 정보를 가지고 있는 파일 도메인이 linuxinfo.pe.kr 이고 그 도메인에 대한 정보가 linuxinfo.db 에 있다고 명시한다. linuxinfo.db 파일은 Forward Zone으로써 도메인에 대한 IP 정보를 가지고 있는 파일이다. 해당 도메인 네임을 IP로 바꿔주는 역할을 한다.

zone "27.104.166.in-addr.arpa" {

type master;

file "named.rev";

};

named.rev는 Reverse Zone으로써 이 서버가 관리하는 IP와 그 정보를 담당하는 파일 IP 도메인 네임을 찾아주는 역활을 담당한다.

zone "0.0.127.in-addr.arpa" {

type master;

file "named.local";

로컬 IP에 대한 정보를 담고 있다.

1.4. 하나의 named 로 여러개 도메인 관리하기

한 네임서버에서 여러개의 도메인에 대한 처리가 가능하다.

zone "bigbook.pe.kr" {

type master;

file "bigbook.db";

};

위 내용을 추가한 후에 다음의 linuxinfo.db 와 같은 형식의 bigbook.db  파일을 작성하면 된다.

/var/named/linuxinfo.db

@ IN SOA ns.linuxinfo.pe.kr. sjang.ns.linuxinfo.pe.kr. (

20000302 ; Serial

36000 ; Refresh

3600 ; Retry

3600000 ; Expire

36000 ) ; Minimum

IN NS ns.linuxinfo.pe.kr.

IN A 166.104.27.137

IN MX 0 www3.hanyang.ac.kr.

ns IN A 166.104.27.137

www IN A 166.104.27.137

sjang IN A 166.104.90.152

pilot IN A 166.104.90.145

seminar IN CNAME sjang.linuxinfo.pe.kr.

IN      SOA     NS.clug.net. root.ns.clug.net.  (

980901  ; Serial

10800   ; Refresh(6h)

3600    ; Retry(15min)

3600000 ; Expire(7d)

43200 ) ; Minimum(12h)

이 부분은 없어서는 안되는 부분이다. 없거나 설정이 잘못되어 있으면 네임서버가 작동을 하지 않는다. 대소문자는 가리지 않는다. ns.linuxinfo.pe.kr은 이 네임서버의 도메인명이다. sjang.ns.linuxinfo.pe.kr은 관리자의 이메일 주소이다. 일반적으로 메일 주소가 sjang@hlug.hanyang.ac.kr의 형태인데 sjang.ns.linuxinfo.pe.kr 라고 '.' 으로 표시가 되어 있다. 그 이유는 네임서버에서 @는 자기 자신(즉 여기선 linuxinfo.pe.kr)이 되기 때문이다.

자세히 보면  linuxinfo.pe.kr. 여기서 마직막에 □.□ 이 들어가 있는걸 알 수 있다. 여기서 □.□은 최상위 도메인이다. 우리가 named.conf 파일에 도메인 네임을 적어준 것을 기억하기 바란다. 만약에 linuxinfo.pe.kr 이라고만 표기를 했다면 실제 네임서버는 linuxinfo.pe.kr.linuxinfo.pe.kr 으로 인식을 하게 될 것이다. 항상 네임서버를 구성할 때 '.'를 주의해서 봐야 한다. □.□ 하나 때문에 한참을 고생하는 경우가 허다하다. 도메인은 뒤에서부터 앞쪽으로 갈수록 하위 구조라는 것을 명심하기 바란다. 유닉스 디렉토리 구조에서 □/□ 는 최상위 디렉토리이다. 이것에 해당하는 것이 도메인의 '.' 이다.

SOA 는 현재 Record 의 유형(type)을 지정한다.

SOA

도메인 정보에 대한 authority 를 지정한다.

Serial (20000302  ; Serial)

이 정보의 버전을 나타낸다. secondary 서버에서 primary 서버의 데이타를 가지고 올 때 우선 primary 서버에 serial 번호를 달라고 요청을 하게 된다. 이 시리얼 번호가 기존의 정보와 같다면 거기서 멈추고 버전이 높다면 새로운 정보로 가지고 온다. zone 파일의 내용을 수정했다면 시리얼을 올려주어야 한다. 보통 알아보기 쉽게 날짜로 사용을 한다.

Refresh (36000   ; Refresh )

secondary 측에서 새로운 정보를 요청 할 때까지의 시간을 지정한다. 지정한 시간 이후에 secondary 서버에서는 primary 서버로 갱신된 정보가 있는지를 문의하게 된다.

Retry (3600    ; Retry )

재시도를 하는 시간을 지정해준다. primary 서버에 접속을 할수 없으면 지정한 시간후에 다시 접속을 시도하게 된다.:ㅈ

Expire (3600000 ; Expire )

일정기간 이상 primary 서버에 접속하지 못한다면 이전에 가져왔던 정보들을 파기할 기간을 지정한다.

Menium TTL(Time to Live) (36000 ; Minimum) )

네임서버는 한번 찾았던 정보에 대해서 캐싱을 한다. 위에서 약간 언급했던 부분인데 www.linuxinfo.pe.kr을 찾는 방법이 기억이 날 것이다. 브라우저의 요청 -> 최상위 네임서버 검색 -> ns.linuxinfo.pe.kr -> www.linuxinfo.pe.kr 이런 식으로 돌아간다는 것을 기억해주기 바란다. 그럼 매번 이런 방법을 거친다면 상당히 불편 할 것이다. 속도도 문제고 네트웍의 트래픽도 가중시킬 것이고, 이래서 네임서버들은 한번 요청했던 정보를 저장하고 있다. 이 시간이 짧으면 네임서버로 요청이 자주 들어올 것이고 (동적 IP에 도메인을 부여하는 곳이 이 시간이 짧다.) 시간이 길다면  오랫동안 정보가 저장이 되어 있기 때문에 변경이 되었을 때 바로 적용이 안 되는 경우가 생길 수 있다. 보통 하루정도의 시간을 두고 사용한다.

NS

네임 서버를 지정할때 쓰인다.

예) IN NS ns.linuxinfo.pe.kr.

linuxinfo.pe.kr 의 네임서버가 ns.linuxinfo.pe.kr 이라고 알려주는 역할을 한다.

A

도메인명 -> IP 주소를 지정할 때 쓰인다.

예) ns IN A 166.104.27.137

ns 만 적었다. 실제 네임서버 에서는 ns.linuxinfo.pe.kr 으로 인식을 한다. 시스템에 걸리는 부하를 분산하기 위해 네임서버를 여러 개 둘 수도 있다.

ns	IN	A	IP.Address1

IN	A	IP.Address2

IN	A	IP.Address3

이처럼 하나의 도메인에 여러 개의 IP를 지정할 수 있다. Netscape 사와 MS 사의 홈페지에 몇 개의 IP 주소가 배당되어 있는지 nslookup 명령으로 다음과 같이 알아 볼 수 있다.

이렇게 해서 어떤 한 서버가 다운되어도 계속 적인 서비스가 가능하다.

[10 sjang@www3:/var/named]# nslookup www.netscape.com

Server:  hynetm.hanyang.ac.kr

Address:  166.104.27.6

Name:    vwww-mv3.netscape.com

Address:  207.200.83.93

Aliases:  www.netscape.com

[11 sjang@www3:/var/named]# nslookup www.microsoft.com

Server:  hynetm.hanyang.ac.kr

Address:  166.104.27.6

Non-authoritative answer:

Name:    microsoft.com

Addresses:  207.46.131.137, 207.46.131.30, 207.46.130.14, 207.46.130.149

207.46.130.45

Aliases:  www.microsoft.com

[12 sjang@www3:/var/named]#

CNAME

별명(alias)를 지정할때 쓰인다.

예) seminar IN CNAME sjang.linuxinfo.pe.kr.

seminar	IN	A	166.104.27.137 로 표시 하는 것과 같은 역할을 한다.

여기서도 '.'이 중요하다. 점하나 때문에 호스트 이름을 찾지 못할 것이다.

MX

Mail Exchanger 를 지정한다.

예) IN MX 0 www3.hanyang.ac.kr.

이것은 메일 서버 자체를 포워드 하는 것이다. linuxinfo.pe.kr에서 sjang 이라는 사용자에게 계정을 발급하고 이 사용자에게 메일을 전달하기 위해서는 sjang@linuxinfo.pe.kr 로 메일을 보내면 된다. 이때 메일을 받게 되는 서버를 다르게 지정할 수 있다. 예제의 내용대로 하면 메일은 www3.hanyang.ac.kr 이라는 서버에 전달 되게 된다. 따라서, www3.hanyang.ac.kr 서버에 sjang 이라는 계정이 있어야 메일이 전달될 것이다. 이렇게 메일 서버를 다른 것으로 지정할 경우에 MX를 이용한다.  여러 개의 설정도 가능하다.

예)     IN	MX 0	mail.server.1

IN	MX 10	mail.server.2

IN	MX 100	mail.server.3

정해진 차례대로 시도를 한다.

/var/named/named.rev

@ IN SOA ns.linuxinfo.pe.kr. sjang.ns.linuxinfo.pe.kr. (

20000302 ; Serial

36000 ; Refresh

3600 ; Retry

3600000 ; Expire

36000 ) ; Minimum

IN NS ns.linuxinfo.pe.kr.

137 IN PTR www.linuxinfo.pe.kr.

145.90.104.166 IN PTR pilot.linuxinfo.pe.kr.

137.27.104.166 IN PTR seminar.linuxinfo.pe.kr.

PTR

IP -> 도메인명을 지정할때 쓰인다. 이 파일은 linuxinfo.db 파일에 반대라고 생각하면 된다. 각 IP를 도메인명으로 변환해 주는 역할이다.

/var/named/named.rev

@       IN      SOA     localhost. root.localhost.  (

1997022700 ; Serial

28800      ; Refresh

14400      ; Retry

3600000    ; Expire

86400 )    ; Minimum

IN      NS      localhost.

1       IN      PTR     localhost.

/var/named/named.ca

;       This file holds the information on root name servers needed to

;       initialize cache of Internet domain name servers

;       (e.g. reference this file in the "cache  .  <file>"

;       configuration file of BIND domain name servers).

;

;       This file is made available by InterNIC registration services

;       under anonymous FTP as

;           file                /domain/named.root

;           on server           FTP.RS.INTERNIC.NET

;       -OR- under Gopher at    RS.INTERNIC.NET

;           under menu          InterNIC Registration Services (NSI)

;              submenu          InterNIC Registration Archives

;           file                named.root

;

;       last update:    Aug 22, 1997

;       related version of root zone:   1997082200

;

;

; formerly NS.INTERNIC.NET

;

.                        3600000  IN  NS    A.ROOT-SERVERS.NET.

A.ROOT-SERVERS.NET.      3600000      A     198.41.0.4

;

; formerly NS1.ISI.EDU.

;

.                        3600000      NS    B.ROOT-SERVERS.NET.

B.ROOT-SERVERS.NET.      3600000      A     128.9.0.107

;

; formerly C.PSI.NET

;

.                        3600000      NS    C.ROOT-SERVERS.NET.

C.ROOT-SERVERS.NET.      3600000      A     192.33.4.12

;

; formerly TERP.UMD.EDU

;

.                        3600000      NS    D.ROOT-SERVERS.NET.

D.ROOT-SERVERS.NET.      3600000      A     128.8.10.90

;

; formerly NS.NASA.GOV

;

.                        3600000      NS    E.ROOT-SERVERS.NET.

E.ROOT-SERVERS.NET.      3600000      A     192.203.230.10

;

; formerly NS.ISC.ORG

;

.                        3600000      NS    F.ROOT-SERVERS.NET.

F.ROOT-SERVERS.NET.      3600000      A     192.5.5.241

;

; formerly NS.NIC.DDN.MIL

;

.                        3600000      NS    G.ROOT-SERVERS.NET.

G.ROOT-SERVERS.NET.      3600000      A     192.112.36.4

;

; formerly AOS.ARL.ARMY.MIL

;

.                        3600000      NS    H.ROOT-SERVERS.NET.

H.ROOT-SERVERS.NET.      3600000      A     128.63.2.53

;

; formerly NIC.NORDU.NET

;

.                        3600000      NS    I.ROOT-SERVERS.NET.

I.ROOT-SERVERS.NET.      3600000      A     192.36.148.17

;

; temporarily housed at NSI (InterNIC)

;

.                        3600000      NS    J.ROOT-SERVERS.NET.

J.ROOT-SERVERS.NET.      3600000      A     198.41.0.10

;

; housed in LINX, operated by RIPE NCC

;

.                        3600000      NS    K.ROOT-SERVERS.NET.

K.ROOT-SERVERS.NET.      3600000      A     193.0.14.129

;

; temporarily housed at ISI (IANA)

;

.                        3600000      NS    L.ROOT-SERVERS.NET.

L.ROOT-SERVERS.NET.      3600000      A     198.32.64.12

;

; housed in Japan, operated by WIDE

;

.                        3600000      NS    M.ROOT-SERVERS.NET.

M.ROOT-SERVERS.NET.      3600000      A     202.12.27.33

; End of File

이 파일은 직접 만들 필요가 없다. 이 파일은 루트 네임서버에 대한 것들이다. ftp://FTP.RS.INTERNIC.NET/domain/named.ca에서 가져오기만 하면 된다.

지금까지 Prymiry 네임서버의 설정이었다. 보통은 Prymiry 네임서버만으로 운영을 하면 된다. 그러나, 대기업이나 학교 등에서는 각 부서별 또는 각 과별로 서브 도메인을 나누어 주고 각각에서 secondary 네임서버를 돌려주는 것이 더 효율적이다. 서버 부담을 분산시키는 점도 있고, 하위 도메인 관리에도 편리하기 때문이다.

혹시 이전 버전의 네임서버로 운영을 하고 있다면 bind패키지를 업그레이드를 한 후 named.boot파일을 named.conf로 변화 해주는 스크립트를 돌려주면 된다. 스크립트는 /usr/doc/bind-버전/named-bootconf.pl 에 있다. 이 스크립트를 실행한 후 /etc/named.conf 파일이 생성이 되었는지 확인해 보자. zone 파일들에 형식은 바뀌지 않았고 다만 /etc/named.conf 만 바뀌었을 것이다. 네임서버 설정이 제대로 되었는지 확인을 해보도록 하자. 설정이 마무리 되었으면 또는 zone(linuxinfo.db) 파일을 수정했다면 named를 재시작 해주어야 한다.

[root@www3 named]# /etc/rc.d/init.d/named restart

Shutting down named:                                       [  OK  ]

Starting named:                                            [  OK  ]

[root@www3 named]#

1.5. 네임서버 동작 확인

먼저 primary 네임 서버가 정상적으로 작동되는지 질의를 요청해서 확인해 보도록 한다.

/etc/resolv.conf 의 내용은 다음과 같이 설정한 네임서버로 설정한다. 이 것은 클라이언트에 대한 내용이므로 자세한 의미는 생략한다. nameserver 부분이 중요하다.

[root@www3 /root]# cat /etc/resolv.conf

search hanyang.ac.kr

nameserver 166.104.27.137

[root@www3 /root]#

지정한 네임서버가 제대로 동작하는 질의 요청을 해본다. nslookup 이라는 명령어가 있다. 이것 입력으로 도메인을 주면 IP 주소를 출력하고, IP를 입력하면 해당 도메인을 알 수 있게 해 준다.

[root@www3 /root]# nslookup ns.linuxinfo.pe.kr

Server:  www.linuxinfo.pe.kr

Address:  166.104.27.137

Name:    ns.linuxinfo.pe.kr

Address:  166.104.27.137

[root@www3 /root]# nslookup seminar.klug.or.kr

Server:  www.linuxinfo.pe.kr

Address:  166.104.27.137

Non-authoritative answer:

Name:    seminar.klug.or.kr

Address:  210.125.178.54

[root@www3 /root]# nslookup 210.125.178.54

Server:  www.linuxinfo.pe.kr

Address:  166.104.27.137

Name:    seminar.uos.ac.kr

Address:  210.125.178.54

[root@www3 /root]#

위와 같이 나온다면 정상적으로 작동되고 있는 것이다.

2. 센드 메일

전자우편 서비스는 인터넷을 사용하는 사용자 사이에서 정보를 교환하는 수단으로 사용되는 인터넷 서비스이다. 전자우편 서비스는 여타 인터넷 서비스에 비하여 사용자 개인에 초점이 맞추어진 중요한 서비스이다. 인터넷을 통한 전자우편 서비스는 우편이라는 형식과 인터넷이라는 매개를 이용하는 서비스이다.

실생활에서의 우편 서비스는 물리적으로 우편이 배달되는 과정이 필요하기 때문에 가지는 제한점이 많다. 그러나 전자우편은 인터넷을 통해 전달되기 때문에 빠른 시간에 처리되고 컴퓨터에서 다루는 데이터를 전송할 수 있다는 장점이 있다. 전자우편을 이용하여 전송 가능한 데이터는 단순한 텍스트 문서의 형태뿐만 아니라 컴퓨터 상에서 파일의 형태로 존재하는 모든 문서를 전송할 수 있다. 즉, 전자우편에 이미지 파일이나 기타 바이너리 파일을 전송할 수 있다.

2.1 메일 서비스 동작 방식

전자우편은 사용자가 전자우편의 송수신에 사용하는 MUA(Mail User Agent)와 메일 서버에서 전자우편의 전송을 처리하는 MTA(Mail Transfer Agent)의 상호 작용으로 이루어진다.

(1) 전자우편 사용자가 Unix 시스템의 mail이나 pine, elm 등의 MUA를 이용하여 전자우편을 발송하면,

(2) 발송된 전자우편은 Mail Queue (e.g. /var/spol/mqueue)에 잠시 저장되고,

(3) sendmail과 같은 MTA는 Mail Queue의 전자우편에서 수신자의 전자우편 주소를 이용하여 DNS에 질의하여 전자우편 수신 서버를 조사한다.

(4) 발송 MTA는 수신 MTA에 접속하여 전자우편을 발송한다. 일반적인 경우에는 발송 MTA가 수신 MTA에 직접 전자우편을 전송하지만, 경우에 따라서는 다른 MTA를 경유하여 전송되기도 한다.

(5) 수신 MTA는 전자우편을 수신하여 수신자의 사서함 (e.g. /var/mail)에 저장한다.

(6) 수신자는 Unix 시스템의 mail이나 pine, elm 등의 MUA를 이용하여 자신의 사서함에 도착한 전자우편을 읽어볼 수 있다.

MTA (Mail Transfer Agent)

SMTP를 지원하며 사용자 사이의 전자우편 전송을 처리하는 프로그램을 지칭한다.

Unix 시스템의 대표적인 MTA는 sendmail이 있으며, Windows NT 시스템은 MS

Exchange Server 등이 있다.

MUA (Mail User Agent)

전자우편 클라이언트 프로그램이다. 사용자가 작성한 전자우편을 MTA에 전달하고, 자신의 수신함에 도착한 전자우편을 MTA로부터 받아 보여주는 역할을 한다. Unix 시스템의 대표적인 MUA는 elm, pine 등이 있으며 Windows 95/NT에서 사용할 수 있는 MUA로는 Netscape messenger, Outlook Express, Eudora 등이 있다.

2.2 SMTP

SMTP(Simple Mail Transfer Protocol)은 전자우편을 전송하기 위한 프로토콜이다. 전자우편이 전송하는 경우는 두 가지 경우로 나누어 볼 수 있다. 하나는, 사용자가 MUA를 이용하여 MTA로 전자우편을 전송(Submission)하는 경우이고, 다른 하나는, 하나의 MTA가 다른 MTA로 전주우편을 중계하는 경우이다. SMTP는 MTA 사이에서 사용되는 프로토콜로 인터넷에 광범위하게 사용되고 있는 대표적인 응용 계층의 프로토콜이다. (RFC 821)

SMTP는 상당히 오랫동안 사용되어온 프로토콜로 SMTP가 처음 사용되던 네트웍 환경에 적합하게 설계된 프로토콜이다. 현재의 네트웍 환경은 SMTP 설계되었던 시점의 네트웍 환경에 비하여 많은 변화가 이루어졌기 때문에 현재의 네트웍 환경에 적합하지 못한 부분이 있다. 대표적인 문제점은 SMTP가 ASCII 7bit 코드 데이터를 전송하도록 설계되었기 때문에 한글이나 이진 파일 등 8bit 코드로 표현되는 데이터를 제대로 전송하지 못한다. 따라서 SMTP를 구현한 많은 MTA는 EUC-KR(8ibt 한글 표준 코드 문자 집합, KS5601, KSC5636/US-ASCII)과 ISO-8859-x(유럽 문자)에 사용되는 8bit 문자를 투명하게 전송해 주지 못한다.

IETF(Internet Engineering Task Force)에서는 SMTP의 이러한 문제점을 해결한 확장 프로토콜로 ESMTP(Extended SMTP)를 제정하였다.

ESMTP는 SMTP를 수용, 확장한 것으로 SMTP의 기능을 모두 지원하고, 확장된 기능을 제공하는 프로토콜이다. ESMTP는 SMTP의 7bit 전송 한계를 넘어 8bit 전송을 지원하고, 전자우편이 정확하게 도착하였는지를 확인할 수 있는 배달 확인 기능(Delivery Status Notification, RFC 1894), 전자우편 크기 제한 기능(Size Declaration, RFC 1870), 전송 중 끊어진 전자우편의 재전송 기능(Checkpoint/Restart, RFC 1845) 기능 등을 지원한다. ESMTP는 현재에도 지속적으로 기능 확장이 이루어지고 있으며, 현재의 많은 MTA는 ESMTP를 지원하고 있다.

2.3 센드메일의 설치

센드메일은 매우 방대한 프로그램이다. 센드메일을 이용하여 제대로 튜닝 된 메일 서버 관리를 원한다면 센드메일의 중요한 설정파일인 sendmail.cf 에 대해서 자세하게 이해하고 있어야 한다. 하지만, 일반적인 메일 서버 관리자라면 세부적인 사항에 대해서 숙지할 필요는 없으며, 센드메일에서 제공하고 있는 편리한 기능에 대한 사용법을 익히는 것이 더 현명할 것이다.

센드메일을 설치하는 방법은 다른 패지키를 설치하는 것과 마찬가지로 세 가지 방법이 있다. rpm으로 설치하는 방법, 컴파일된 바이너리로 설치하는 방법, 소스코드를 직접 컴파일하여 설치하는 방법이다. 여기서는 간단하고 관리가 쉬운 rpm 형태로 되어 있는 센드메일을 설치하도록 하겠다. 센드메일 에 대한 것은 최신 소식은 http://www.sendmail.org에서 확인할 수 있다.

센드메일에 필요한 패키지는 세 가지 이다.

sendmail-8.9.3-15kr.i386.rpm

sendmail-doc-8.9.3-15kr.i386.rpm

sendmail-cf-8.9.3-15kr.i386.rpm

다음 명령어와 같이 위의 세 가지 rpm을 설치하기 바란다.

[root@sjang sendmail]# rpm -Uvh sendmail-8.9.3-15kr.i386.rpm

sendmail                    ##################################################

[root@sjang sendmail]# rpm -Uvh sendmail-cf-8.9.3-15kr.i386.rpm

sendmail-cf                 ##################################################

[root@sjang sendmail]# rpm -Uvh sendmail-doc-8.9.3-15kr.i386.rpm

sendmail-doc                ##################################################

[root@sjang sendmail]#

자세한 설정에 대한 내용은 잠시 뒤로 미루고, 센드메일을 설치하였으니 메일데몬을 구동시켜 보도록 하자.

2.4 센드메일의 구동

rpm 으로 센드메일을 설치하면 센드메일은 /usr/sbin/sendmail 에 위치하게 된다. 여기에 설치된 바이너리 파일을 직접 실행하여 메일 서비스를 시작할 수 있다.

# /usr/sbin/sendmail  -q옵션

위 명령어 라인과 같은 형식으로 센드메일을 시작할 수 있다. 여기에서 옵션자리에 쓰이는 것은 메일 대기열 시간에 해당한다. 처리를 기다리고 있는 메일에 대한 처리 주기를 의미하는 것으로 초, 분, 시간, 일, 주단위까지 지정이 가능하다. 예를 들어,

# /usr/sbin/sendmail  -q20m

이라고 입력하면 15분마다 메일 대기열을 처리하라는 의미이며, 1시간 단위는

# /usr/sbin/sendmail  -q1h

로 입력하면 된다.

이러한 방법을 수동으로 센드메일를 구동시키는 방법에 해당한다. 다른 방법으로 자동화된 스크립트를 이용하는 것이다. rpm 으로 센드메일을 설치하게 되면 구동과 중지를 위한 스크립트를 /etc/rc.d/init.d 디렉토리 안에 sendmail 이라는 파일을 제공해 준다. 이 스크립트를 이용하여 간단하게 센드메일을 구동하고 중지시킬 수 있다. 다음의 세 가지 옵션이 가장 많이 쓰인다.

# /etc/rc.d/init.d/sendmail start

# /etc/rc.d/init.d/sendmail stpo

# /etc/rc.d/init.d/sendmail restart

위에서부터 시작, 구동, 재시작을 의미하는 것이다. 이 스크립트 파일을 잠시 살펴보면 센드메일이 구동되는 옵션으로 -bd 가 사용된다는 것을 알 수 있다. 다음은 센드메일을 위한 스크립트 파일 /etc/rc.d/init.d/sendmail 의 일부를 나타낸 것이다.

34 # See how we were called.

35 case "$1" in

36   start)

37         # Start daemons.

38

39         echo -n "Starting sendmail: "

40         /usr/bin/newaliases > /dev/null 2>&1

41         for i in virtusertable access domaintable mailertable ; do

42             if [ -f /etc/mail/$i ] ; then

43                 makemap hash /etc/mail/$i < /etc/mail/$i

44             fi

45         done

46         daemon /usr/sbin/sendmail $([ "$DAEMON" = yes ] && echo -bd) \

47                                   $([ -n "$QUEUE" ] && echo -q$QUEUE)

48         RETVAL=$?

49         echo

50         [ $RETVAL -eq 0 ] && touch /var/lock/subsys/sendmail

51         ;;

52   stop)

53         # Stop daemons.

54         echo -n "Shutting down sendmail: "

55         killproc sendmail

왼쪽의 숫자는 이 스크립트의 라인넘버이다. start 옵션에 대한 부분을 자세히 살펴보면(46번째행) -bd 옵션으로 실행한다는 것을 확인할 수 있다. 이것은 센드메일 프로그램을 메일 데몬으로 실행시키기 위해서이다. 40번째행도 눈여겨 볼 필요가 있는데, 이것은 메일 alias 기능을 이용하기 위한 것이다. 자세한 설명은 뒤에서 다루게 될 메일 alias 부분을 참고하기 바란다.

센드메일 프로그램을 부팅과 함께 실행하기 위해서, 가장 쉬운 방법으로 setup 명령어를 입력하여 띄워야 하는 데몬으로 sendmail을 추가하면 된다.

2.5 /etc/sendmail.cf 에 대하여

다른 네트웍 서비스 데몬들과 마찬가지로 센드메일 프로그램도 설정파일을 가지고 있다. 가장 중요한 파일이 /etc/sendmail.cf 이다. 이 파일을 직접 열어 보면 알겠지만 매우 복잡해 보이고 방대하다. 리눅스에서 이용가능한 많은 네트웍 서비스 데몬들이 있다. 이러한 데몬들은 나름대로의 설정파일을 가지고 동작하고 있는데, 그 중에서 센드메일과 관련된 이 /etc/sendmail.cf 파일이 가장 복잡하고 다루기 어려운 것으로 간주되고 있다. sendmail.cf 에 대한 설정만 가지고도 책 한권 분량이 가능하다고 한다. 다행스럽게도 이 방대한 내용을 관리자들이 다 알아야 하는 것은 아니다. 사실, 실제 리눅스를 메일 서버로 이용하기 위해서 직접 sendmail.cf 파일을 편집하는 일은 거의 없을 것이다. 센드메일 패키지에서 제공하는 기본 내용만으로 센드메일을 잘 운영할 수 있다.

2.6 메일 alias 기능

메일 alias 기능은 의미 그대로 별명(alias)을 만들어 주는 것이다. 이 기능을 잘 이용하면 간단한 메일링 리스트를 구성할 수 있다. e-mail 주소는 ID@ServerName 의 형식으로 이루어져 있다. 예를 들어, 다음과 같은 형식의 메일 주소를 가지는 것이 가능한다. Jang.Sungjae@hlug.hanyang.ac.kr

위의 메일 주소를 본다면 보통 사람들은 hlug.hanyang.ac.kr 이라는 서버에 저렇게 긴 이름을 가진 사용자 ID 가 발급 가능한지 의문을 가질 것이다. 이것의 실체는 메일 alias 이다. 실제로 hlug.hanyang.ac.kr 서버에 Jang.Sungjae 이라는 사용자는 존재하지 않는다. 다만, 위의 주소로 메일이 도착할 경우 누구에게 메일이 전달되어 지는지에 대한 정보만 가지고 있는 것이다. 이러한 정보를 가진 파일이 /etc/aliases 이다. 이 파일의 구성은 다음과 같다.

원하는alias 이름 : 실제메일주소

Jang.Sungjae@hlug.hanyang.ac.kr 으로 도착한 메일을 sjang@hlug.hanyang.ac.kr 로 보내고 싶다면 /etc/aliases 파일에 다음과 같이 한 라인을 추가하면 된다.

Jang,Sungjae : sjang

같은 서버라면 서버 이름은 생략해도 무방하다.

이 기능을 이용하여 메일링 리스트를 구성할 수 있다. 다음의 예를 보면 쉽게 이해할 수 있을 것이다. 다음은 www3.hanyang.ac.kr 이라는 서버의 /etc/aliases 파일의 일부를 보여주고 있다.

#

#       @(#)aliases     8.2 (Berkeley) 3/5/94

#

#  Aliases in this file will NOT be expanded in the header from

#  Mail, but WILL be visible over networks or from /bin/mail.

#

#       >>>>>>>>>>      The program "newaliases" must be run after

#       >> NOTE >>      this file is updated for any changes to

#       >>>>>>>>>>      show through to sendmail.

#

# Basic system aliases -- these MUST be present.

MAILER-DAEMON:  postmaster

postmaster:     root

.

.

중략

.

.

# Person who should get root's mail

hyuweb:         hint

hint:           1st,2nd,3rd,4th,5th

5th:            ssera,aarons,helyar,ppiazi,rapter,cushion,

openarms,snipersm,nicoss,afmn012,yuki99

4th:            hyun,lovepooh,q444,coffee,seeiris,jwk02,chokh,pmog

3rd:            bluehope,ukpark,olbyun,klion,sfman@unitel.co.kr

2nd:            xiao,drkoty

1st:            sjang,jaejin@hymail.hanyang.ac.kr,jnlee@ctk.co.kr

#1st:            sjang,jaejin@hymail.hanyang.ac.kr,jnlee@ctk.co.kr,teamo

#2nd:            xiao,conte76,zeno,hybris,drkoty

#3rd:            bluehope,ukpark,deicide,olbyun,murcury,klion,space

#####################################

#####   www3 server Users ######

#####################################

Systemadmin: sjang,hyun, bluehope

Website: barami, comus, solid

Other: books, dcms, msbong, lullu

위에서 보는 바와 같이 왼쪽의 alias 이름 하나에 오른쪽의 전달된 메일 주소에 여러개의 메일 주소를 입력하여 메일링 리스트 구성이 가능하다. # 으로 시작하는 라인은 주석문이므로 설정에서 제외된다. 위의 내용중에 alias 가 Systemadmin 이 있다. 이것은 Systemadmin@www3.hanyang.ac.kr 로 메일이 도착하면 오른쪽에 있는 sjang,jaejin@hymail.hanyang.ac.kr,jnlee@ctk.co.kr,teamo 에게 모두 메일이 전달되도록 설정한 것이다. 서버이름이 생략된 것은 서버이름이 모두 www3.hanyang.ac.kr 로 인식하게 된다. 중략 아래에서 쓰여진 부분에서 보는 바와 같이 메일이 hyuweb@www3.hanyang.ac.kr 로 전달되면 이 메일은 다시 hint@www3.hanyang.ac.kr 로 전달되고, 이것은 다시 1st@www3.hanyang.ac.kr, 2nd@www3.hanyang.ac.kr, 3th@www3.hanyang.ac.kr, 4th@www3.hanyang.ac.kr, 5th@www3.hanyang.ac.kr 로 전달되고 이 메일은 다시 다음 라인에 있는 각 사용자에게 메일이 전달되게 된다. 이렇게 하여 메일링 리스트를 구성할 수 있게 된다. alias 기능의 장점은 alias 이름으로 들어가는 것이 실제로 존재하지 않는 계정이어도 가능하다는 것이다. sjang@www3.hanyang.ac.kr 로 오는 메일을 받기 위해서 실제로 www3.hanyang.ac.kr 서버에 sjang 이라는 계정을 발급하지 않고, 대신에 alias 기능을 이용하여 서버의 /etc/aliases 파일에

sjang : sjang@hlug.hanyang.ac.kr

만 추가하면 sjang@www3.hanyang.ac.kr 로 오는 메일을 sjang@hlug.hanyang.ac.kr 로 전달 받을 수 있다.

주의할 점이 있는데 /etc/aliases 파일을 편집하였으면 반드시 newaliases 명령어를 실행해 주어야 한다. 이 파일은 실시간으로 참조되는 것이 아니라 일종의 db 파일로 관리되어 읽혀지므로 편집후에는 반드시 newaliases 명령어를 실행시켜 주어야 한다. 이런 내용이 /etc/aliases 파일의 윗부분에 주석으로 처리되어 설명되어 있다. alias 에 대한 내용이 저장되어 있는 db 는 /etc/aliases.db 이다. newaliases 명령어를 실행하게 되면 /etc/aliases 파일이 새롭게 읽혀져서 /etc/aliases.db 파일로 저장되고, 이 파일이 실시간으로 사용된다.

2.7 sendmail.cf 파일의 기본적인 설정

전자우편의 크기 제한

센드메일 프로그램을 통하여 송/수신되는 전자우편의 크기를 제한하는 설정이다. sendmail.cf의 내용을 다음과 같이 수정한다.

# maximum message size

O MaxMessageSize=1000000

위 설정은 전자우편의 최대 크기를 약 1MB 정도로 제한하는 설정이다. 메일 서버의 디스크 공간을 고려하여 설정할 수 있다.

2.8 센드메일의 상태 확인

위의 과정을 통해 센드메일을 모두 설치하였다면, 이상 없이 동작하는지 확인해야 한다. 일반적으로 센드메일은 -bd(background daemon)라는 옵션과 -q1h(queueing per 1 hour)라는 옵션으로 동작하므로, 시스템 관리자 권한으로 다음과 같은 명령으로 센드메일을 실행한다.

% /usr/lib/sendmail bd q1h

위와 같이 센드메일 프로그램을 실행하였을 때, 소유 권한에 문제가 있거나(일반 사용자가 센드메일을 실행하는 경우) sendmail.cf 등의 환경 설정 파일에 에러 메시지를 출력한다.

센드메일을 실행시킨 다음, 센드메일이 동작하고 있는지 여부를 ps 명령으로 확인한다. 이상 없이 프로세스가 동작하고 있다면 telnet 명령으로 센드메일이 접속을 받아들이는지 확인해 보도록 한다. 센드메일이 사용하는 포트는 25번이다. 따라서,

% telnet localhost 25

명령으로 접속을 시도한다(localhost는 자기자신을 가리키는 키워드이고 25는 포트 번호이다).

% telnet localhost smtp

Trying 127.0.0.1...

Connected to localhost.

Escape character is '^]'.

220 mail.test.co.kr ESMTP Sendmail 8.8.8H2/8.8.8; Sun, 24 Jan 1999 15:36:38 +0900 (KST)

위와 같은 메시지가 출력된다면 센드메일이 이상 없이 동작하고 있는 것이다.

3. POP3 (Post Office Protocol version 3)

POP3는 전자우편 클라이언트(MUA : Mail User Agent)가 MTA의 사서함(Mailbox)에서 자신의 전자우편을 가져오는 프로토콜이다. POP3는 대부분의 전자우편 클라이언트에서 지원하고 있어 폭넓게 사용되는 응용 프로토콜이다.

3.1 POP3 기능

전자우편이 메일 서버에 도착하면 센드메일은 도착된 전자우편을 사용자별로 스풀 디렉토리에 저장해 둔다. 사용자가 로그인하여 mail, elm, pine등의 MUA(Mail User Agent)를 이용하여 전자우편을 확인하면, MUA는 스풀에 저장되어 있는 사용자의 전자우편을 가져오고 스풀에 있는 전자우편을 삭제한다.

사용자가 읽은 전자우편을 추후에 다시 읽기 위해 저장하도록 명령하면 사용자의 홈디렉토리에 mbox를 생성하고 보관하게 된다.

위의 과정은 전자우편이 메일 호스트에 도착해서 전자우편이 저장되고 사용자가 전자우편을 요구했을 때 전자우편이 읽혀지는 과정이다. 위의 과정을 통해서만 본다면 사용자가 전자우편을 확인하기 위해서는 메일 서버에 접속하여 MUA에 해당하는 전자우편 클라이언트 프로그램을 이용해서 확인해야 한다.

그러나, 전자우편을 확인하기 위해 매번 메일 서버에 로그인 해서 메일 서버의 전자우편 클라이언트 프로그램을 이용한다는 것은 여간 불편한 일이 아닐 수 없다. 전자우편의 내용을 즉시 확인하는 경우에는 큰 문제가 없지만, 파일이 포함되어 있는 경우(7bit 코드로 변환된 형태)나 추후에 전자우편을 확인하는 경우라면 전자우편의 내용이 메일 서버의 사용자 홈디렉토리에 mbox 파일에 저장되기 때문에 이를 이용하는데 많은 불편한 점이 있다는 것이다.

PC에서 사용되는 Netscape Navigator의 Mail Messenger나 Outlook Express 등의 전자우편 클라이언트를 이용하면, 사용자는 메일 서버에 접속하지 않고도 전자우편을 PC로 가져올 수 있다. 이러한 기능은 POP(Post Office Protocol)이라는 프로토콜을 통해 이루어진다. POP은 원격 컴퓨터에서 전자우편을 확인할 수 있도록 하는 TCP/IP 응용 프로토콜이다.

POP 기능을 이용하기 위해서는 메일 서버에 POP 서버가 설치되어 있어야 한다. 즉, POP을 이용하는 클라이언트가 접속을 요구하였을 때, 접속을 받아들이고 서비스를 제공할 수 있는 서버 프로그램이 필요하다. POP 프로토콜은 버전 3까지가 있고 현재는 대부분 버전 3인 POP3를 사용한다.

메일 서버의 전자우편의 내용을 PC에서 처리하기 위한 기능으로 POP 프로토콜만 존재하는 것이 아니라 POP 프로토콜과 유사한 IMAP(Internet Mail Access Protocol)라는 프로토콜이 있다. IMAP 프로토콜은 POP 프로토콜의 기본적인 기능 이외에 확장된 기능을 제공하는 프로토콜이다.

POP3는 서버에 접속한 후 자신의 사서함에 배달된 모든 전자우편을 가져오도록 하고 있다. 따라서 사서함의 전자우편 중 필요한 전자우편을 선택적으로 가져올 수 없다는 등의 문제점을 가지고 있다. 고속의 네트웍 환경을 이용하는 경우에는 큰 문제가 되지 않지만, 모뎀 등을 이용한 저속의 네트웍 환경을 이용하는 사용자에게는 필요하지 않은 전자우편까지 모두 수신해야 한다는 것은 큰 불편이 아닐 수 없다. POP3의 이러한 문제점을 해결하기 위해 IMAP(Internet Message Access Protocol)이라는 프로토콜을 이용할 수 있다.

IMAP은 POP3와 마찬가지로 전자우편 서버(MTA)의 사서함에서 자신의 전자우편을 가져오기 위한 프로토콜이다. 그러나 IMAP은 사서함에 도착한 전자우편 중 선택적으로 전자우편을 수신하는 기능이나 Disconnected 모드를 이용하여 오프라인(offline) 상태에서 전자우편의 동기화 기능 등 확장된 기능을 지원하고 있다.

IMAP은 모뎀 등의 저속 네트웍 환경을 이용하는 사용자에게 적합한 기능을 제공한다. 앞에서 언급한 바와 같이 사서함에 도착한 전자우편 중에서 필요한 전자우편을 선택적으로 수신하는 기능과 전자우편 헤더만 추출하여 수신하는 기능 등을 제공하는 프로토콜이다.

3.2 POP3 서버 설치를 위한 IMAP 패키지 설치

POP3 서버는 리눅스 시스템에 설치되어 있는 프로그램이 아니다. 따라서 POP3를 이용하기 위해서는 별도로 POP3 서버를 설치해 주어야 한다.

간단하게 rpm 으로 설치한다. POP3를 지원해 주기 설치해야 할 패키지는 IMAP 이다. 패키지 이름은 다음과 같다. rpm -Uvh 옵션으로 설치하면 된다.

# rpm -Uvh imap-4.5-4.i386.rpm

환경 설정

POP3는 시스템의 inetd 프로세스를 이용하여 서비스를 제공하는 프로그램이다. 따라서 설치된 POP3가 inetd 프로세스의 제어를 받아 서비스를 제공하기 위해서는 /etc/inetd.conf를 적절히 수정해야 하고, /etc/services에 POP3 서비스에 대한 서비스 이름을 등록해야 한다.

/etc/inetd.conf 수정

/etc/inetd.conf에는 inetd에 의해서 제어되는 많은 시스템의 데몬 프로그램의 내용이 기록되어 있다. POP3가 inetd에 의해 실행되도록 적절한 라인에 항목을 추가한다. 다음은 /etc/inetd.conf 의 내용 중의 일부를 나타낸 것이다. # 으로 시작하는 라인은 주석문이므로 해석되지 않는다. 다음과 같이 설정파일이 pop-3 가 동작하도록 편집해야 한다.

# Pop and imap mail services et al

#

#pop-2   stream  tcp     nowait  root    /usr/sbin/tcpd ipop2d

pop-3   stream  tcp     nowait  root    /usr/sbin/tcpd  ipop3d

#imap    stream  tcp     nowait  root    /usr/sbin/tcpd imapd

#

/etc/services 수정

/etc/inetd.conf에 추가한 POP3에 대한 항목에서 pop3는 서비스를 가리키고 있다. inetd 프로세스가 pop3 서비스를 인식할 수 있도록 /etc/services의 파일에 pop3 항목을 기록해 주어야 한다.

pop3            110/tcp         pop-3           # POP version 3

pop3            110/udp         pop-3

위의 내용은 pop3라는 서비스가 110번 TCP Port과 UDP Port를 사용한다는 것을 시스템에 알려주기 위한 설정이다.

위의 과정이 이상 없이 끝났다면, inetd 프로세스를 다시 동작시켜 inetd 프로세스에 POP3 서버에 대한 설정을 반영하여 동작하도록 한다. ps 명령을 이용하여 inetd의 프로세스 번호를 확인한 다음 해당 프로세서를 재시작 하면 된다.

[root@www3 /root]# ps awux | grep inetd

root       401  0.0  0.1  1136   64 ?        S    Feb21   0:03 inetd

root     12921  0.0  0.7  2232  488 pts/10   R    23:42   0:00 grep inetd

[root@www3 /root]# kill -HUP 401

[root@www3 /root]#

POP3 서버의 이상 유무는 telnet 명령으로 확인해 볼 수 있는데, pop3가 110 번 포트를 사용하고 /etc/services 파일에 등록되어 있으므로 telnet 명령으로 해당 포트로 접속하여 접속이 이루어지는지 확인하면 된다. 다음과 같이 telnet localhost 110 또는 telnet localhost pop3 로 telnet 접속하면 동작여부를 확인할 수 있다.

[root@www3 /root]# telnet localhost 110

Trying 127.0.0.1...

Connected to www3.hanyang.ac.kr.

Escape character is '^]'.

+OK POP3 www3.hanyang.ac.kr v7.59 server ready

[root@www3 /root]# telnet localhost pop3

Trying 127.0.0.1...

Connected to www3.hanyang.ac.kr.

Escape character is '^]'.

+OK POP3 www3.hanyang.ac.kr v7.59 server ready

위와 같은 메시지가 출력된다면 POP3 서버는 정상적인 동작을 하고 있다는 것을 확인할 수 있다.

4. Qmail 설정과 활용

인터넷이 발전하기 시작하면서 어느 누구하나 E-Mail 주소를 가지고 있지 않은 사람이 없게 되었다. 명함에도 홈페이지 주소와 함께 E-Mail 주소도 포함되는 것이 당연시 되어버린 지금 조금이라도 관심이 있었던 사람이라면 Apache 라는 이름과 함께 Sendmail이라는 이들어봤을 것이다. 바로 이 Sendmail이 E-Mail 주소를 부여해주는 역할을 하는 것이다. 집주

소를 알려주며, 메일을 보내기도 하고, 받아주기도 한다. 말하자면 최신판 우체국이란 이야

기이다. 이 메일을 보기 위해서는 많은 프로그램이 있다. 우체국은 하나이지만, 우체통은

가지가지라는 것이다. 보통은 메일서버 하면 Sendmail 만을 생각한다. 그러나 컴퓨터 분야가 언제나 그렇듯이 독보적인 존재란 있을 수가 없다. 항상 유사한 프로그램이 있기 마련이다. 현재 우리나라에 우체국은 하나뿐이지만, 인터넷상의 메일 서버는 여러 가지 종류가 있다. 그중에서 Sendmail이 가장 강력하고 많이 사용하고 있다는 점 때문에 메일 서버 하면 Sendmail이라는 말이 나온 것이다.

Sendmail을 공부하다 보면 Qmail 이란 메일서버에 대한 이야기가 나온다. Sendmail의 보안

상의 약점을 보완한 메일 서버이기에 보안을 중요시 하는 사이트에는 Qmail을 사용하라는

적용하라는 친절한 안내문과 함께...

자, 그럼 Qmail 의 세계로 들어가보자!

4.1 개요

Qmail은 UNIX를 위한 Internet 기반의 Mail Transfer Agent(MTA)이다. 이것은 UNIX OS와 함께 제공되는 Sendmail 시스템을 대체할 수 있다. Qmail 은 다른 MTA 들처럼 메시지 교환을 위하여 Simple Mail Transfer Protocol(SMTP)를 사용한다.

4.2 왜 Qmail인가?

Security(안전성)

Qmail은 높은 보안을 위하여 설계되었다. 메일의 전송은 이용 자에게는 아주 중요한것이며 전달되지 않으면 안된다. 이것은 완벽하게 안전해야 한다 (이것이 qmail이 쓰여지게 된이유로서 sendmail 과 다른 MTA의 보안상의 허점을 보완 하고자 한것이었다)

Performance(효율성)

펜티엄시스템에 BSD 운영체제하에 qmail은 하루에 20만개의 로컬 메세지 를 손쉽게 처리할 수 있다. --- 분리된 메세지로 주입되었으며 실제테스트로 각 메일 박스로 전송되었다. 원격 전송시스템들은 원래의 제한적인 느리디 느린 DNS 와 SMTP 들 이었다. qmail은 기본적으로 20개의 유사한 전송시스템들과 중첩되어 있었고 메일링 리스트들을 빠르게 확대 시켰다. (이러한 방법이 qmail이 운용되는 대규모의 메일링 리스트의 세팅이다.)

Reliability(신뢰성)

qmail의 단순한전달방식(? - straight-paper-path) 의 철학은 메세지를 받아 들이는 시스템의 메세지를 보장하며 절대로 메세지를 잃어버리지 않는다. qmail은 옵션으로 maildir, new, 수퍼유저와 연관된 이용자 우편함 포맷도 지원한다. Maildir은 mbox와 mh 폴더와는 다른것으로 만일 시스템이 전송중에 부서지더라도 깨지는 일이 없다. 이러한 예는 NFS를 통하여 NFS 클라이언트의 다수의 이용자가 동시에 편지를 읽은 안전한 편지 읽기가 아니더라도 깨지지 않는다.

Simplicity(간단함)

qmail은 다른 인터넷 MTA와 비교할때에 상당히 작다. 그 몇가지 이유는 (1) 다른 MTA들은 전달, 알리어싱, 메일링 리스트 메커니즘이 분리되어 있다. qmail은 그것 자신의 직접 수행할수 있는 메일링 리스트의 간단한 전달메커니즘을 가지고 있다. (2) 다른 MTA들은 빠르고+불안전한 모드에서 느리고+큐화 하는 가시적인 전송모드를 지원한다. qmail 전송은 큐내에서 새로운 요소에 의해서 시작되어 즉각 적으로 전송한다. 이것을 빠른+큐모드라고 한다. (3) 다른 MTA도 포함하고 있는 효율 적인 inetd 에의한 가시화된 감시를 일정한 시스템로드를 가지고수행한다. qmail는 본래 원래 시스템의 로드를 제한하도록 디자인 되었다. 이것은 시스템의 inetd에 의해 서 안전하게 구동된 qmail-smtpd 에 의해서 구현된다.

Sendmail을 대체

qmail은 host와 이용자의 매스커래이딩 및 완벽한 호스트숨김, 가상 도메인, NULL 클라이언트, 리스트소유자의 재작성, 컨트롤 릴레이, 이중경계의 레코 딩, RFC822의 주소목록을 따르는 중재기능, 목록의 loop를 검색하는 크로스호스트 메일링, 수신자단위의 체크포인팅, 다운된 호스트를 위한 보류기능, 스케쥴에 따른 메세지 재전송 기능등을 지원한다. qmail은 sendmail의 기능을 포함하며 당신의 현재 의 UA를 구현할 수 있다.

4.3 역사

Qmail은 Dan Bernstein(DJB, http://pobox.com/~djb/djb.html)에 의해서 만들어 졌다. 첫 번째 공개 릴리즈는 0.70 베타 버젼으로 1996년 1월 24일날 발표되었으며, 첫번째 감마(gamma) 릴리즈는 0.90 버전으로 1996년 8월 1일날 발표되었다. 버전 1.0은 첫 번째 공식 릴리즈이며 1997년 2월 20일날 발표되었으며, 현재 버전은 1.03으로 1998년 6월 15일날 릴리즈 되었다. 다음 버전인 2.0에 대하여 알고 싶다면 http://pobox.com/~djb/qmail/future.html을 참조하기 바란다.

4.4 기능 리스트

Setup(셋업)

1) 당신의 상이한 UNIX 시스템에 자동으로 적응한다.

2) AIX, BSD/OS, FreeBSD, HP/UX, Irix, Linux, OSF/1, SunOS, Solaris 와 그밖의 것들은 포팅이 필요없다.

3) 호스트별로 설정(config, config-fast)이 자동적으로 된다.

4) 빠른 설치가 된다. - 대규모의 리스트의 결정은 make 로 한다.

Security(안전성)

1) 주소들, 파일과 프로그램은 명확하게 구분되어 있다.

2) setuid 코드 (qmail-queue)의 코드가 최소화 되어 있다.

3) root 코드 (qmail-start, qmail-lspawn) 가 최소화 되어 있다.

4) 다섯가지의 믿을만한 파티션을 지원 -- 안전한 계층

5) 옵션으로 한가지 방향의 해쉬로그인, 전반적인 컨텐트 및 그외 (QUEUE_EXTRA)

Message construction(메시지 구축, qmail-inject)

1) RFC 822, RFC 1123

2) 주소그룹을 완벽하게 지원

3) RFC 822 포맷의 구형스타일의 주소변환을 자동으로 지원

4) 현재의 유저에이전트와 호환되는 sendmail 후크 지원

5) 메모리에 의해서만 제한되는 헤더라인의 길이

6) 호스트 매스커레이딩 (control/defaulthost)

7) 이용자 매스커레이딩 ($MAILUSER, $MAILHOST)

8) 자동적으로 Mail을 따라서 메세지 생성 ($QMAILMFTFILE)

SMTP service(SMTP 서비스, qmail-smtpd)

1) RFC 821, RFC 1123, RFC 1651, RFC 1652, RFC 1854

2) 8-bit clean

3) 931/1413/ident/TAP callback (tcp-env)

4) relay control---stop unauthorized relaying by outsiders (control/rcpthosts)

5) 컨트롤과 앨리어스간의 연계를 지원하지 않음

6) 로컬 IP 주소를 자동으로 인식

7) 버퍼별 타임아웃 지원

8) 홉 카운팅

9) 병렬처리 제한 (ucspi-tcp/tcpserver, available separately)

10) 해약한 이용자로 알려진 유저로부터 접속 거절 (tcpserver)

11) 인가된 클라이언트를 위한 연계와 메세지 재작성

12) 옵션으로 RBL/ORBS 지원 (rblsmtpd, available separately)

Queue management(큐 관리, qmail-send)

1) 큐에 추가하는 메세지 인스턴스의 제어

2) 병렬처리 제어 (control/concurrencyremote, control/concurrencylocal)

3) 큐디렉토리를 나눔 -- 큰 큐를 얻기위하여 속도가 떨어지는것을 피함

4) 2차원의 재시도 스케줄 -- 오래된 메세지의 재시도를 위함

5) 독립적인 메세지 재시도 스케쥴

6) 자동적인 안전한 큐잉 -- 만일 시스템이 깨져도 메일을 읽지 않음

7) 자동적인 수신자별로 체크포인팅

8) 자동적인 큐를 청소 (qmail-clean)

9) 큐 보기 (qmail-qread)

10) 자세한 통계적인 전송 (qmailanalog, available separately)

Bounces(qmail-send)

1) QSBMF 바운스 메세지 --- 기계읽기과 인간이 읽기를 모두 지원

2) HCM SSC 지원 --- RFC 1893 에러코드에서 정의한 언어로 부터 독립되어 이 두가지의 바운스가 포스트매스터에게 전송한다

Routing by domain(도메인에 의한 라우팅, qmail-send)

1) 복수의 로컬호스트 명칭 지원 (control/locals)

2) any number of names for local host (control/locals)

3) 복수의 가상도메인 지원 (control/virtualdomains)

4) 도메인 와일드 카드 지원 (control/virtualdomains)

5) 퍼센트 단위의 컨피규 지원 (control/percenthack)

6) UUCP 후크

SMTP delivery(SMTP 전송, qmail-remote)

1) RFC 821, RFC 974, RFC 1123

2) 8-비트 처리

3) 호스트 백오프를 자동으로 다운로드

4) 지능적인 라우팅 -- smarthost, localnet, mailertable (control/smtproutes)

5) 퍼단위의 타임아웃

6) 정적인 SMTP 큐 - SLIP/PPP에서 사용하기 위하여 (serialmail, 분리 가능)

7) 자동조정을 지원 (시리얼 메일)

Forwarding and mailing lists(전달 전송과 메일링 리스트, qmail-local)

1) sendmail의 .forward 와 호환 (dot-forward, 분리 가능)

2) 해쉬화된 포워딩 데이타베이스 (fastforward, 분리가능)

3) sendmail의 /etc/aliases 와 호환 (fastforward/newaliases)

4) 주소의 와일드 카드 지원 (.qmail-default, .qmail-foo-default, 등.)

5) 소유자를 위한 메일링 리스트 --- 자동으로 바운스를 전환하고 휴가 메세지전송

6) VERPs--- 메일링 리스트 바운스를 위한 자동적인 수신자 인증

7) 호스트의 크로스를 자동으로 체

8) 자동화된 서브스크립션 매니저 (ezmlm, 분리 가능)

Local delivery(로컬 전송, qmail-local)

1) 이용자가 제어하는 주소 계층 -- 프래드가 모든것을 제어한다

2) mbox 전달

3) 신뢰성있는 NFS 전달

4) 이용자가 제어하는 프로그램 전송 : procmail 등 (qmail-command)

5) 옵션으로 새로운 편지 알려주기 (qbiff)

6) NRUDT 옵션으로 수신자에게 편지 돌려주기 (qreceipt)

7) 조건부 필터일 (condredirect, bouncesaying)

POP3 Service(qmail-popup, qmail-pop3d)

1) RFC 1939

2) UIDL 지원

3) TOP 지원

4) APOP 후크

5) 모듈라 패스워드 체킹 (checkpassword, available separately)

4.5 Qmail 기능 향상 패키지 내용

dot-forward(http://pobox.com/~djb/dot-forward.html)

: Sendmail 의 .forward 파일의 처리와 같은 기능을 가지고 있다.

fastforward(http://pobox.com/~djb/fastforward.html)

: Qmail 상의 포워딩을 지원한다.

Unix Client-Server TCP(ucspi-tcp,http://pobox.com/~djb/ucspi-tcp.html)

: 일반적인 유닉스 시스템에서 TCP/IP 서버 와/도는 클라이언트를 만드는 프로그램이다. 여기서는 큐메일의 기동을 inetd 를 대체할 목적으로 이용되고 있다.

daemontools(http://pobox.com/~djb/daemontools.html)

: 패키지의 모니터, 컨트롤 그리고 로그를 수행하고 오랫동안 수행되는 프로그램의 출력을 처리 한다. 그냥 데몬으로 부른다.

qmailanalog(http://pobox.com/~djb/qmailanalog.html)

: 큐메일의 로그를 다양한 방법으로 분석합니다.  Russ Allbery 는 tai64nfrac (http://qmail.manic.co.kr/tai64nfrac) 를 만들었습니다. 이것은 데몬툴 0.63 이 생성한 초단위의 기능적 기록을 큐메일 아날로그에서 분석할수 있는 포맷으로 변환한다.

rblsmtpd(http://pobox.com/~djb/rblsmtpd.html)

: 스팸 메일 방지 툴

serialmail(http://pobox.com/~djb/serialmail.html)

: SMTP 서버의 Maildir 메일박스로 부터 편지를 가져오는 프로그램이다.

mess822(http://pobox.com/~djb/mess822.html)

: Qmail 상의 포워딩을 지원한다.

ezmlm(http://pobox.com/~djb/ezmlm.html)

: Qmail을 위한 메일링 리스트 관리 프로그램.

checkpassword(http://pobox.com/~djb/checkpwd.html)

: 인터페이스에서 적절한 이용자인지를 검증하는 프로그램입니다. 큐메일과 연동되는 POP3 서버가 필요합니다.

4.6 License(저작권)

qmail is copyrighted by the author, Dan Bernstein, and is not distributed with a statement of user's rights. In http://pobox.com/~djb/softwarelaw.html, he outlines what he thinks your rights are under U.S. copyright law. In http://pobox.com/~djb/qmail/dist.html he grants the right to distribute qmail source code. Binary distributions are allowed under the terms described there and in http://pobox.com/~djb/qmail/var-qmail.html, although, at this time, nobody is actually attempting this.

The bottom line is that you can use qmail for any purpose, you can redistribute unmodified qmail source distributions and qualifying var-qmail binary distributions, and you can distribute patches to qmail. You can't distribute modified qmail source code or non-var-qmail binary distributions.

4.7 다른 MTA 들과의 비교

MTA	Maturity	Security	Features	Performance	Sendmailish	Modular
qmail	medium	high	high	high	addons	yes
Sendmail	high	low	high	low	X	no
Postfix	low	high	medium	high	yes	yes
exim	medium	low	high	medium	yes	no

4.8 준비하기

1) Qmail의 최신 버전 (http://pobox.com/~djb/software/qmail-1.03.tar.gz)을 인터넷에서 다운로드 받아온다. RPM 버젼도 구할 수 있다.(ftp://moni.msci.memphis.edu/pub/ qmail)

2) ucspi-tcp(http://cr.yp.to/software/ucspi-tcp-0.84.tar.gz) : 이 파일은 커맨드라인 방식의 TCP S/C 어플리케이션이다. 이후 tcpserver 로 Qmail의 SMTPD와 POP을 로드하게 된다. 다른 머신에서 메일을 보내거나 받을 필요가 없다면 다운 받지 않아도된다.

3) checkpassword(http://cr.yp.to/software/checkpassword-0.81.tar.gz) : POP서비스를 제공하기 위해서 필요하다. 즉, 윈도우즈 등의 다른 운영체제를 사용하는 컴퓨터로부터 Eudora 등의 MUA를 이용하여 Qmail 서버에 메일 송수신을 요청하는 경우(사용자 인증 과정 처리)에 필요하다. 따라서, 위의 ucspi-tcp와 마찬가지로 텔넷으로 로그인하여 elm, pine 등의 MUA를 사용하는 경우라면 필요 없다.

4) 모두 다운 받았다면 적절한 디렉토리에 압축을 푼다.

[root@uranos /root]# cd /usr/local/src

[root@uranos src]# gzip -cd qmail-1.03.tar.gz | tar -xvf -

[root@uranos src]# gzip -cd ucspi-tcp-0.84.tar.gz | tar -xvf -

[root@uranos src]# gzip -cd checkpassword-0.81.tar.gz | tar -xvf -

4.9 컴파일 전 해주어야 할 일

1) 설치 할 디렉토리 ; 기본값으로  /var/qmail 에 설치되도록 되어 있다. 만일 이값을 바꾸고 싶다면, qmail 의 소스 디렉토리에 있는 conf-qmail 의 내용을 수정하면 된다. 간단하게 경로만 한 줄 바궈주면 된다.

2) Qmail 의 user 와 group ; Qmail 은 보안상의 이유로 8개의 uid 와 2개의 gid를 사용한다. conf-users 와 conf-groups 파일을 읽어보고 특별한 이유가 없다면 그냥 사용하는 것이 좋다.

4.10 Qmail 의 홈디렉토리 생성

[peacock1@uranos peacock1]$ su -

Password:

[root@uranos /root]# mkdir /var/qmail

[root@uranos /root]#

위의 경로는 conf-qmail 에 있는 경로명과 일치해야 한다. 물론 root 권한으로 생성해야 한다. 명령행이 #로 표기된 것은 root 권한으로 실행해야 할 명령들이고 일반 유저 권한으로 해도 되는 것은 $로 표기하도록 하겠다.

4.11 사용자와 그룹 생성

INSTALL.ids 파일을 참조하여 필요한 사용자와 그룹을 생성한다.

# groupadd nofiles

# useradd -g nofiles -d /var/qmail/alias alias

# useradd -g nofiles -d /var/qmail qmaild

# useradd -g nofiles -d /var/qmail qmaill

# useradd -g nofiles -d /var/qmail qmailp

# groupadd qmail

# useradd -g qmail -d /var/qmail qmailq

# useradd -g qmail -d /var/qmail qmailr

# useradd -g qmail -d /var/qmail qmails

이상과 같이 사용자 및 그룹을 생성했다면 /etc/passwd 파일을 열어서 아래 내용과 비교하여 password field 와 shell field를 유사하게 바꾼다. 만약 shadow password를 사용한다면 /etc/shadow 파일의 password field 를 수정하도록 한다. uid 와 gid 는 이와 다르게 나타날 것이며, shell field 에는 /bin/false 등을 넣어도 된다.

alias:*:1522:1522::/var/qmail/alias:/bin/true

qmaild:*:1523:1522::/var/qmail:/bin/true

qmaill:*:1524:1522::/var/qmail:/bin/true

qmailp:*:1525:1522::/var/qmail:/bin/true

qmailq:*:1526:1523::/var/qmail:/bin/true

qmailr:*:1527:1523::/var/qmail:/bin/true

qmails:*:1528:1523::/var/qmail:/bin/true

4.12 컴파일 및 설치

# make setup check

이렇게 하면 컴파일을 한 후 /var/qmail 아래에 필요한 디렉토리를 생성하고 필요한 파일들을 복사하게 된다.

/var/qmail □□□□ alias/

□□ bin/

□□ boot/

□□ control/

□□ doc/

□□ man/

□□ queue/

□□ users/

□□ rc*

4.13 최소한의 환경 설정

컴파일이 끝났다고 해도 몇가지 필요한 설정을 해주어야 한다. 기본값으로 설정되어 있는 초기치를 그대로 사용해도 대부분 잘 작동하지만, 적어도 메일을 받기 위해서는 자신의 호스트명을 Qmail에게 알려주어야 한다. Qmail은 /var/qmail/control 의 도메인 목록 파일들을 참고하여 메일을 받아들이거나 거부하기 때문에 이 작업은 필수적이다.

주소를 등록하는 방법은 두가지가 있다. ./config-fast 스크립트를 이용하여 명령행에 직접 자신의 호스트명을 등록하는 방법과 DNS 테이블을 참조하여 자동으로 등록하는 방법이 그것이다. 만약 자신의 시스템이 여러개의 가상 도메인을 가지고 있다면 후자의 방법이 쉬울 것이다. DNS 테이블을 참조하여 자동으로 등록하게끔 하려면 다음과 같이 명령을 내린다.

# ./config

전자의 방식을 사용하려면

# ./config-fast ares.uranos.org

과 같이 호스트명을 뒤에 적어주면 된다. /var/qmail/control 디렉토리의 me  에서 등록한 이름을 확인해 볼 수 있다.

# cat /var/qmail/control/me

ares.uranos.org

만약 여러개의 가상 도메인을 운영하고 있고, ./config 스크립트로 자동 등록하였다면 /var/qmail/control 의 locals, rcpthots 파일에서 자신의 시스템에 할당된 여러개의 이름들을 확인해 볼 수 있을 것이다.

ares.uranos.org 의 peacock1 라는 사람은 peacock1@ares.uranos.org 라는 email주소를 기본적으로 가지되 된다. 그러나 이것을 peacock1@uranos.org 와 같이 사용할 수 있게 하고 싶다면 locals 와 rcpthosts 에 다음과 같이 한 줄을 추가해 넣으면 된다. (물론, uranos.org 이 자신의 DNS 엔트리에 MX 로 설정되어 있어야 한다.)

# cat /var/qmail/control/locals

uranos.org

# cat /var/qmail/control/rcpthosts

uranos.org

4.14 Alias 설정

기존의 MTA의 경우 /etc/aliases를 사용하여 앨리어스를 구성했다. 그러나, Qmail은 이와는 다르게 앞에서 추가했던 alias라는 가짜 사용자를 이용한다. 예를 들어, Postmaster 나 MAILER-DAEMON에게 전달되는 메일은 각각 ~alias/.qmail-postmaster, ~alias/.qmail-mailer-daemon 에 저장되는 방식이다.

굳이 /etc/aliases를 사용해야 할 필요가 있다면 fastforward 라는 패키지를 설치하면 된다.

다음과 같이 하여 /etc/aliases 에 등록된 앨리어스를 ~alias 디렉토리에 생성해 주자.

# cd ~alias; touch .qmail-postmaster .qmail-mailer-daemon .qmail-root

# chmod 644 ~alias/.qmail*

# ls ~alias

-rw-r--r-- 1 root qmail 0 Dec 5 06:20 /var/qmail/alias/.qmail-mailer-daemon

-rw-r--r-- 1 root qmail 0 Dec 5 06:19 /var/qmail/alias/.qmail-postmaster

-rw-r--r-- 1 root qmail 0 Dec 5 06:20 /var/qmail/alias/.qmail-root

4.15 Maildir 생성에 앞서 결정해야 할 사항

Qmail 패키지에는 이미 qmail-local(/var/qmail/bin/qmail-local) 이라는 LDA (Local Delivery Agent)가 포함되어 있다. 이 qmail-local 은 user-controlled mailing lists, cross-host alias loop detection 등이 구현되어 있는 막강한 도구이다. SMTP를 경유하여 qmail-local 에 전달된 메일은 기본적으로 $HOME/Mailbox 에 저장되게 설정되어 있다. 따라서 이미 Sendmail을 사용하던 시스템이라면 /var/spool/mail/username 을  ~username/Maildbox 로 옮기는 작업이 필요하다. 기본적으로 Mailbox 는 mbox 포맷을 가지고 있으며, file locking 방식으로 처리된다.

/var/spool/mail을 버리고 사용자의 홈디렉토리로 분산시켜 저장하는 이유 2가지.

-. 수천, 수만명의 사용자를 보유하게 되면 /var/spool/mail 디렉토리는 해당하는 수만큼의 메일 박스가 존재하게 되며, 이런 거대 디렉토리에서는 수행 능력이 떨어진다.

-. /var/spool/mail 과 같이 모든 사용자가 읽고 슬수 있어야 하며 동시에 안전하게 보호되어야 하는 곳은 코딩하기가 정말 어렵다. 계속해서 보안상의 헛점이 보고되곤 하는 Sendmail 의 처리방식을 계속해서 사용할 것인지, 아니면 Qmail 이 제공하는 보다 안전한 방식을 사용할 것인지 하는 것을 결정해야 한다.

만일 /var/spool/mail을 계속 유지해야만 하는 특별한 이유가 있다면, Qmail 패키지의 소스 디렉토리에 있는 INSTALL.vsm 의 내용을 참조하기 바란다.

두 번째 결정해야만 하는 사항은 Mailbox를 사용할 것인가 아니면 Maildir을 사용할 것인가 하는 문제이다. $HOME/Mailbox 의 문제점은 mbox 포맷으로 구성되어 있다는 것이다. 만일 Mailbox 에 새로운 메시지를 추가하는 중에 시스템이 다운되었다면 추가하려던 메시지는 절삭되어 사라진다. Qmail 은 $HOME/Maildir 포맷을 제공함으로써 이러한 문제를 해결하고 있다.

4.16 Mailbox, Maildir 의 설치

먼저, Mailbox를 설치하려면 다음의 과정을 밟으면 된다. (주의:안전을 위하여 single-user 모드로 시스템을 재시작 한 다음 하는 것이 좋다.)

□ 소수의 사용자를 보유한 시스템이라면, /var/spool/mail 의 모든 파일을 각각 사용자들의 홈디렉토리로 옮긴다.

# mv /var/spool/mail/hurd ~hurd/Mailbox

# chown hurd.hurd ~hurd/Mailbox

# chmod 700 ~hurd/Mailbox

# ln -s ~hurd/Mailbox /var/spool/mail/hurd

# chmod 1777 /var/spool/mail

□ 다수의 사용자를 보유한 시스템이라면, 아예 MUA가 /var/spool/mail 이 아닌 $HOME/Mailbox를 참조하도록 지정할 수도 있다. INSTALL.mbox를 참조하기 바란다. 반드시 /var/spool/mail 디렉토리의 퍼미션을 확인하여 setgid 비트가 설정되어 있을 경우 이를 반드시 제거해 주어야 한다.

다음으로 Maildir 을 설치하는 과정은 INSTALL.maildir 에 설명되어 있다.

□ 우선, /var/qmail/bin/maildirmake를 사용하여 사용자 홈디렉토리에 Maildir 디렉토리를 만든다.

# maildirmake ~hurd/Maildir

# echo ./Maildir/ > ~/.qmail

□ 새로운 사용자 계정을 생성할 때 자동으로 이 과정이 수행되도록 하려면, /etc/skel 안에 똑같이 만들어 주면 된다.

□ Qmail 로 하여금 Mailbox 가 아닌 Maildir을 사용하도록 하기 위해 /var/qmail/rc 스크립트의 내용을 수정한다. "./Mailbox" 라는 문자열을 "./Maildir" 로 변경해주면 된다.

4.17 실행 스크립트의 생성

# cp /var/qmail/boot/home /var/qmail/rc

/var/qmail/boot/home 의 내용은 다음과 같다.

#!/bin/sh

# Using splogger to send the log through syslog.

# Using qmail-local to deliver messages to ~/Mailbox by default.

exec env - PATH="/var/qmail/bin:$PATH"\

qmail-start ./Mailbox splogger qmail

4.18 설치 테스트

rc 스크립트를 실행한다.

# csh -cf '/var/qmail/rc'

프로세스를 확인해보면 4개의 Qmail 관련 데몬이 떠 있는 것을 알수 있다.

# ps ax|grep qmail

323 ? S 0:00 qmail-lspawn ./Maildir/

325 ? S 0:00 qmail-clean

324 ? S 0:00 qmail-rspawn

312 ? S 0:00 qmail-send

322 ? S 0:00 splogger qmail

이중 splogger 는 로그 기록을 남기는 일을 담당하며, /var/log/maillog 에 기록된다.

로컬에서 로컬로 메일 전송 확인

$ echo to:peacock1 | /var/qmail/bin/qmail-inject

~peacock1/Maildir/new/를 확인해 보면 메일이 한통 들어와 잇을 것이다.

로컬-에러 테스트를 위하여 다음과 같이 입력해보자.

$ echo to:nonexistent | /var/qmail/bin/qmail-inject

이 메일은 자신의 메일박스로 즉각 반송될 것이다. 이제 원격지로 메일을 보내보자.

$ echo to:peacock1@nownuri.net | /var/qmail/bin/qmail-inject

원격지의 서버에서 확인해 보면 내용없는 빈 메일이 도착해 있을 것이다. TEST.delivery를 참조하여 나머지 테스트도 차례대로 수행해 보자.

4.19 Sendmail 의 제거

다음의 과정을 따라 Sendmail을 제거해 보자. (REMOVE.sendmail 참조)

□ 자신의 부트 스크립트에 있는 sendmail을 실행하는 라인을 주석처리한다. /etc/rc.d/ 에 있을 것이다. 레드햇 리눅스 사용자들은 ntsysv를 실행시켜 주고, /etc/rc.d/init.d를 참조하도록 한다.

sendmail -bd -q30m

이것과 비슷한 라인을 주석처리 하면된다.

□ /var/spool/mqueue를 확인하여 처리중인 메일이 있다면 다음과 같이 flush 시킨다.

# sendmail -q

□ sendmail 데몬을 kill 처리한다.

□ sendmail 의 setuid 비트를 제거한다.

□ sendmail 바이너리를 다른 이름(예를 들면 sendmail.orig 등)으로 바꾸어 버린다.

□ bin-mail 도 제거한다. 대개 /bin/mail 정도의 위치에 있다. 찾아서 퍼미션을 모두 제거해 버리면 된다.

□ /etc/inetd.conf에서 smtp, pop-2, pop-3 부분을 주석처리하고 -HUP으로 inetd를 재시작한다.

# kill -HUP <pid>

4.20 tcpserver, checkpassword 의 설치

tcpserver 는 ucspi-tcp의 한 부분으로서 외부에 메일 서비스를 제공하려할 때 필요하다. 설치 과정은 간단하다. 컴파일 하고 인스톨 하면 된다.

# cd ../ucspi-tcp-0.84

# make

# make setup check

이렇게 하면 기본적으로 /usr/local/bin 에 바이너리가 설치되고, /usr/local/man 에 맨페이지가 복사된다. 설치될 디렉토리는 conf-home에서 지정하므로 바꾸고 싶다면 에디터로 수정하면 된다.

SMTP 서비스를 특정 호스트로 제한하고 싶다면 FAQ 문서를 참고하여 /etc/tcp.smtp를 생성해주면 된다.

checkpassword 는 사용자 인증 처리에 사용된다. 이 프로그램을 이용하여 qmail-pop3d를 로드하게 된다.

# cd ../checkpassword-0.81

# make

# make setup check

이렇게 하면 /bin 과 /man 에 설치되므로 바꾸고 싶다면 conf-home을 참조하여 변경해 주면 된다.

4.21 부트 스크립트의 설치

시스템 부팅시 자동으로 Qmail 데몬이 로드되도록 하고 싶다면 /etc/rc.d/rc.local 정도에 다음과 같은 세 개의 행을 추가해준다.

# Start Qmail daemon

csh -cf '/var/qmail/rc &'

# Start Qmail SMTP Server

/usr/local/bin/tcpserver -u 523 -g 522 0 smtp /var/qmail/bin/qmail-smtpd&

(qmaild 유저의 UID 와 GID)

# Start Qmail POP Server

/usr/local/bin/tcpserver 0 110 /var/qmail/bin/qaill-popup uranos.org \

/usr/local/checkpassword /var/qmail/bin/qmail-pop3d Maildir &

4.22 Sendmail wrapper 의 설치

MUA 프로그램들을 위해서 Qmail 의 sendmail wrapper를 설치한다.

# ln -s /var/qmail/bin/sendmail /usr/lib/sendmail

# ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail

4.23 Qmail 의 시동

이제 모든 설치가 끝났다. 시스템을 다시 시작하거나, 위에서 /etc/rc.d/rc.local 에 써준 명령들을 참고하여 Qmail 데몬을 로드합니다. ps 명령으로 확인해보고, TEST.receive 파일을 참조하여 테스트를 거칩니다.

4.24 관련 사이트 정리

http://www.qmail.org (Qmail 공식 홈페이지)

http://pobox.com/~djb (Qmail 제작자의 홈페이지)

http://kldp.org/qmail (Qmail 한글 홈페이지)

http://web.infoave.net/~dsill/lwq.html (Life with qmail)

http://kldp.org/Translations/Qmail-KLDP (Qmail HOWTO)

http://kldp.org/KoreanDoc/Qmail_MySQL-KLDP (MySQL과 Qmail과의 인터페이스)

4.25 Qmail 강좌를 끝마치며...

아마도 Qmail에 대하여 처음 들어보는 사람들도 있을 것이다. 본인도 회사에 입사해서 처음으로 Qmail이란 것도 있구나 하고 알았다. Sendmail 도 강력한 기능으로 인하여 많은 사람들에게 사랑 받고 있지만, Qmail 또한 Sendmail이 가지지 못하는 몇가지 기능들로 인하여 많은 사랑을 받고 있다. 이번 기회를 통하여 Qmail에 대하여 알려드리게 되어서 무엇보다도 기쁘고, 많은 사람들에게 도움이 되었을 공동체 세미나가 되었기를 바란다.

5. 아파치 서버

인터넷이라 불리우는 매체가 폴발적인 인기를 얻기 시작한지 몇 년 되지 않은 지금... 사람들은 인터넷 하면 WWW로 시작하는 홈페이지 사이트를 연상한다. 사실 인터넷이라 함은 WWW 뿐만이 아닌 Gopher, Archie, telnet, ftp, news, mail 등 많은 서비스들을 포함하고 있는데도 말이다. 이렇게 된데에는 어떤 원인이 있을까??? WWW 서비스는 기존의 다른 서비스들보다 쉽다. 또한 그림과 소리도 포함할 수 있다. 여기에 또한 힘을 실어준 것이 있었으니 이것이 바로 Apache 웹서버이다.

Apache 는 강력한 기능과 안정성, 편의성, 속도 등을 앞세워 기존의 웹서버들의 자리를 차지하기 시작하였다. 또한 소스를 공개하여 Linux 와 같이 개발되면서 더욱 빨리 퍼져 나가기 시작하였다. 지금 여러분들께서 방문하는 웹 사이트들의 대부분이 이 Apache 서버로 작동 중에 있다는 사실을 알아두고, Apache 웹서버를 이용한 사이트 구축에 대하여 알아보도록 하자.

5.1 개요

아파치는 1995 년 그 당시에 가장 인기 있었던 웹 서버중의 하나인 NCSA HTTPD 1.3 버젼을 기반으로 탄생하였다. 그 후 기존의 NCSA 웹 서버에 더욱 향상된 기능들을 탑재하여 Apache 웹 서버를 발표하였다. 현재는 인터넷 웹 서버 중에서 최고의 인기를 구가하고 있는 이른바 '잘 나가는' 소프트웨어 중의 하나이다. 그 이유를 들자면 지속적으로 패치파일을 제공하고 최고의 퍼포먼스를 내고 있기 때문이다. 물론 무료로 제공된다는 점과 많은 마켓쉐어의 점유로 인하여 안정성을 인정받았다는 점도 한 이유가 된다. 그리고 Windows NT 4.0 과 95 용으로도 Beta 판이 나와있으므로 Unix 환경이 갖추어 지지 않은 분들은 한번 사용해 보기 바란다.

아파치는 현재까지 1.3.12 까지 나와있으며, 테스트 버젼이 아닌 안정된 버젼이다.

참고로 아래의 통계표는 인터넷에 연결되어 있는 컴퓨터중에서 웹서버 소프트웨어 사용량을 Netcraft에서 조사한 결과이다.

Top Servers

Server	Dec 97	Percent	Jan 98	Percent	Change
Apache	753341	44.79	827893	45.12	0.33
Microsoft-IIS	351755	20.91	381763	20.81	-0.10
Netscape-Enterprise	88616	5.27	97317	5.30	0.03
NCSA	68097	4.05	69223	3.77	-0.28

Note: Why the name 'Apache' ?

아파치는 기존 NCSA httpd 1.3 에 패치파일들을 제공했던 일련의 사람들이 모여 구성한 아파치 그룹에서 "A PAtCH server" 의 조합으로 아파치라는 이름을 생각해 내었다.

5.2 준비하기

아파치를 설치하기에 앞서 아파치 웹 서버프로그램이 필요하다. 최신버젼은 아파치 웹 서버 홈페이지(http://www.apache.org) 에서 쉽게 구할 수 있다.

ftp://ftp.apache.org (Apache Primary Site)

레드햇 사용자

ftp://ftp.redhat.com

ftp://ftp.bora.net

데비안 사용자

http://packages.debian.org/apache

5.3 파일 내용

위의 사이트에서 소스를 가져와서 /usr/local/src 디렉토리에 압축을 푼다.

[root@uranos src]# gunzip -cd apache_1.3.12.tar.gz | tar -xvf -

[root@uranos src]# cd apache_1.3.12

[root@uranos apache_1.3.12]# ls -alF

total 240

drwxr-xr-x   8 1078     1078         4096 Feb 24 08:10 ./

drwxr-xr-x   3 root     root         4096 Mar  4 02:11 ../

-rw-r--r--   1 1078     1078        12957 Apr  1  1999 ABOUT_APACHE

-rw-r--r--   1 1078     1078         2922 Feb 24 07:51 Announcement

-rw-r--r--   1 1078     1078        27964 Dec 22 00:43 INSTALL

-rw-r--r--   1 1078     1078        35773 Aug 21  1999 KEYS

-rw-r--r--   1 1078     1078         2848 Jan  2  1999 LICENSE

-rw-r--r--   1 1078     1078        26758 Jan 12 04:47 Makefile.tmpl

-rw-r--r--   1 1078     1078         2046 Apr  1  1998 README

-rw-r--r--   1 1078     1078         3132 Mar 20  1999 README.NT

-rw-r--r--   1 1078     1078        11176 Dec 20 23:27 README.configure

-rw-r--r--   1 1078     1078          331 Sep 22  1998 WARNING-NT.TXT

drwxr-xr-x   2 1078     1078         4096 Feb 24 08:07 cgi-bin/

drwxr-xr-x   2 1078     1078         4096 Feb 24 08:10 conf/

-rw-r--r--   1 1078     1078         5909 Dec 28 18:12 config.layout

-rwxr-xr-x   1 1078     1078        56062 Feb  5 23:28 configure*

drwxr-xr-x   3 1078     1078         4096 Feb 24 08:07 htdocs/

drwxr-xr-x   3 1078     1078         4096 Feb 24 08:07 icons/

drwxr-xr-x   2 1078     1078         4096 Feb 24 08:10 logs/

drwxr-xr-x  11 1078     1078         4096 Feb 24 08:11 src/

디렉토리명	디렉토리 내용
cgi-bin	CGI 스크립트 모음
conf	아파치 실행할 때 환경 초기값 설정파일
htdocs	일반적인 서버 홈페이지 디렉토리
icons	아파치 서버 자체적으로 사용하는 아이콘
logs	여러 가지 사용 기록 저장 파일
src	아파치 소스

5.4 컴파일 전 해주어야 할 일

만약 PHP3나 MySQL등의 DataBase와 연동을 생각한다면 순서가 중요하다. 먼저 DataBase 가 설치되어야 하며, Apache configure, PHP3, Apache 설치 순으로 진행하면 된다. 이와 관련해서는 해당하는 프로그램들의 설치 안내 문서들을 잘 읽어보기 바란다.

apache_1.3.12디렉토리에서 다음과 같이 해보자.

[root@uranos apache_1.3.12]# ./configure --help|more

[hang on a moment, generating help]

Usage: configure [options]

Options: [defaults in brackets after descriptions]

General options:

--quiet, --silent      do not print messages

--verbose, -v          print even more messages

--shadow[=DIR]         switch to a shadow tree (under DIR) for building

Stand-alone options:

--help, -h             print this message

--show-layout          print installation path layout (check and debug)

Installation layout options:

--with-layout=[F:]ID   use installation path layout ID (from file F)

--target=TARGET        install name-associated files using basename TARGET

--prefix=PREFIX        install architecture-independent files in PREFIX

--exec-prefix=EPREFIX  install architecture-dependent files in EPREFIX

--bindir=DIR           install user     executables in DIR

--sbindir=DIR          install sysadmin executables in DIR

--libexecdir=DIR       install program  executables in DIR

--mandir=DIR           install manual pages in DIR

--sysconfdir=DIR       install configuration files in DIR

--datadir=DIR          install read-only data files in DIR

--iconsdir=DIR         install read-only icon files in DIR

--htdocsdir=DIR        install read-only document files in DIR

--cgidir=DIR           install read-only cgi files in DIR

--includedir=DIR       install includes files in DIR

--localstatedir=DIR    install modifiable data files in DIR

--runtimedir=DIR       install runtime data in DIR

--logfiledir=DIR       install logfile data in DIR

--proxycachedir=DIR    install proxy cache data in DIR

Configuration options:

--enable-rule=NAME     enable  a particular Rule named 'NAME'

--disable-rule=NAME    disable a particular Rule named 'NAME'

[DEV_RANDOM=default EXPAT=default   IRIXN32=yes ]

[IRIXNIS=no      PARANOID=no     SHARED_CHAIN=de]

[SHARED_CORE=default SOCKS4=no       SOCKS5=no  ]

[WANTHSREGEX=default                            ]

--add-module=FILE      on-the-fly copy & activate a 3rd-party Module

--activate-module=FILE on-the-fly activate existing 3rd-party Module

--permute-module=N1:N2 on-the-fly permute module 'N1' with module 'N2'

--enable-module=NAME   enable  a particular Module named 'NAME'

--disable-module=NAME  disable a particular Module named 'NAME'

[access=yes      actions=yes     alias=yes      ]

[asis=yes        auth_anon=no    auth_dbm=no    ]

[auth_db=no      auth_digest=no  auth=yes       ]

[autoindex=yes   cern_meta=no    cgi=yes        ]

[digest=no       dir=yes         env=yes        ]

[example=no      expires=no      headers=no     ]

[imap=yes        include=yes     info=no        ]

[log_agent=no    log_config=yes  log_referer=no ]

[mime_magic=no   mime=yes        mmap_static=no ]

[negotiation=yes proxy=no        rewrite=no     ]

[setenvif=yes    so=no           speling=no     ]

[status=yes      unique_id=no    userdir=yes    ]

[usertrack=no    vhost_alias=no                 ]

--enable-shared=NAME   enable  build of Module named 'NAME' as a DSO

--disable-shared=NAME  disable build of Module named 'NAME' as a DSO

--with-perl=FILE       path to the optional Perl interpreter

--with-port=PORT       set the port number for httpd.conf

--without-support      disable the build and installation of support tools

--without-confadjust   disable the user/situation adjustments in config

--without-execstrip    disable the stripping of executables on installation

--server-uid=UID       set the user ID the web server should run as [nobody]

--server-gid=GID       set the group ID the web server UID is a memeber of [#-1]

suEXEC options:

--enable-suexec        enable the suEXEC feature

--suexec-caller=NAME   set the suEXEC username of the allowed caller [www]

--suexec-docroot=DIR   set the suEXEC root directory [PREFIX/share/htdocs]

--suexec-logfile=FILE  set the suEXEC logfile [PREFIX/var/log/suexec_log]

--suexec-userdir=DIR   set the suEXEC user subdirectory [public_html]

--suexec-uidmin=UID    set the suEXEC minimal allowed UID [100]

--suexec-gidmin=GID    set the suEXEC minimal allowed GID [100]

--suexec-safepath=PATH set the suEXEC safe PATH [/usr/local/bin:/usr/bin:/bin]

--suexec-umask=UMASK   set the umask for the suEXEC'd script [server's umask]

Deprecated options:

--layout               backward compat only: use --show-layout

--compat               backward compat only: use --with-layout=Apache

이는 아파치의 컴파일을 위하여 configure를 잡아주는 스크립트이다. 기본값으로 설치를 원한다면 그냥 ./configure 라고 해주면 되고, 만약 옵션들이 필요하다면 위의 내용을 참조로 하여 적어주길 바란다.

5.5 모듈 설정

src/Configuration 파일에 있는 모듈의 목록은 활성화되든 되지 않든 상관없이 모두 src 디렉토리에 소스로 포함되어 있다. 하지만 새로운 기능의 모듈들, 예를 들어 포스트그래스95용 모듈인 mod_auth_pg95을 사용하기 위해서는 해당 소스를 src 디렉토리에 포함시키고 Configuration파일에도 포함시켜야 한다. 모듈은 파일의 이름을 보면 그 기능을 대강 알 수 있으며 더 자세히 알고자 한다면 http://www.apache.org/docs/mod/index.html에서 많은 정보를 얻을 수 있을 것이다. 기본적으로 제공되고 활성화된 모듈은 다음과 같다.

mod_env

mod_log_config

mod_mime

mod_negotiation

mod_status

mod_include

mod_autoindex

mod_dir

mod_cgi

mod_asis

mod_imap

mod_actions

mod_userdir

mod_alias

mod_access

mod_auth

mod_setenvif

기본적으로 제공되나 사용자가 명시적으로 활성화시켜야 하는 것들은 다음과 같다.

mod_mmap_static

mod_vhost_alias

mod_log_agent

mod_log_referer

mod_mime_magic

mod_info

mod_speling

mod_rewrite

mod_auth_anon

mod_auth_dbm

mod_auth_db

mod_digest

mod_auth_digest

libproxy

mod_cern_meta

mod_expires

mod_headers

mod_usertrack

mod_example

mod_unique_id

mod_so

사용하고자하는 모듈의 주석문을 제거해주면 된다.

5.6 컴파일 및 설치

모듈설정까지 마쳤으면 이제 저장을 하고, 컴파일을 하면 된다.

[root@uranos apache_1.3.12]# make

...............

make[2]: Leaving directory `/usr/local/src/apache_1.3.12/src/support'

<=== src/support

make[1]: Leaving directory `/usr/local/src/apache_1.3.12'

<=== src

[root@uranos apache_1.3.12]# make install

....................

make[1]: Leaving directory `/usr/local/src/apache_1.3.12'

+--------------------------------------------------------+

| You now have successfully built and installed the      |

| Apache 1.3 HTTP server. To verify that Apache actually |

| works correctly you now should first check the         |

| (initially created or preserved) configuration files   |

|                                                        |

|   /usr/local/apache/conf/httpd.conf

|                                                        |

| and then you should be able to immediately fire up     |

| Apache the first time by running:                      |

|                                                        |

|   /usr/local/apache/bin/apachectl start

|                                                        |

| Thanks for using Apache.       The Apache Group        |

|                                http://www.apache.org/  |

+--------------------------------------------------------+

여기까지 했으면 이제 설치는 끝났다.

기본적으로 설치되는 디렉토리는 /usr/local/apache 이다.

5.7 아파치 서버의 실행 및 종료

/usr/local/apache/bin 으로 이동하여 다음과 같이 한다.

[root@uranos bin]# ./apachectl start

./apachectl start: httpd started

[root@uranos bin]# ps ax|grep http

6093 ?        S      0:00 /usr/local/apache/bin/httpd

6094 ?        S      0:00 /usr/local/apache/bin/httpd

6095 ?        S      0:00 /usr/local/apache/bin/httpd

6096 ?        S      0:00 /usr/local/apache/bin/httpd

6097 ?        S      0:00 /usr/local/apache/bin/httpd

6098 ?        S      0:00 /usr/local/apache/bin/httpd

확인하였으면 X-Windows에서 Netscape를 실행해서 localhost 로 접속해본다. 각 언어별 index.html파일들이 나올 것이다. 이중에서 index.html.en을 클릭해보면 □Seeing this instead of the website you expected?□ 이런 메시지와 함께 Powered by APACHE 라는 로고가 보일 것이다. 이것이 보인다면 설치는 성공적으로 끝난셈이다. 아파치 서버의 종료는 /usr/local/apache/bin에서 ./apachectl stop 라고 해주면 된다.

5.8 설정 파일

설정 파일의 위치는 기본적으로 /usr/local/apache/conf 디렉토리에 들어있다. 구 버전에서는 세 개의 파일(access.conf, httpd.conf, srm.conf)로 나뉘어져 있었으나 지금은 httpd.conf 한 개의 파일로 합쳐졌으며, 이 파일 안에서 세 개의 섹션으로 분리되어 있다.

-. 아파치 서버 프로세스의 전반적인 작동을 제어하는 지시자

('global environment, 전체 환경')

-. 가상 호스트에 의해 처리되지 않는 요청을 모두 처리하는 주 서버 또는 기본 서버의

작동을 제어하는 지시자. 이 내용은 모든 가상 호스트의 기본값이기도 하다.

-. 다른 IP 주소 또는 다른 호스트 이름에 대한 요청을 처리할 가상 호스트 설정

### 섹션 1 : 전체 환경 (Global Environment)

# 이 섹션에 적힌 지시자는 예를 들어 아파치 서버가 처리할 수 있는 동시  요청의 개수라

# 든지 다른 설정 파일의 이름 등 아파치 서버의 전반적인 작동에 영향을 미친다.

#

# 서버 유형(ServerType)은 inetd 또는 standalone 둘 중 하나이다.

# inetd 방식은 유닉스 플랫폼에서만 지원된다.

ServerType standalone

# 서버 루트(ServerRoot) : 서버의 설정 파일, 에러 파일, 로그 파일이 기록되는 디렉토리

# 의 최상위 경로명.

#

# 주의! 만약 서버 루트를 NFS (또는 기타 네트웍 파일 시스템) 마운트된

# 곳에 두고자 한다면 LockFile 문서를 꼭 읽어보아야 한다.

# (<URL:http://www.apache.org/docs/mod/core.html#lockfile>);

# 문서를 읽고 나면 앞으로 닥칠 지 모르는 몇 가지 문제점을 피할 수 있다.

#

# 디렉토리 경로 뒤에 슬래쉬(/) 문자를 쓰지 않는다!!!

ServerRoot "/usr/local/apache"

# LockFile 지시자는 아파치를 USE_FCNTL_SERIALIZED_ACCEPT 또는

# USE_FLOCK_SERIALIZED_ACCEPT 옵션을 주고 컴파일한 경우, 잠금 파일을 경로를 지정할 때

# 사용한다.  이 지시자 값은 일반적으로 기본값이 되도록 놔둔다.  이 값을 바꾸는 경우는

# 로그 디렉토리가 NFS 마운트된 곳에 있는 경우로서 잠금 파일은 항상 네트웍 파일 시스

# 템이 아닌 로컬 디스크에 저장되어야 하기 때문이다.  주 서버 프로세서의 PID 값이

# 자동으로 파일 이름 뒤에 붙는다.

#LockFile /usr/local/apache/logs/httpd.lock

# PidFile: 서버가 시동될 때 자신의 프로세스 고유 번호를 기록할 파일

PidFile /usr/local/apache/logs/httpd.pid

# ScoreBoardFile: 내부 서버 프로세스 정보를 기록하는데 사용하는 파일. 모든 아키텍쳐에

# 서 꼭 필요한 것은 아니다.  하지만 필요하다고 생각하는 경우에는 하나의 아파치 프로

# 그램을 두 번 이상 실행시키는 경우 값이 중복되지 않도록 해주는 것만 잊지 않으면 된

# 다.

ScoreBoardFile /usr/local/apache/logs/httpd.scoreboard

# 표준 설정에서 서버는 httpd.conf, src.conf, access.conf 파일을 차례대로 읽어나간다.

# 나중에 있는 2 개의 파일은 현재 아무 내용도 없는 빈 상태로 배포되고 있다.  왜냐하면

# 모든 지시자를 그냥 하나의 파일에 적는 것이 더욱 명료하기 때문이다.  주석으로 처리되

# 어 있는 값은 기본값이다.  서버가 이 파일 내용을 무시하도록 하기 위해서는

# "/dev/null" (유닉스의 경우) 또는 "nul" (Win32) 값을 지정한다.

#ResourceConfig conf/srm.conf

#AccessConfig conf/access.conf

# Timeout: 받기/보내기 타임 아웃 시간

Timeout 300

# KeepAlive: 지속성(persistent) 접속을 허가할 것인가 말 것인가? (한 번의 접속에서

# 여러 개의 요청을 처리할 것인가 여부) 허가하지 않기 위해서는 "Off"로 설정한다.

# 허가하지 않는 것과 허가하는 것과의 효율 차이는 매우 크다.

KeepAlive On

# MaxKeepAliveRequests: 지속성 접속 기간 동안 처리할 수 있는 최대 요청 개수 0 을 넣으

# 면 무한대이다.  높은 성능을 내기 위해서 높은 값을 추천한다.

MaxKeepAliveRequests 100

# KeepAliveTimeout: 같은 접속 상태에서 같은 클라이언트의 요청이 타임 아웃되는 시간

# (초 단위)

KeepAliveTimeout 15

# 서버 풀(Server-pool) 크기 조정.  몇 개의 프로세스가 필요한지 여러분에게 추측하도록

# 하기 보다는 현재의 부하 상태에 자동으로 적응하도록 되어 있다. 아파치 서버는 현재의

# 부하 상태와 순간적으로 급격히 상승하는 경우 값 (예를 들어 하나의 네스케이프 브라우

# 져에서 동시에 여러 개의 요청이 들어올 수 있다)을 처리할 수 있는 충분한 갯수의 서버

# 프로세스를 유지하려 노력한다.

#

# 아파치 서버는 주기적으로 몇 개의 서버가 요청 대기 상태인지 점검한다.

# 만약 MinSpareServers 보다 적다면 여유 서버 프로세스를 생성한다.

# 만약 MaxSpareServers 보다 많으면 불필요한 여유 프로세스를 제거한다.

# 이 곳에 제시된 기본값은 거의 대부분의 사이트에 적합하다.

MinSpareServers 5

MaxSpareServers 10

# 처음 시동할 때 만들 서버의 갯수 -- 합리적인 근사치여야 한다.

StartServers 5

# 서버 프로세스의 최대값, 즉 동시에 접속할 수 있는 클라이언트 갯수를 제한하는 값이다.

# -- 만약 이 값에 도달한다면 클라이언트의 요청은 봉쇄될 것이다.  따라서 이 값이 너무

# 낮아서는 안된다. 이 값은 아파치 서버가 너무 많은 자원을 소비하여 전체 시스템을 먹통

# 이 되도록하는 것을 방지하기 위해 사용될 뿐이다.

MaxClients 150

# MaxRequestsPerChild: 각 자식 프로세스가 죽기 전까지 처리할 수 있는 요청 갯수.  한

# 프로세스가 너무 오랫 동안 사용되면 메모리 누출이나 자원 누출(아파치 때문에 또는 잘

# 못된 라이브러리 때문에)이 발생할 수 있으므로 자식 프로세스는 자동으로 죽는다. 대부

# 분의 시스템에서는 필요치 않으나 솔라리스에서와 같이 라이브러리에서의 자원 누출 현상

# 을 막기 위해 필요하다.  제한을 두지 않으려면 0 으로 설정한다.

MaxRequestsPerChild 0

# Listen: 아파치를 기본값 이외에도 특정 IP 주소 또는 포트에 연결하도록 해준다.

# <VirtualHost> 지시자도 참고하라.

#Listen 3000

#Listen 12.34.56.78:80

# BindAddress: 이 옵션을 사용하여 가상 호스트를 지원할 수 있다. 이 지시자를 이용하여 # 서버가 귀기울일 IP 주소를 지시할 수 있다. "*", IP 주소, 또는 완전한 인터넷 도메인

# 이름을 사용할 수 있다. <VirtualHost>, Listen 지시자도 참고하라.

#BindAddress *

# 동적 공유 객체(Dynamic Shared Object, DSO) 지원

#

# DSO 방식으로 만들어진 모듈의 기능을 사용하기 위해서는 그 기능에 관련된 지시자를 사

# 용하기에 앞서 알맞게 `LoadModule' 지시자로 모듈을 지시해주어야 한다.  DSO 작동방식

# 에 대하여 자세히 알고 싶은 사람은 아파치 1.3 배포 파일의 README.DSO 를 읽어보라.

# 여러분이 갖고 있는 httpd 바이너리에 내장된(정적으로 링크되어 항상 사용가능한) 모듈

# 목록을 알고 싶을 때에는 `httpd -l' 명령을 실행한다.

#

# 주의: 모듈을 적재하는 순서는 매우 중요하다. 전문가의 조언 없이 아무렇게나 순서를 바

#       꾸지 말라.

# 예:

# LoadModule foo_module libexec/mod_foo.so

#

# ExtendedStatus 지시자는 "server-status" 처리기가 호출되었을 때 아파치가 "매우 자세

# 한" 상태 정보를 생성시킬 것인지 (ExtendedStatus On) 아니면 매우 기본적인 정보만 생

# 성시킬 것인지를 (ExtendedStatus Off) 제어한다.  기본값은 Off 이다.

#

#ExtendedStatus On

### 섹션 2: '주(Main)' 서버 설정

#

# 이 섹션에 있는 지시자는 <VirtualHost> 정의에 의해 처리되지 않는 모든 요청에 응답할

# '주' 서버가 사용할 값을 정한다. 이 값들은 또한 이 파일 뒷 부분에서 정의할 모든

# <VirtualHost> 컨테이너의 기본값을 제공하기도 한다.

#

# 여기 나오는 모든 지시자는 <VirtualHost> 컨테이너 안에서도 사용할 수 있으며 그 안에

# 서 사용되면 해당 가상 호스트에 대하여 전체 기본값을 무시하고 새롭게 정한 값이 채택

# 된다.

#

# 만약 ServerType ('Global Environment' 섹션에서 설정)이 "inetd"인 경우, inetd 설정

# 내용을 따르기 때문에 다시 몇 가지 지시자는 아무런 효력을 발휘하지 않는다.

# ServerAdmin 지시자까지 그냥 건너뛴다.

#

# Port: 독립실행형(standalone) 서버가 요청을 기다리는 포트. 1023 번보다 낮은 번호의

# 포트에 대해서는 httpd가 처음에는 root 권한으로 실행되어야 한다.

Port 80

# httpd가 다른 사용자 또는 그룹 권한으로 실행되게 하려면 우선은 httpd가 root 사용자

# 권한으로 실행되고 나서 설정한 다른 사용자 권한으로 전환해야 한다.

#

# User/Group: httpd가 실행된 권한의 사용자/그룹의 이름(또는 #번호).

#  . SCO (ODT 3)에서는 "User nouser"와 "Group nogroup"을 사용한다.

#  . UPUX 에서는 nobody로 실행하는 경우 공유 메모리를 사용할 수 없을 것이다.  이 때는

#    www 등의 사용자를 만들고 그 사용자 권한으로 실행되도록 한다.

# 주의) 몇몇 커널들은 60000 이상의 (unsigned) 그룹 값을 설정하면 setgid(Group),

# semctl(IPC_SET) 함수를 거부한다. 이런 시스템에서는 Group #-1을 사용하지 말라!

User nobody

Group nobody

# ServerAdmin: 서버에 문제가 발생했을 때 메일을 보낼 메일 주소. 이 주소는 예를 들어

# 에러 문서와 같이 서버가 생성하는 페이지에 나타날 것이다.

ServerAdmin root@localhost

# ServerName은 클라이언트 프로그램에게 돌려주는 서버 이름이 다른 경우 호스트 이름을

# 설정할 수 있게 해준다. (예를 들어, 호스트의 실제 이름이 아닌 'www'를 사용하도록 하

# 는데 사용할 수 있다.)

#

# 주의: 호스트 이름을 아무렇게나 만들어선 안된다.  이 이름은 여러분의 호스트에 주어진

# 타당한 DNS 이름이어야 한다.  잘 모르겠으면 네트웍 관리자에게 문의하라.

# 호스트가 등록된 DNS 이름을 갖고 있지 않는 경우에는 이 곳에 IP 주소를 적는다.  어찌

# 되었든 IP 주소를 사용하여(예를 들어 http://123.45.67.89/) 접속할 수 있다.  이런 식

# 으로 해서 리다이렉션이 작동하도록 할 수 있다.

#ServerName uranos.cnetia.com

# DocumentRoot: 제공할 문서의 상위 디렉토리. 기본적으로 모든 요청은 이 디렉토리로부터

# 처리된다.  하지만 심볼릭 링크나 앨리어스(alias)를 사용하여 다른 위치를 가리키도록

# 할 수 있다.

DocumentRoot "/usr/local/apache/htdocs"

# 아파치가 접근할 수 있는 각 디렉토리에 대하여 어떤 서비스와 기능을 허용할 것인지 거

# 부할 것인지 여부를 설정할 수 있다. 디렉토리에 대한 설정 내용은 그 하부 디렉토리에도

# 영향을 미친다.

#

# 우선, "기본값"을 매우 제한적인 상태로 설정한다.

#

<Directory />

Options FollowSymLinks

AllowOverride None

</Directory>

#

# 이 곳부터 허용할 특정 기능을 알맞게 설정해나간다는 사실을 주목하자.

# 여러분이 기대한 대로 작동하지 않는 것이 있다면 그 기능을 가능 상태로

# 설정해두었는지 점검하기 바란다.

#

#

# 다음 내용은 여러분이 설정한 DocumentRoot 값으로 변경해서 사용한다.

<Directory "/usr/local/apache/htdocs">

# 다음 값에는 "None", "All", 또는 "Indexes", "Includes", "FollowSymLinks", "ExecCGI",

# "MultiViews"의 자유로운 조합이 가능하다.

#

# "MultiViews" 만큼은 "Options All"을 사용한다 할 지라도 명시적으로 적어야만 작동한다

# 는 사실을 알아두자.

Options Indexes FollowSymLinks Includes

# 다음은 각 디렉토리에 위치한 .htaccess 파일에서 어떤 옵션을 마음대로 제어할 수 있는

# 지 결정한다. "All" 또는 "Options", "FileInfo", "AuthConfig", "Limit"의 자유로운

# 결합이 가능하다.

AllowOverride None

# 서버로부터 자료를 얻어갈 수 있는 위치를 제어한다.

Order allow,deny

Allow from all

</Directory>

# UserDir: ~user 요청을 받았을 때 사용자의 홈 디렉토리 뒤에 추가할

# 디렉토리 이름.

#

# 주의 : 일부 리눅스 시스템에서는 사용자가 자신의 홈 디렉토리에 public_html 디렉토리

#        를 만들어도 외부에서 홈 페이지를 볼 수 없다. 왜냐하면 각 계정 홈 디렉토리에

#        대한 보안을 중요하게 생각했기 때문에 홈 디렉토리에 대하여 사용자 계정과 사용

#        자 자신의 그룹 이외에는 아무런 접근 허가권도 갖고 있지 않기 때문이다.

#

#        개인 홈 디렉토리를 가질 사람은 chmod a+x ~ 명령을 일단 실행해주어 (보통)

#        nobody 권한의 아파치 프로세스가 홈 디렉토리에 접근할 수 있도록 허가해주어야

#        한다. 물론 public_html과 홈 페이지 파일에 대하여 모든 사용자가 최소한

#        읽기 권한은 갖도록 설정해주어야 한다.

<IfModule mod_userdir.c>

UserDir public_html

</IfModule>

# UserDir 디렉토리에 대한 접근을 제어한다.  다음은 사용자 홈 페이지에 대하여 읽기만

# 가능하도록 한 예제 설정 내용이다.  참고 자료로 사용하기 바란다.

#

#<Directory /home/*/public_html>

#    AllowOverride FileInfo AuthConfig Limit

#    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec

#    <Limit GET POST OPTIONS PROPFIND>

#        Order allow,deny

#        Allow from all

#    </Limit>

#    <Limit PUT DELETE PATCH PROPPATCH MKCOL COPY MOVE LOCK UNLOCK>

#        Order deny,allow

#        Deny from all

#    </Limit>

#</Directory>

#

# DirectoryIndex: 준비된 HTML 디렉토리 인덱스로 사용할 파일이나

# 파일 목록의 이름을 나열한다.  여러 개를 나열할 때는 스페이스로

# 구분한다.

<IfModule mod_dir.c>

DirectoryIndex index.html

</IfModule>

# AccessFileName: 각 디렉토리에 대하여 접근 제어 정보 내용을 담고 있을 파일 이름

AccessFileName .htaccess

# 다음 행은 웹 브라우져가 .htaccess 파일을 접근할 수 없도록 하는 설정이다.  .htaccess

# 에는 인증 정보가 들어있는 경우가 빈번하므로 보안상 이유로 이 파일에 대한 접근은 불

# 허해야 한다. 웹 방문객들이 이 파일을 보게 하고 싶으면 다음 행들을 주석 처리하라.

# 만약 AccessFileName 설정을 다른 파일명으로 바꾸었다면 알맞게 .htaccess를 그 이름으

# 로 바꾸어준다.

#

# 또한 사람들이 웹 서버 패스워드 파일을 .htpasswd라고하는 경향이 있기 때문에 .ht 로

# 시작하는 파일을 모두 보호한다.

#

# 아파치 1.3.x 버전부터 <Files> <Directory> 지시자에서 ~ 다음에

# 정규 표현식을 사용할 수 있다.

<Files ~ "^\.ht">

Order allow,deny

Deny from all

</Files>

# CacheNegotiateDocs: 기본적으로 아파치는 내용에 따라 협상된 문서에 대해서는 "Pragma:

# no-cache" 내용을 전송한다.  이 행은 프록시 서버로 하여금 문서를 캐쉬하지 않도록 요

# 청한다.  다음 행의 주석을 풀면 이 기능을 해제하고 모든 프록시가 문서들을 캐쉬할 수

# 있도록 한다.

#CacheNegotiatedDocs

# UseCanonicalName: (1.3 버전에 새롭게 등장) 이 설정을 켜두면, 아파치가 자기 참조

# URL(반응이 오고 있는 서버를 다시 가리키는 URL)을 만들 필요가 있을 때마다 "공식적인"

# 이름을 만들기 위해 ServerName과 Port를 사용한다.  그렇지 않으면 아파치는 가능한 한

# 클라이언트가 제공한 호스트이름:포트 값을 사용한다. 이 설정은 CGI 스크립트의

# SERVER_NAME, SERVER_PORT에도 영향을 미친다.

UseCanonicalName On

# TypesConfig 는 mime.types 파일 또는 이에 해당하는 파일을 찾을 위치를 결정한다.

<IfModule mod_mime.c>

TypesConfig /usr/local/apache/conf/mime.types

</IfModule>

# DefaultType이란 파일 확장자와 같은 것을 통해 MIME 타입을 알 수 없는 문서에 대하여

# 사용할 기본 MIME 타입을 말한다.  여러분의 서버에 주로 텍스트나 HTML 문서가 많다면

# "text/plain"을 쓰는 것이 좋다. 대부분이 실행 프로그램이나 이미지 등 바이너리인 경우

# 에는 웹 브라우져가 텍스트라고 생각하여 바이너리 파일을 화면에 표시하지 않도록 하기

# 위해 "application/octet-stream"를 적는다.

DefaultType text/plain

# mod_mime_magic 모듈을 사용하면 파일의 내용을 가지고 파일의 타입에 힌트를 얻는다.

# MIMEMagicFile 지시자를 사용하여 모듈에게 힌트 정보가 저장되어 있는 파일을 설정한다.

# mod_mime_magic은 기본 서버의 일부가 아니다.(따라서 LoadModule 설정을 사용하여 모듈

# 을 추가해야 한다.) 또는 서버를 다시 컴파일해서 mod_mime_magic을 추가해야 한다. 그렇

# 기 때문에 <IfModule> 컨테이너에 포함되어 있는 것이다.  다음 설정은 모듈이 서버에 포

# 함되어 있을 때에만 MIMEMagicFile 지시자를 처리하도록 해준다.

<IfModule mod_mime_magic.c>

MIMEMagicFile /usr/local/apache/conf/magic

</IfModule>

# HostNameLookups: 클라이언트의 이름 또는 IP 주소만을 기록할 지 여부. 예를 들어

# www.apache.org (on) 또는 204.62.129.132 (off) 기본값이 off 인 이유는 각 클라이언트

# 요청이 올 때마다 최소한 1 번 이상의 네임 서버 요청이 발생하기 때문이다.  그러나 꼭

# 필요한 경우에는 이 기능을 켜둔다.

HostnameLookups Off

# ErrorLog: 에러 기록 파일의 위치. <VirtualHost> 컨테이너 안에서 ErrorLog 설정을 하지

# 않으면 그 가상 호스트에 관련된 에러 메시지도 역시 이 곳에 기록된다. <VirtualHost>

# 컨테이너 안에서 에러 로그 파일을 정의하면 관련된 에러 메시지는 그 파일로 저장된다.

ErrorLog /usr/local/apache/logs/error_log

# LogLevel: error_log에 기록될 메시지 분량을 제어한다. debug, info, notice, warn,

# error, crit, alert, emerg 등의 값이 가능하다.

LogLevel warn

# 다음 지시자는 CustomLog 지시자(아래 참고)에서 사용할 몇 가지 형식에 대한 별명을 정

# 의한다.

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

LogFormat "%h %l %u %t \"%r\" %>s %b" common

LogFormat "%{Referer}i -> %U" referer

LogFormat "%{User-agent}i" agent

# 접근 로그 파일의 위치와 형식(공통 로그파일 형식). <VirtualHost> 컨테이너 안에서 접

# 근 로그파일 설정을 하지 않으면 모든 기록이 이 파일에 남게 된다.  이와 반대로 각

# <VirtualHost> 마다 접근 로그파일을 정의하면 모든 처리가 바로 그 파일에 기록된다.

CustomLog /usr/local/apache/logs/access_log common

# 에이전트 로그파일과 참조자(referer) 로그파일을 갖기 위해서는 다음 지시 내용의 주석

# 처리를 해제하라.

#

# 여기서 에이전트란 여러분의 사이트에 방문하는 브라우져를 말한다. 에이전트 로그를 남

# 기면 여러분의 사이트에 방문하는 브라우져의 종류에 대한 통계를 낼 수 있다.

#

# 참조자란 주로 배너 광고주에게 중요한 것으로서 여러분의 사이트 바로

# 직전에 방문한 사이트를 말한다.

#CustomLog /usr/local/apache/logs/referer_log referer

#CustomLog /usr/local/apache/logs/agent_log agent

# 하나의 로그파일에 접근, 에이전트, 참조자 정보를 다 저장하기 위해서는

# (통합 로그파일 형식) 다음 지시 내용을 사용하라.

#

# 몇 달만 운영해도 접속이 많은 사이트에서는 combined 로그 파일이 어마어마하게

# 커져서 루트 파일 시스템을 꽉 채워 버리는 일이 발생할 수 있다!

#CustomLog /usr/local/apache/logs/access_log combined

# 부차적으로 서버가 생성하는 페이지(에러 문서, FTP 디렉토리 목록, mod_status,

# mod_info 출력 등, 그러나 CGI 생성 문서는 제외)에  서버 버전과 가상 호스트 이름을 포

# 함하는 행을 추가하도록 한다. "Email"로 설정하면 ServerAdmin으로의 mailto: 링크를 포

# 함한다. On | Off | EMail 중 하나로 설정한다.

#ServerSignature On

# Aliases: 필요한 만큼의 별칭을 만들어 사용한다.(제한 없음) 형식은 다음과 같다.

# Alias 가짜이름 실제이름

<IfModule mod_alias.c>

# 가짜 이름 뒤에 / 를 포함하면 아파치 서버는 URL에도 / 이 있어야

# 처리함을 잘 알아두자.  따라서 "/icons"는 별칭 처리되지 않고

# "/icons/"만 별칭 처리된다.

Alias /icons/ "/home/httpd/icons/"

<Directory "/home/httpd/icons">

Options Indexes MultiViews

AllowOverride None

Order allow,deny

Allow from all

</Directory>

# ScriptAlias: 서버 스크립트를 포함하는 디렉토리를 제어한다.

# ScriptAlias는 근본적으로 Alias와 같으나 가리키고 있는 실제 디렉토리

# 안에 들어있는 문서를 실행 프로그램으로 취급하여 실행한다.

# 맨 뒤에 붙는 "/" 에 대한 규칙은 Alias와 마찬가지이다.

ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"

# "/home/httpd/cgi-bin" 부분은 ScriptAlias로 별칭 처리된 실제 CGI

# 디렉토리로 설정해야 한다.

<Directory "/usr/local/apache/cgi-bin">

AllowOverride None

Options ExecCGI

Order allow,deny

Allow from all

</Directory>

</IfModule>

# Redirect를 사용하면 서버의 이름공간에 존재했으나 현재에는 존재하지 않는 문서에 대하

# 여 클라이언트에게 통보할 수 있도록 해준다. 이렇게 함으로써 위치가 변한 새로운 문서

# 를 어디에서 찾을 수 있는지 클라이언트에게 알려줄 수 있다.

# 형식: Redirect 예전URI 새URI

#

# 서버가 생성하는 디렉토리 목록의 표시 상태를 제어하는 지시자.

<IfModule mod_autoindex.c>

# FancyIndexing은 예쁜 디렉토리 목록 또는 표준적인 디렉토리 목록 여부를 결정한다.

IndexOptions FancyIndexing

# AddIcon으로 시작하는 지시자는 서버에게 다양한 파일, 파일명 확장자에

# 대하여 어떤 아이콘을 보여 줄 것인지 말해준다.  이 값들은

# FancyIndexing을 사용하는 경우에만 해당된다.

#

AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip

AddIconByType (TXT,/icons/text.gif) text/*

AddIconByType (IMG,/icons/image2.gif) image/*

AddIconByType (SND,/icons/sound2.gif) audio/*

AddIconByType (VID,/icons/movie.gif) video/*

AddIcon /icons/binary.gif .bin .exe

AddIcon /icons/binhex.gif .hqx

AddIcon /icons/tar.gif .tar

AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv

AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip

AddIcon /icons/a.gif .ps .ai .eps

AddIcon /icons/layout.gif .html .shtml .htm .pdf

AddIcon /icons/text.gif .txt

AddIcon /icons/c.gif .c

AddIcon /icons/p.gif .pl .py

AddIcon /icons/f.gif .for

AddIcon /icons/dvi.gif .dvi

AddIcon /icons/uuencoded.gif .uu

AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl

AddIcon /icons/tex.gif .tex

AddIcon /icons/bomb.gif core

AddIcon /icons/back.gif ..

AddIcon /icons/hand.right.gif README

AddIcon /icons/folder.gif ^^DIRECTORY^^

AddIcon /icons/blank.gif ^^BLANKICON^^

# DefaultIcon이란 명시적인 아이콘을 갖고 있지 않는 파일에 대한

# 기본 아이콘 파일을 설정한다.

DefaultIcon /icons/unknown.gif

# AddDescription은 서버 자동 생성 인덱스의 파일명 뒤에 간단한 설명을

# 넣을 때 사용한다.  FancyIndexing을 사용할 때에만 보인다.

# 형식: AddDescription "설명" 파일명

#AddDescription "GZIP compressed document" .gz

#AddDescription "tar archive" .tar

#AddDescription "GZIP compressed tar archive" .tgz

#

# ReadmeName은 서버가 디렉토리 목록 뒤에 내용을 덧붙여 넣을 README 파일의

# 이름을 설정한다.

#

# HeaderName은 디렉토리 인덱스 앞에 내용을 덧붙일 파일명을 설정한다.

#

# 서버는 먼저 name.html을 찾고 그것이 있으면 그 내용을 포함한다.

# 만약 없다면 서버는 name.txt 파일을 찾고 평범한 텍스트 내용으로

# 추가한다.

#

ReadmeName README

HeaderName HEADER

#

# IndexIgnore는 디렉토리 인덱싱에 있어 목록에서 제외시킬 파일명을 설정한다.

# 쉘 스타일의 와일드 카드를 사용할 수 있다.

#

IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t

</IfModule>

<IfModule mod_mime.c>

# AddEncoding은 특정 브라우져(모자익/X 2.1+)로 하여금 자료를 받으면서

# 정보의 압축을 풀 수 있도록 해준다.  주의:  모든 브라우져가 이 기능을

# 지원하는 것은 아니다.  이름이 유사하기는 하지만 다음부터 나오게 될

# Add로 시작하는 지시자들은 FancyIndexing과는 관련이 없다.

AddEncoding x-compress Z

AddEncoding x-gzip gz tgz

# AddLanguage는 문서의 언어를 명시한다.  내용 협상 과정을 통해 브라우져가

# 이해할 수 있는 언어의 문서를 제공하는 것이 가능하다.

# 접미어(suffix)는 언어 키워드와 꼭 같은 필요는 없다.  예를 들어

# 폴란드어(Polish)로 된 문서는 네트웍 표준 언어 코드가 pl 이지만

# 펄 스크립트와 확연히 구별하기 위해 "AddLanguage pl .po"라고 사용한다.

#

AddLanguage ko .ko

AddLanguage en .en

AddLanguage fr .fr

AddLanguage de .de

AddLanguage el .el

AddLanguage it .it

AddLanguage da .dk

AddLanguage nl .nl

AddLanguage et .ee

AddLanguage ja .ja

AddCharset ISO-2022-JP .jis

AddLanguage pl .po

AddCharset ISO-8859-2 .iso-pl

AddLanguage pt .pt

AddLanguage pt-br .pt-br

AddLanguage ltz .lu

AddLanguage ca .ca

AddLanguage es .es

AddLanguage sv .se

AddLanguage cz .cz

# LanguagePriority는 내용 협상 중 동점이 발생하는 경우 언어 우선권을

# 부여한다.  언어의 우선권을 내림차순으로 나열하면 된다.

<IfModule mod_negotiation.c>

LanguagePriority ko en da nl et fr de el it ja pl pt pt-br ltz ca es sv

</IfModule>

# AddType를 사용하면 mime.types 파일 수정없이 MIME 설정을 할 수 있고

# 또는 어떤 파일들에 대하여 특정 타입으로 처리하도록 할 수 있다.

#

# 예를 들어, PHP3 모듈(아파치 배포파일에 포함되어 있지 않다)에

# 대해서는 다음과 같이 사용한다.

#

#AddType application/x-httpd-php3 .php3

#AddType application/x-httpd-php3-source .phps

# PHP4 Zend 에 대한 설정

#AddType application/x-httpd-php .php

#AddType application/x-httpd-php-source .phps

#다음은 PHP/FI (PHP2)를 위한 것입니다.

#AddType application/x-httpd-php .phtml

AddType application/x-tar .tgz

#

# AddHandler를 사용하면 특정 파일 확장자와 "처리기"를 연결하거나 특정 파일 타입에

# 특정 동작(action)을 연결할 수 있다. 서버에 내장되어 있거나 또는 Action 명령을

# 사용하여 추가할 수 있다.(아래 참고)

#

# 서버 측 포함(SSI) 또는 ScriptAlias 처리된 디렉토리 외부에 존재하는 CGI 스크립트

# 를 사용하고 싶을 때는 다음 내용의 주석을 없앤다.

#

# CGI 스크립트를 사용하기 위해:

#AddHandler cgi-script .cgi

# 서버 처리 HTML 파일 사용하기 위해:

#AddType text/html .shtml

#AddHandler server-parsed .shtml

# 아파치의 send-asis HTTP 파일 기능을 사용하기 위해서는 다음 행의 주석을 없앤다.

#AddHandler send-as-is asis

# 서버 처리 이미지 맵 파일을 사용하려면...

#AddHandler imap-file map

# type map을 사용하려면...

#AddHandler type-map var

</IfModule>

# perl 모듈을 사용하려면 다음 세션의 주석을 풉니다.

#

#Alias /perl/ /home/httpd/perl/

#<Location /perl>

#SetHandler perl-script

#PerlHandler Apache::Registry

#Options +ExecCGI

#</Location>

# Action을 사용하면 매칭되는 파일이 호출될 때마다 그 미디어 타입에 맞는

# 스크립트를 시행시킬 수 있다.  빈번하게 사용되는 CGI 파일 프로세서에

# 대하여 반복적으로 URL을 사용하지 않아도 된다.

# Format: Action media/type /cgi-script/location

# Format: Action handler-name /cgi-script/location

#

# MetaDir: 아파치 서버가 메타 정보 파일을 찾을 디렉토리 이름.

# 이 파일에는 문서를 보낼 때 추가하고자 하는 추가 HTTP 헤더 정보가 들어있다.

#

#MetaDir .web

#

# MetaSuffix: 메타 정보를 담고 있는 파일의 접미어를 설정한다.

#

#MetaSuffix .meta

#

# 사용자 정의 에러 반응 메시지 (아파치 스타일)

#  다음 3 가지 방법으로 가능하다.

#

#    1) 보통의 텍스트

#ErrorDocument 500 "The server made a boo boo.

#  주목: " 표시는 텍스트임을 알려주는 것으로서 그 자체는 출력되지 않는다.

#

#    2) 지역적인 방향 전환

#ErrorDocument 404 /missing.html

#  지역적 URL인 /missing.html로 방향 전환하기

#ErrorDocument 404 /cgi-bin/missing_handler.pl

#  주목: 스크립트나 SSI로 방향 전환시킬 수 있다.

#

#    3) 외부 방향 전환

#ErrorDocument 402 http://some.other_server.com/subscription_info.html

#  주목: 원래 요청과 관련있는 환경 변수의 상당수가 스크립트에

#  전달되지 못한다는 점을 알고 있어야 한다.

<IfModule mod-setenvif.c>

# 다음 지시자는 보통의 HTTP 반응 방식을 수정한다.

# 첫번째 것은 네스케이프 2.x 또는 그를 흉내내는 브라우져에 대하여

# KeepAlive 기능을 쓰지 않도록 한다.  이 브라우져들은 KeepAlive 구현에

# 문제점을 갖고 있기 때문이다.

# 두번째 것은 HTTP/1.1을 잘못 구현하였고 301 또는 302 (redirect) 응답에

# 대하여 KeepAlive를 제대로 지원하지 못하는 마이크로소프트 인터넷

# 익스플로러 4.0b2를 위한 것이다.

#

BrowserMatch "Mozilla/2" nokeepalive

BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0

#

# 다음은 기본적인 1.1 응답도 제대로 처리하지 못함으로써 HTTP/1.1 스펙을

# 위반하고 있는 브라우져에 대하여 HTTP/1.1 응답을 하지 않도록 한다.

#

BrowserMatch "RealPlayer 4\.0" force-response-1.0

BrowserMatch "Java/1\.0" force-response-1.0

BrowserMatch "JDK/1\.0" force-response-1.0

</IfModule>

# http://servername/server-status을 통해 서버 상태 보고를 허용한다.

# 여기서 ".your_domain.com" 부분을 허용할 도메인으로 바꿔 사용하라.

#

#<Location /server-status>

#    SetHandler server-status

#    Order deny,allow

#    Deny from all

#    Allow from .your_domain.com

#</Location>

#

# http://servername/server-info를 통하여 원격 서버 설정 보고를 허용한다.

# (mod_info.c가 적재되어 있어야 한다.)

# 여기서 ".your_domain.com" 부분을 허용할 도메인으로 바꿔 사용하라.

#

#<Location /server-info>

#    SetHandler server-info

#    Order deny,allow

#    Deny from all

#    Allow from .your_domain.com

#</Location>

#

# 1.1 버전 이전의 오래 된 버그를 악용하려는 사람들이 있다는 보고를 받았다.

# 이 버그는 아파치 일부분으로 제공한 CGI 스크립트와 연관있다.

# 이 부분의 주석 처리를 없애면 이 버그를 악용하는 공격이 있을 때

# phf.apache.org 상의 기록 스크립트로 방향 전환시킬 수 있다.

# 또는 support/phf_abuse_log.cgi 스크립트를 사용하여 여러분 직접 기록할

# 수도 있다.

#

#<Location /cgi-bin/phf*>

#    Deny from all

#    ErrorDocument 403 http://phf.apache.org/phf_abuse_log.cgi

#</Location>

#

# 프록시 서버 지시자.  프록시 서버 기능을 작동시키려면 다음 행의 주석을 해제시켜준다.

#

#<IfModule mod_proxy.c>

#ProxyRequests On

#

#<Directory proxy:*>

#    Order deny,allow

#    Deny from all

#    Allow from .your_domain.com

#</Directory>

#

# HTTP/1.1 "Via:" 헤더를 처리할 것인지 여부를 결정한다.

# ("Full"은 서버 버전을 포함하고 "Block"은 나가는 모든 자료에서

# Via: 헤더를 제거한다.)

# Off | On | Full | Block 중 하나의 값을 지정한다.

#

#ProxyVia On

#

# 캐쉬 기능도 사용하기 위해서는 다음 행의 주석을 풀어준다:

# (CacheRoot가 없으면 캐쉬하지 않음)

#

#CacheRoot "/home/httpd/proxy"

#CacheSize 5

#CacheGcInterval 4

#CacheMaxExpire 24

#CacheLastModifiedFactor 0.1

#CacheDefaultExpire 1

#NoCache a_domain.com another_domain.edu joes.garage_sale.com

#</IfModule>

# 프록시 설정 끝

### 섹션 3: 가상 호스트

#

# VirtualHost: 여러분의 리눅스 박스에 여러 개의 도메인/호스트이름을 관리하고 싶다면

# 각각에 대하여 VirtualHost 컨테이너를 설정한다. 가상 호스트를 설정하기에 앞서 자세한 # 설명을 <URL:http://www.apache.org/docs/vhosts/>에 들러 읽어보기 바란다.

# 가상 호스트 설정 내용을 점검해보기 위해서는 아파치를 실행할 때

# 명령행 옵션으로 '-S'를 사용한다.

#

# 이름 기반의 가상 호스트를 사용하려면 사용할 IP 주소 (최소 1 개,

# 그리고 포트 번호)를 정의해주어야 한다.

#

# 경고 : 아파치 1.2.x 버전에서만 가상 호스트 기능을 사용해 온 관리자들은

#        아파치 1.3.x 버전에서 NameVirtualHost 지시자로 IP 주소를

#        해주어야만 가상 호스트가 제대로 동작한다는 사실을 꼭 알아야 한다!!!

#        1.2 버전을 쓰다 1.3 버전으로 와서 가상 호스트가 동작하지 않는

#        문제의 99% 는 바로 NameVirtualHost 설정에 있다.

#

#

#NameVirtualHost 12.34.56.78:80

#NameVirtualHost 12.34.56.78

#

# 가상 호스트 예제:

# 거의 모든 아파치 지시자가 VirtualHost 컨테이너에 올 수 있다.

#

#<VirtualHost ip.address.of.host.some_domain.com>

#    ServerAdmin webmaster@host.some_domain.com

#    DocumentRoot /www/docs/host.some_domain.com

#    ServerName host.some_domain.com

#    ErrorLog logs/host.some_domain.com-error_log

#    CustomLog logs/host.some_domain.com-access_log common

#</VirtualHost>

#<VirtualHost _default_:*>

#</VirtualHost>

#

# 가상호스트 서비스를 위한 ifconfig 설정

# 이 설정을 /etc/rc.d/rc.local 파일에 추가시켜주기 바란다.

#/sbin/ifconfig eth0:0 123.2.3.10 netmask 255.255.255.128 broadcast 123.2.3.127

#/sbin/route add -host 123.2.3.10 dev eth0:0

5.9 아파치 강의를 마치며...

이로써 여러분은 세계에서 가장 많이 사용하고, 가장 많이 알려져 있고, 가장 뛰어난 성능의 웹서버를 만들었습니다. 집에서, 학교에서, 공공기관에서, SOHO용으로 이제 여러분은 웹서버를 만드실 수 있습니다.

이번 강좌를 통하여 많은 분이 리눅스와 함께 자유의 정신을 만끽하면서 함께 즐거워 했으면 하는 것이 저의 바램입니다.