Server Admin

본문 바로가기
사이트 내 전체검색


RedHat Linux >> Server Administration for Redhat Linux
[목차]
제5장 Apache Web 서버

    3. 아파치 설정


아파치 설정 파일은 세 개로 나누어져 있다. 이는 Rob McCool의 NCSA서버 설정 파일에 기반을 두어 httpd.conf, srm.conf, access.conf로 구성되어 있다. httpd.conf는 서버의 동작과 관련된 전반적인 지시자를 포함하고 있다. srm.conf는 파일 시스템의 네임 스페이스 또는 리소스를 위한 지시자를 포함하고 있다. access.conf엔 다양한 디렉토리에 대한 접근 제어에 해당하는 지시자 즉, <Directory> 섹션과 같은 부분이 포함되어 있다.

그러나, 이러한 구분은 <VirtualHost> 섹션에서의 일부 지시자를 세 개의 설정파일에 나눌 수 없다는 한계를 가지고 있다. 그래서 현재 아파치는 옛 방식의 흔적인 세 개의 설정파일을 가지고 있긴 하지만, 실제로는 한 개의 설정파일인 httpd.conf만을 사용하길 권장하고 있다. 실제 이렇게 함으로써 설정의 내용을 이해하기 쉽고, 관리하기 쉽다는 장점을 얻을 수 있다.

httpd.conf의 내용을 보면, #으로 시작하는 주석 글들을 볼 수 있다. 이는 지시자에 대한 짧은 설명 글로 사용자의 편의를 위한 것이다. 이 주석은 간단하게 작성된 것으로, 이 주석만으로 지시자의 기능을 이해하려고 해선 안 된다. 지시자를 정확하게 사용하기 위해선 지시자를 자세하게 설면한 문서나 레퍼런스를 이용할 것을 권장한다. 그러나 httpd.conf내의 주석도 간단하나마 훌륭한 레퍼런스가 될 수 있는 것은 사실이다.

httpd.conf의 내용 중 일부 내용에 대해 설명하겠다. 여기서 설명하지 않은 내용은 다른 참고 문서 또는 httpd.conf의 주석을 참고하기 바란다.

httpd.conf의 일부 지시자를 살펴보자.

ServerType standalone

서버가 동작하는 방식을 지정한다. standalone과 inetd라는 두가지 서버 타입이 있다. standalone은 아파치 웹서버가 독립적으로 동작한다는 의미이며, inetd라는 것은 inetd라는 수퍼 데몬에 의해 아파치 웹서버가 동작한다는 것으로 다른 대표적인 서비스로는 telnet, ftp 등이 이 수퍼 데몬에 의해 동작한다. 수퍼데몬을 이용하면 서비스에 필요한 데몬을 모두 구동시킬 필요가 없이 요청되는 서비스에 따라 해당 데몬을 실행하고, 그요청이 수행된 후엔 다시 데몬을 중지시킨다. 즉, 웹서버에 대한 요청이 들어오면, inetd에 의해 아파치 웹서버가 시작되고 요청된 서비스를 마치면, 아파치 웹 데몬을 중지한다. inetd를 이용하면, 시스템의 리소스를 효율적으로 이용할 수 있지만, 상대적으로 inetd에 의한 오버헤드로 인해 서비스 지연 시간이 발생하게 된다. 웹서버와 같이 빈번하게 서비스 요청이 있는 경우엔, 일반적으로 inetd가 아닌 standalone 타입으로 서버를 동작시킨다.

Timeout 300

KeepAlive On

MaxKeepAliveRequest 100

KeepAliveTimeout 15

MinSpareServers 5

MaxSpareServers 20

StartServer 8

MaxClient 150

MaxRequestPerChild 100

서버가 다음 번 요청을 기다리고 전송이 완료될 때 까지의 최대 시간 값이 Timeout이다. 즉 300초간 기다린다는 의미이다.

사용자가 웹사이트에 접속한 후, 그 웹사이트의 다른 문서를 요청하는 경우가 많다. 이런 경우 다시 접속을 시도하는데, KeepAlive on을 설정하면, 접속을 단절시키지 않고 유지시켜 좀더 따른 서비스를 가능하도록 한다.

KeepAlive가 on인 경우, 최대로 유지할 수 있는 접속 수가 MaxKeepAliveRequest이며, 다음 요청이 있을 때까지의 최대 대기시간이 KeepAliveTimeout이다. 즉, 최대 KeepAlive 접속 수는 100이며, 각각 15초간 접속을 유지한다.

아파치는 시작시 클라이언트에 대한 응답 속도의 향상을 위하야 몇 개의 자식 프로세스를 동시에 생성한다. MinSpareServers와 MaxSpareServers는 각각 최소, 최대의 자식 프로세스의 수를 뜻한다. MinSpareServers 5는 최소 5개의 자식 프로세스는 항상 생성해 둔다는 의미이다. MaxSpareServers 20은 20개을 넘는 자식 프로세스는 동작하지 않는다는 의미이다.

아파치를 처음 시작하면, 기본적으로 몇 개의 자식 프로세스가 생성되는데, 이것이 바로 StartServer에서 지정한 것이다.

MaxClient는 동시에 처리할 수 있는 클라이언트로 부터의 요청 횟수를 뜻한다. 즉, 150이하의 요청에 대해서만 동시에 처리한다는 의미이다.

MaxRequestPerChild는 하나의 자식 프로세스가 처리하는 요청의 횟수이다. 100이라고 한다면, 100개의 요청을 처리한 후 그 자식 프로세스는 자동으로 사라진다. 이는 있을 지도 모르는 아파치의 메모리 누수 현상을 막기 위한 하나의 해결책이라고 한다.

Port 80

User nobody

Group nobody

ServerAdmin root@localhost

ServerName localhost

DocumentRoot /home/httpd/html

Port는 서비스의 포트번호를 지정한다. 이는 서버타입을 standalone으로 설정했을 때 의미가 있다. 포트는 1023보다 작은 경우 루트 권한으로 httpd가 실행되어야 한다.

User, Group은 httpd가 응답할 때, 어떤 user/group을 가질 것인지를 지정한다. 이 지시자를 사용하기 위해선 초기 httpd의 실행을 루트 권한으로 해야 한다.

ServerAdmin은 httpd를 관리하는 관리자의 이메일 주소를 적는 것이다.

ServerName은 일반적으로 도메인이 등록된 호스트에서 httpd가 동작하는 경우엔 설정할 필요가 없다. 그러나 서버네임을 resolving 할 수 없거나 IP를 사용하고자 한다면, ServerName 지시자를 이용해서 강제로 지정할 수 있다.

DoucumentRoot는 문서를 찾을 기본 디렉토리를 지정한다. Alias가 지정한 이외의 디렉토리에 대해서는 모두 이 지시자에 정의 된 경로를 사용하게 된다.

이후의 httpd.conf의 내용을 보면, 블록 지시자들이 나온다. 이에 대해 알아보자. 블록 지시자엔 <VirtualHost>, <Directory>, <File>, <Location>, <IfDefine>, <IfModule> 등이 있다. <VirtualHost>는 따로 알아보기로 하고, <Directory>, <File>, <Location>에 대해 우선 알아보자.

<Directory 디렉토리>

...

</Directory>

특정 디렉토리 또는 일련의 디렉토리에 대해 다른 지시자의 내용을 적용할 수 있다. <Directory> 대신에 <DirectoryMatch> 또는 <Directory ~>를 사용할 수 있다. 이는 정규 표현식을 사용할 수 있는 블록 지시자이다. <Directory>의 사용 예를 보면 다음과 같다.

<Directory /home/*/public_html>

AllowOverride FileInfo AuthConfig Limit

Option 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>

위 <Directory> 블록 지시자 내에서 사용된 것들에 대해 알아보자.

- AllowOverride

이 지시자를 통해 그 이전에 설정된 여러 지시자들을 무시하고 사용되도록 한다.

AllowOverride를 통해 재설정 가능한 지시자들로는 AuthConfig, AuthUserFile, FileInfo, Indexes, Limit, Options, All, None등이 있다.

- Options

이지시자는 사용자들이 웹사이트로부터 어떤 것둁르 어떻게 얻어갈 수 있는지를 광범위하게 제어할 수 있다. 이 옵션에서 사용할 수 있는 것들로는 All, ExecCGI, FllowSymLinks, Includes, IncludesNOEXEC, Indexes, MultiViews, SysmLinksIfOwnerMatch등이 있다.

- All

MutiViews, IncludesNOEXEC, SymLinksIfOwnerMatch를 제외한 모든 옵션을 활성화시킨다.

- ExecCGI

CGI 스크립트를 사용할 수 있도록 한다.

- FollowSymLinks

심볼릭 링크를 허용한다.

- Includes

SSI를 사용할 수 있다.

- IncludesNOEXEC

SSI를 사용할 수 있으나, #exec, #include를 이용한 CGI 스크립트는 사용할 수 없다.

- Indexes

URL로 접속했을 때, index.html 또는 지정한 문서가 없을 때, 디렉토리 내용을 보여준다.

- MultiViews

컨텐츠의 내용을 선택적으로 사용할 수 있도록 한다. 예를 들어 브라우저가 사용하는 언어에 따라 특정 언어의 문서를 보여줄 수 있도록 할 수 있다. AddLanguage 지시자를 사용할 수 있다는 의미이다. 이외 이미지도 해당 된다.

- SymLinksIfOwnerMatch

동일한 사용자의 소유로 설정된 심볼릭 링크만 허가한다. FollowSysmLinks는 모든 심볼릭 링크를 허용함으로써 생길수 있는 보안상의 허점을 보완한 지시자이다. 예를 들어 특정 스크립트를 nobody 사용자만이 읽을 수 있다면, httpd에서 이 스크립트를 읽을 수 있다. httpd는 nobody사용자로서 동작하기 때문이다. 만약, 어떤 악의를 품은 사용자가 이 스크립트르 심볼릭 링크를 했다면, 그 사용자는 여전히 그 스크립트를 심볼릭 링크를 했다면, 그 사용자는 여전히 그 스크립트를 읽을 수 없지만, 만약 자신의 홈페이지에서 링크를 해본다면, 그스크립트를 볼 수가 있다. 그러나 SysmLinksIf OwnerMatch를 이용하면, 동일한 사용자의 소유로 설정된 심볼릭 링크만 허가하므로, 이경우엔 그 스크립트를 읽을 수 없다.

<Limit 메소드1, 메소드2,>

...

</Limit>

브라우저로부터 들어오는 서버의 요청을 HTTP명령(메소드) 분류에 따라 블록을 정의한다.

<Files 파일>

...

</Files>

특정 파일에 대해서 다른 지시자의 내용을 적용하고 싶을 때 사용한다. 여기서 파일은 DocumentRoot에 비교한 상대 경로로 지정한다. <FilesMatch> 또는 <Files ~>로 정규표현식을 사용할 수 있다. 예를 들면 다음과 같다.

<Files ~ ^\.ht>

Order allow,deny

Deny From all

</Files>

~은 정규표현식을 사용한다는 의미이며, .ht인 파일은 기본적으로 Order에 지정한 지시자 순으로 설정되며, Deny from all은 모든 사용자로부터 접근을 허용하지 않는다는 의미이다.

<Location URL>

...

</Location>

URL에 대해서 다른 지시자의 내용들을 적용하고자 할 때 사용된다. 앞서 설명한 <Directory> 나 <Files>와 동일하다.

다음 블록 지시자로 <IfDefine>에 대해 알아보자.

<IfDefine name>

...

</IfDefine>

아파치를 시작할 때, Dname이라는 플래그를 지정했을 때, 해당 내용을 적용한다.

마지막으로 <IfModule>에 대해 알아보자.

<IfModule mod_php4.c>

AddType application/x-httpd-php .php .php3 .phtml

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

</IfModule>

LoadModule과 AddModule에 의해 모듈을 적재하고, 그 모듈의 설정 부분을 정의할 때, 사용한다. 반드시, LoadModule과 AddModule이 <IfModule>보다 앞에 와야 한다. 반대로 위치할때는 모듈이 제대로 동작하지 않을 수 있다. 아파치의 설정 파일을 보면, 모듈 적재하는 부분이 있는데, 그 부분에 적당히 가져다 옮겨놓으면 될 것이다.

httpd.conf의 내용을 계속 살펴보면, 로그 및 아이콘에 대한 지시자들이 있다. 별로 어려운 부분이 아니므로, 이에 대한 것은 생략한다.

AddHandler 핸들러 확장자

지정한 확장자에 대해 핸들러를 적용한다. 핸들러는 특정한 MIME 혹은 특정한 타입의 파일이 호출되었을 때 수행된다. 아파치엔 기본적으로 몇 개의 핸들러가 있는데 다음과 같다.

- send-as-is

HTTP 헤더와 함께 파일을 내용 그대로 보낸다.(mod_asis)

- cgi-script

파일을 실행한다. Options ExecCGI가 지정되어 있어야 한다.(mod_cgi)

- imap-file

해당 파일을 이미지 맵으로 인식한다.(mod_imap)

- server-info

서버의 설정 상태를 받아온다.(mod_info)

-server-status

서버의 현재 상태를 받아온다.(mod_status)

- server-parsed

SSI 기능을 적용한다. Option Includes이 지정되어 있어야 한다.(mod_include)

- type-map

파일을 컨텐츠 협상을 위한 type map 파일로 인식한다.(mod_negotiation) 예를들면, 다음과 같다.

AddHandler cgi-script .cgi

에러문제가 발생했을 때 지정된 문서를 처리한다.

ErrorDocument 에러코드 문서

예를 들어,

ErrorDocument 404 /missing.html

에러코드 404는 클라이언트가 요청한 문서가 없을 때 발생한는 에러코드로, 이 경우 missing.html의 문서를 내보내게 된다. 이외에도 아파치에서 사용하는 지시자는 매우 많다. 이들에 대해서는 필요에 따라 여러분이 공부해 보기 바란다.

[목차]

개인정보취급방침 서비스이용약관 모바일 버전으로 보기 상단으로

TEL. 063-469-4551 FAX. 063-469-4560 전북 군산시 대학로 558
군산대학교 컴퓨터정보공학과

Copyright © www.leelab.co.kr. All rights reserved.