[Apache] httpd.conf 분석
본문 바로가기
IT 이야기/Apache

[Apache] httpd.conf 분석

by 찬찬이 아빠 2020. 5. 5.
반응형

Apache 2.4의 httpd.conf 분석을 진행합니다.

 

ServerTokens Prod

이 지시자는 Apache의 HTTP로서 응답할 헤드(Header)를 설정합니다. 이 값에 의해 운영체제의 OS타입이나 컴파일된 모듈들의 정보들이 노출될 수 있기에 보안상 최소한의 정보만을 제공하도록 prod로 설정하는 것이 좋습니다.

아래는 설정했을때의 값을 나타내는 예제입니다.

ServerTokens Prod[uctOnly]
Server sends (e.g.): Server: Apache

ServerTokens Major
Server sends (e.g.): Server: Apache/2

ServerTokens Minor
Server sends (e.g.): Server: Apache/2.0

ServerTokens Min[imal]
Server sends (e.g.): Server: Apache/2.0.41

ServerTokens OS
Server sends (e.g.): Server: Apache/2.0.41 (Unix)

ServerTokens Full (or not specified)
Server sends (e.g.): Server: Apache/2.0.41 (Unix) PHP/4.2.2 MyMod/1.2

 

 

ServerRoot "/etc/httpd"

이 지시자는 Apache의 홈디렉토리를 지정하며 절대경로로 지정합니다. 이후에 나오는 대부분의 경로(PATH)들은 이 경로를 루트로 한 상대경로로 지정이 됩니다.

 

 

PidFile run/httpd.pid

서버가 시동할때 자신의 프로세스 고유 번호를 기록할 파일위치입니다.

 

 

Timeout 300(기본값 300)

클라이언트의 요청에 의해 서버와 연결이 되었을 때 클라이언트와 서버간에 아무런 메세지가 발생하지 않았을 때 타임아웃시키고 연결을 끊을 시간을 초단위로 설정합니다. 다시말해 홈페이지에 접속한 사용자가 특정 페이지를 로딩한 후에 다음 연결작업(웹페이지 링크 클릭등)을 하지 않고, 여기서 지정한 시간동안 머물게 되면 그 사용자와 Apache 프로세스와의 연결이 끊어지게 됩니다. 한참후에 다시 사용자가 페이지 로딩을 하였을 때에는 다른 Apache 프로세스가 요청을 처리하고 서비스하게 됩니다. 이 값은 보통 300초(5분)로 지정합니다. 네트워크의 속도가 낮을수록 수치값은 높게 설정하는 것이 좋습니다.

 

 

KeepAlive On(기본값 On)

Apache의 특정 한 프로세스가 특정 사용자의 지속적인 요청작업들을 계속해서 처리하도록 허용할 것인가 아닌가에 대한 여부를 설정한다. 즉, 한 방문자가 홈페이지에 접속하여 다른 여러 페이지들을 계속해서 볼 때 그 방문자의 지속적인 다른 요청들을 한 프로세스가 계속해서 처리하도록 할 것인가를 결정하는 지시자이다.

 

 

MaxKeepAliveRequests 100(기본값 100)

KeepAlive의 값이 On일 경우에 유효한 값으로, 하나의 프로세스가 특정 방문자의 요청을 계속해서 처리할때 지정한 횟수만큼만 처리합니다. 프로세스가 이 횟수를 넘어서면 그 프로세스는 죽고 다시 다른 프로세스가 그 방문자의 요청을 처리합니다.

하나의 프로세스가 지속적으로 요청을 처리하다보면 메모리의 효율이 저하되고, 이런 일이 계속 발생하면 전체적인 시스템 성능이 저하됩니다. 이 값이 0일 경우 무한대로 요청을 처리하며 성능을 높이기 위해 높은 값을 추천합니다.

 

 

KeepAliveTimeout 5(기본값 5)

KeepAlive의 값이 On일 경우에 유효한 값으로, 설정한 시간(초)동안 요청이 없다면 그 연결을 끊기 위해 타임아웃 시킵니다. 효율적인 프로세스관리와 자원낭비를 줄이기 위한 설정입니다. 이 값이 낮다면 동시접속 수를 올리는데 공헌할 수 있습니다.

 

Listen 80

시스템의 기본값 이외에 다른 IP 주소와 포트에 대해서도 연결할 수 있도록 해줍니다. 주로 가상호스트(Virtual Host)부분에서 기본 80번 이외에 다른 포트를 이용하여 가상호스트를 설정하고자 할 때에 필요합니다.

 

Include conf.modules.d/*.conf

 

 

Include conf.d/*.conf

"/etc/httpd/conf.d" 설정 디렉토리에서 설정파일들을 불러옵니다.

mod_jk.conf, ssl.conf, uriworkermap.properties, workers.properties 등과 같은 파일들이 존재합니다.

 

 

# ExtendedStatus On(기본값 Off)

server-stauts로 Apache의 상태를 모니터링 할때 자세한 상태정보기능을 제공할 것인지(On) 아닌지(Off)를 설정하는 지시어입니다. 기본값은 Off이고, 아래쪽 설정중에 server-status에 영향을 줍니다.

 

User anobody
Group nobody

 

User와 Group 이라는 설정 지시자는 홈페이지 서비스를 직접 담당하는 Apache 자식 프로세스들의 실행 소유자와 소유그룹을 각각 어떤 계정으로 부여 할 것인지를 결정하는 것입니다. 보안을 위해 nobody로 설정합니다.

 

 

ServerAdmin Administrator@localhost

웹문서 로딩시 에러가 발생했을 경우와 같이 에러 페이지에 보여질 관리자 메일 주소입니다.

 

 

ServerName localhost:80

클라이언트에게 보여주는 호스트 이름을 지정 합니다. www를 쓰지 않는 호스트에서 www를 쓰는 것처럼 보이게 설정할 수 있습니다.

 

 

UseCanonicalName Off

이 설정이 On일 경우, 아파치가 자기 참조 URL(반응이 오고 있는 서버를 다시 가리키는 URL)을 만들 필요가 있을 때마다 "공식적인" 이름을 만들기 위해 ServerName과 Port를 사용합니다. 이 값이 Off일 경우에는 아파치는 클라이언트가 제공한 호스트네임과 포트를 사용할 것입니다. 간혹 웹주소의 맨끝에 '/'를 붙이지 않아 페이지를 찾지 못할 경우 이 값을 Off. 이 설정은 CGI나 PHP 스크립트의 SERVER_NAME, SERVER_PORT에도 영향을 미칩니다.

 

 

DocumentRoot "/var/www/html"

서버의 웹문서가 있는 경로를 지정합니다. 경로의 마지막에 '/'를 추가해선 안되고 심볼릭 링크나 Alias를 사용하여 다른 위치를 가리키도록 할 수 있습니다.

<Directory />

    AllowOverride None

    Require all denied

</Directory>

 

<Directory> ~ </Directory> 지시자는 지정한 디렉터리 이하의 모든 웹문서들에 대하여 어떤 서비스와 기능을 허용/거부 할 것인지를 설정하는 매우 중요한 지시자 입니다. 현재 루트(/) 디렉토리에 대해 심볼릭 링크를 허용하고, .htaccess 파일의 사용을 거부합니다. <Directory>지시자의 설정은 개인에 따라 다르니 각자 목적에 맞게 설정해야 합니다.

 

Options 지시자는 지정한 디렉터리 이하에 모든 파일과 디렉터리들에 적용할 접근제어를 설정합니다. 디렉터리 목록을 보여줄지, CGI를 허용할 것인지 등등의 것들의 설정을 여기서 하게 됩니다.

 

가상호스트를 사용하는 경우나 하위 디렉터리에서 위와 같은 루트(상위 디렉터리)에 대한 설정이 어떻게 적용되어 있던간에 가상호스트 안이나 하위 디렉터리에 다시 Options 값을 지정할 수 있습니다. 이때 상위 디렉터리의 다른 옵션은 변경하지 않고, 특정 옵션만 제거하거나 추가할때 + 나 - 를 Options 값 앞에 붙여 사용하기도 합니다.

 

Options -FollowSymLinks는 상위 디렉터리 설정에서 허가된 FollowSymLinks를 제거하게 되며, Options +Indexes는 상위 디렉터리 설정에 없는 Indexes 설정을 추가합니다.

종류 설명
None 모든 허용을 하지 않음
즉 None 설정으로 이외의 다른 설정들은 모두 무시함
All MultiViews를 제외한 모든 옵션 설정을 허용
Options 값이 공백일 때도 All과 같음
(Options (없음))
Indexes 웹서버의 디렉토리 접근 시에 DirectoryIndex에서 지정한 파일(index.html 등)이 존재하지 않을 경우에 디렉터리 내의 파일 목록 리스트를 웹 브라우저로 보여줌
서버 보안을 위해 사용하지 않는 것이 좋음
Includes SSL 사용을 허용하는 설정
단 mod_include.c 라는 모듈이 필요하며 기본적으로 로드되어 있음
IncludesNOEXEC SSL 사용은 허용되지만 #exec 사용과 #include는 허용되지 않음
즉 SSL를 사용하면서 시스템에 위험한 SSL의 실행 태그는 허용하지 않겠다는 설정
FollowSymlinks 심볼릭 링크를 허용
이 옵션을 지정하면 웹 브라우저에서 링크 파일의 경로까지도 확인 할 수 있게 됨
보안상 이 값은 설정하지 않는 것이 좋음
ExecCGI perl 등과 같은 CGI 실행을 허용하기 위한 설정
원래 아파치에서 CGI 사용은 ScriptAlias로 지정된 위치에서 사용하는 것이 기본
하지만 ScriptAlias가 지정되지 않은 디렉터리에 이 옵션이 지정되어 있다면 지정된 디렉터리 내에서는 CGI 사용이 허용 됨
물론 이 경우에도 "AddHandler cgi-script" 지시자에서 정의한 확장자만 유효
MultiViews 웹 브라우저의 요청에 따라 적절한 페이지로 보여줌
웹브라우저의 종류나 웹문서의 종류에 따라서 가장 적합한 페이지를 보여줄 수 있도록 하는 설정

 

AllowOverride 지시자는 어떻게 접근을 허락할 것인가에 대한 설정입니다.

특정 디렉터리에 대한 방문자들의 접근 방식을 어떤 방식으로 인증하여 허용할 것인가의 문제라고 할 수 있습니다. AllowOverride에서 설정하는 값들은 중복해서 설정될 수 있으며 그때마다 가장 최근에 설정된 값잉 항상 우선적용 됩니다.

 

종류 설명
None 이 값이 설정되면 AccessFileName에 지정된 파일을 액세스 인증파일로 인식하지 않음
즉 AccessFileName의 값이 대부분 .htaccess 이므로 이를 무시하게 됨
아주 제한적인 접근만을 허용할때 사용하는 값
All 이전의 인증 방식에 대하여 새로운 접근 인증 방식을 우선 적용하도록 Override를 허용
AuthConfig AccessFileName 지시자에 명시한 파일에 대하여 AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, require 등과 같은 클라이언트 인증 지시자의 사용을 허용
즉 htpasswd 유틸리티를 이용하여 특정 디렉터리의 접근은 AccessFileName에 명시한 파일(.htaccess)로 제어하고자 할 때에 해당 디렉터리 내에 이 값을 주로 사용(디렉터리 인증설정)
FileInfo AccessFileName 지시자에 명시한 파일에 대하여 AddEncoding, AddLanguage, AddType, DefaultType, ErrorDocument, LanguagePriority 등과 같은 문서 유형을 제어하는 지시자 사용을 허용
Indexes AccessFileName 지시자에 명시한 파일에 대하여 AddDescription, AddIcon, AddIconByEncoding, AddIconByType, DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOptions, ReadmeName 등과 같은 디렉터리 Indexing을 제어하는 지시자 사용을 허용
Options AccessFileName 지시자에 명시한 파일에 대하여 Options 그리고 XBitHack등과 같은 특정 디렉터리옵션을 제어하는 지시자 사용을 허용
Limit AccessFileName 지시자에 명시한 파일에 대하여 allow, deny, 그리고 order 등과 같은 호스트 접근을 제어하는 지시자 사용을 허용

 

<Directory "/var/www/html">

     Options Indexes FollowSymLinks

     AllowOverride None

     Require all granted

</Directory>

 

기본적인 DocumentRoot의 위치(홈페이지)에 대한 <Directory> 설정입니다. Indexes 옵션으로 인해 적합하지 않은 웹문서 주소나 디렉터리를 가리킬 경우 하위 파일들이 목록화되어 나타납니다. 보안상으로는 좋지 않은 결과를 초래합니다. 그래서 None으로 설정했습니다.

 

Order 와 Allow 그리고 Deny 항목 설정이다. order 항목은 접근을 통제하는 순서를 나타낸다. allow와 deny 순으로 지정하면 allow 기능을 먼저 수행하고, deny기능을 나중에 수행하라는 의미다.

 

  • deny, allow – deny 지시자 부터 검사하고 allow 지시자를 검사
  • allow, deny – allow 지시자 부터 검사하고 deny 지시자를 검사
  • mutual-failure – allow목록에 없는 모든 host에게 접속을 거부

allow from 항목 다음에 쓸수 있는 항목은 아래와 같다.

  • 사용 가능한 주소는 도메인 네임
  • 호스트 이름 주소
  • 호스트 ip 주소
  • ip 주소의 앞부분 3바이트
  • 모든 주소일 경우 all을 사용한다

deny from 항목은 allow from과 반대다.

<IfModule mod_userdir.c>

     #UserDir public_html

     #UserDir enable

     #UserDir disable root

     UserDir disabled

</IfModule>

 

사용자들의 계정에 각각의 홈페이지를 서비스할때 필요한 개별 가입자들의 홈페이지 디렉토리이름이다. 현재는 disabled 되어 있지만 사용하게 될 경우 public_html이나 www를 설정값으로 많이 사용한다.

 

접근은 http://도메인/~유저명 과 같은 방식이 되며 UserDir disable root 처럼 지정하면 root 사용자는 이 기능을 사용하지 않겠다는 것이다. 스페이스로 공백을 주고 추가로 사용하지 않을 사용자를 계속 입력할 수 있다.

 

 

DirectoryIndex index.html index.html.var

 

웹사이트의 초기페이지 문서로 어떤 파일을 사용할 것인가를 결정하는 지시자이다. 특정 디렉토리만을 지정했을 경우, 적혀진 순서에 따라 읽어들이며 위에 지정한 목록들이 디렉토리에 없다면 Options 지시자에 Indexes 또는 All이 지정되어 있을 경우 디렉토리내의 파일리스트를 보여준다.

 

Options 지시자에 Indexes 또는 All이 지정되어 있지 않다면 Not Found 라는 에러문서를 로딩한다. index.html.var에 대한 내용은 아래의 링크를 참고한다.

 

AccessFileName .htaccess

 

각 디렉토리에 대하여 접근 제어 정보 내용을 담고 있는 파일이름을 설정한다. 통상적으로 .htaccess 라는 이름을 사용한다.

 

<Files ~ "^\.ht">

    Order allow,deny

    Deny from all

    Satisfy All

</Files>

 

위의 내용은 브라우저가 .htaccess 파일과 .htpasswd 파일에 접근할 수 없도록 하는 설정으로 .ht로 시작하는 파일에는 주로 웹접근권한등에 대해 설정되어 있기때문에 보안과 연관되어 있다.

 

 

TypesConfig /etc/mime.types

mime.types 의 위치를 설정한다. CentOS 6.4 에서 yum으로 설치시 자동설정되는 Apache에는 위와 같이 설정되어 있다. 일반적으로 conf/mime.types 에 위치한다.

 

 

DefaultType text/plain

mime.types 파일에 정의되어있지 않은 파일형식에 대한 요청을 받았을때 사용할 기본 MIME 타입을 설정한다. 서버에 주로 텍스트나 HTML 문서가 많다면 "text/plain"을 쓰는 것이 좋다. 대부분이 실행 프로그램이나 이미지등 바이너리인 경우에는 웹 브라우저가 텍스트라고 생각하여 바이너리 파일을 화면에 표시하지 않도록 하기 위해 'application/octet-stream'를 적는다.

 

<IfModule mod_mime_magic.c>

       # MIMEMagicFile /usr/share/magic.mime

        MIMEMagicFile conf/magic

</IfModule>

 

mod_mime_magic 모듈을 사용하면 파일의 내용을 가지고 파일의 타입에 힌트를 얻는다. MIMEMagicFile 지시자를 사용하여 모듈에게 힌트 정보가 저장되어 있는 파일을 설정한다.

 

 

HostnameLookups Off

웹서버의 로그(access_log)에 보면 방문자들에 대한 웹문서 접근기록을 남겨두고 있다. 이 로그파일에 위의 설정값이 Off일 경우에는 IP주소를 기록하고 On일 경우에는 모든 IP 주소에 대하여 DNS에 질의하여 해당 IP 주소에 대한 도메인 정보가 있을 경우에는 도메인명으로 남기게 되지만 도메인 정보가 없는 IP 주소에 대해서는 그냥 IP 주소로 남겨지게 된다. 이때 DNS 질의로 인한 트래픽이 발생하기에 기본값을 Off로 설정하고 사용하고 있다.

 

 

#EnableMMAP off

커널에서 메모리매핑(mmap)을 지원한다면 아파치가 웹문서를 로딩하기 위하여 내부문서를 읽을때에 파일을 메모리 매핑하여 처리한다. 따라서 아파치의 성능이 크게 향상될수 있다. 그러나 메모리대응이 서버의 성능을 떨어트리고 심지어 안정성을 해치는 경우가 있고 smp Solaris 서버에서 아파치 2.0은 종종 mmap을 사용하지 않을때가 더 빠르다. 또한 NFS 마운트한 파일시스템에 있는 파일을 메모리 대응하는 도중에 다른 NFS 클라이언트에 있는 프로세스가 파일을 지우거나 파일크기를 줄이면, 웹서버 프로세스가 다음 번에 메모리대응한 파일내용을 읽을때 bus error가 발생할 수 있다.

위의 조건에 해당하면 전송하는 파일을 메모리대응하지 않도록 EnableMMAP off를 사용해야 한다. 기본 설정값은 on이다.

#EnableSendfile off

아파치는 운영체제가 sendfile을 지원하면 커널 sendfile을 사용하여 정적 파일을 서비스하는 경우 전송할 파일을 직접 읽지않을 수 있다. sendfile을 사용하면 read와 send를 따로 할 필요가 없어서 매우 빨라진다. 그러나 sendfile을 사용하면 웹서버의 안정성을 해치게되는 경우가 있고, 커널은 자신의 캐쉬를 사용하여 NFS로 마운트한 파일을 안정적으로 서비스할 수 없는 경우가 있으므로 EnableSendfile off를 사용해서 파일을 sendfile 전송하지 않도록 할수 있다. 기본 설정값은 on이다.

 

 

ErrorLog logs/error_log

아파치 웹서버의 에러로그파일(error_log)의 위치를 지정하는 것으로 가상호스트설정에서 별도의 에러로그파일의 위치를 지정하지 않았다면 이곳에 모두 저장된다.

 

 

LogLevel warn

에러로그파일(error_log)의 기록내요을 얼마나 자세하게 기록할 것인가를 결정하는 지시자이다.

  • none : 발생하는 모든 상황에 대한 메시지
  • emerg : 최상위, 매우 위험한 상황의 메시지. 전체공지가 요구되는 메시지
  • alert : 즉각적으로 조치를 취해야하는 상황의 메시지, 즉시 행동이 취해져야하는 상황
  • crit : 급한 상황은 아니지만 치명적인 시스템문제 발생 상황의 메시지
  • warn : 주의를 요하는 메시지 즉 경고상황
  • notice : 에러가 아닌 알림에 관한 메시지, 즉 경고상황
  • info : 단순한 프로그램에 대한 정보 및 통계관련 메시지, 보통수준으로 알려주는 상황
  • debug : 최하위, 디버깅관련 메시지
  • * : 발생하는 모든 상황에 대한 메시지

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#

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

 

웹로그파일(access_log)에 방문자들에 대한 기록을 어떤 포맷으로 할 것인가에 대한 포맷종류를 설정하는 지시자들이다. 바로 애래에서 설명하고 있는 CustomLog에서 사용할 몇가지 로그포맷의 이름들(combined, common, referer, agent, combinedio)을 지정한 곳이다. "combinedio"는 모듈 mod_logio_module이 로드되어 있어야 하며 %I와 %O 변수를 사용해 보내고 받는 byte를 측정할수 있다.

 

<변수들의 의미>

  • %a : 방문자의 원격의 IP 주소 (HostNameLookups 값이 On이면 도메인으로 기록될 수 있음)
  • %A : 아파치 웹서버의 로컬시스템의 IP 주소
  • %b : 헤더를 포함한 전송량(bytes)
  • %B : HTTP 헤더를 포함한 전송량
  • %{var}e : 환경 변수 "var"
  • %f : 요청한 파일이름
  • %h : 요청을 보낸 원격의 호스트
  • %H : 요구 프로토콜
  • %l : 클라이언트에서 보낸 로그인 ID명(즉 원격 로그인 ID)
  • %m : 요청방법
  • %p : 서버의 Canonical 포트 번호(요청이 처리되는 포트)
  • %P : 요청이 처리되는 아파치 자식 프로세스 ID(PID)
  • %q : 질의
  • %r : 첫번째 요청 라인
  • %s : 상태코드
  • %u : 사용자인증에 대한 원격의 유저. 클라이언트가 요청한 URL이 기본 HTTP인증 요구에 대한 사용자명을 의미
  • %U : 요청한 URL 경로
  • %v : 클라이언트 요청에 따른 Canonical 서버네임(서버네임 혹은 가상호스트의 이름)
  • %V : UseCanonicalName 설정에 따른 서버네임
  • %t : 클라이언트의 요청을 아파치 자식프로세스가 처리하기 위해 소요된 시간으로 CLF 포맷(일/월/년:시:분:초 time-zone)
  • %T : 클라이언트에 아파치 자식프로세스에게 처리를 요청하는 시간(초)
  • %{IncomingHeader}I : IncomingHeader의 내용. 즉 서버에게 보내진 요청의 헤더부분
  • %{OutgoingHeader}o : OutgoingHeader의 내용. 즉 응답의 헤더부분.
  • %{MODULE_NOTE}n : 다른 모듈로 부터의 MODULE_NOTE 내용
  • %I : 요청과 헤드를 포함하여 받은 byte수
  • %O : 요청과 헤드를 포함하여 보낸 byte수

 

#CustomLog logs/access_log common

#CustomLog logs/referer_log referer

#CustomLog logs/agent_log agent

CustomLog logs/access_log combined

 

하나의 로그파일에 common(접근정보), agent, referer 정보를 모두 저장하기 위해서 combined를 사용하였다.

 

 

ServerSignature On

부가적으로 서버가 생성하는 페이지(에러문서, FTP 디렉토리 목록, mod_status, mod_info 출력등 - CGI는 제외)에 서버 버전과 가상호스트 이름을 포함하는 행을 추가하도록 한다. "Email"로 설정하면 ServerAdmin으로의 mailto: 링크를 포함한다. On | Off | EMail 중에 하나로 설정한다.

 

Alias /icons/ "/var/www/icons/"

 

<Directory "/var/www/icons">

       Options Indexes MultiViews FollowSymLinks

       AllowOverride None

       Order allow,deny

       Allow from all

</Directory>

 

Alias는 별칭을 만드는 지시자이고 Alias 별칭명 실제명 과 같은 방식으로 만들게 된다. 별칭명뒤에 /를 포함하면 아파치 서버는 URL에도 /이 있어야 처리할 수 있다. 위에서는 Alias를 이용해 /icons/라는 별칭을 만들었고 그 디렉토리의 내용을 설정하고 있다. 웹브라우저를 통한 도메인 네임의 디렉토리 접근과 서버의 실제 디렉토리를 연결시켜 주는 기능을 한다.

 

/icons/는 Indexes 지시자가 설정되어 있을때 파일목록을 리스팅하게 되는 경우에 사용될 아이콘들의 모음이다.

 

<IfModule mod_dav_fs.c>

       # Location of the WebDAV lock database.

       DAVLockDB /var/lib/dav/lockdb

</IfModule>

 

WebDAV는 Web-based Distributed Authoring and Versioning (웹기반 분산형 저작 및 버전관리)의 약자로 웹을 통하여 웹서버에 파일을 관리(목록 조회, 수정, 삭제, 이동 등)할 수 있는 확장된 HTTP 프로토콜을 말한다.

 

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

 

<Directory "/var/www/cgi-bin">

       AllowOverride None

       Options None

       Order allow,deny

       Allow from all

</Directory>

 

ScriptAlias는 근본적으로 Alias와 같으나 특별히 CGI 스크립트를 특정한 위치에서만 제공하기 위한 설정이다. 일종의 웹서버 보안을 위한 설정에 해당된다. 어떤 위치에서든 CGI를 허용하게 되면 보안에 문제가 있을 수 있으므로 위와 같은 Alias를 설정하여 사용자들이 /var/www/cgi-bin/ 디렉토리내에 존재하는 cgi 파일들만 사용할 수 있도록 할 수 있다.

가상호스트를 사용할 경우에는 개별적으로 가상호스트에 설정해도 된다.

 

 

# Redirect permanent /foo http://www.example.com/bar

 

특정 디렉토리경로로 방문자가 로딩하였을 경우에 지정된 다른 웹사이트경로(URL)로 방향전환을 할 수 있는 지시자이다. 위의 예에서는 방문자가 /foo 라는 디렉토리를 요청하였을 경우에 http://www.example.com/bar 라는 URL로 보여주도록 하는 설정이다. 매우 유용한 설정이며 ErrorDocument 라는 설정 지시자와 상호 연관되어 있는 지시자이다.

 

 

IndexOptions FancyIndexing VersionSort NameWidth=* HTMLTable Charset=UTF-8

 

디렉토리목록을 표시할 때 어떻게 보여줄 것인지 설정하는 지시자로 FancyIndexing 디렉토리의 Fancy 목록을 만든다. VersionSort 파일의 버전별로 정렬하여 출력하며 NameWidth=* 바이트 단위로 파일명 열의 폭을 지정한다. * 는 길이 자동 조절, HTMLTable html 표로 fancy 디렉토리 목록을 만든다. Charset=UTF-8 문자셋을 utf-8 로 출력한다.

 

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 .hqxAddIcon /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 .txtAddIcon /icons/c.gif .c

AddIcon /icons/p.gif .pl .pyAddIcon /icons/f.gif .for

AddIcon /icons/dvi.gif .dviAddIcon /icons/uuencoded.gif .uu

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

AddIcon /icons/tex.gif .texAddIcon /icons/bomb.gif core

AddIcon /icons/back.gif ..

AddIcon /icons/hand.right.gif README

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

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

 

AddIcon으로 시작하는 지시자들은 서버에게 다양한 파일, 파일명 확장자에 대하여 어떤 아이콘을 보여줄 것인지를 설정한다. /icons/binary.gif 의 경우 .bin .exe의 파일확장자를 가지는 파일에 대하여 아이콘을 사용한다는 의미로 해석하면 된다.

 

AddIconByEncoding 지시자는 파일의 판단을 확장자 대신 MIME 인코딩 값에 의해서 처리한다. AddIconByType 지시자는 파일의 판단을 확장자 대신에 MIME 타입에 의해서 처리한다. AddIcon 지시자는 지정된 파일의 확장자에 대하여 처리한다.

 

 

DefaultIcon /icons/unknown.gif

 

위에서 설정한 AddIcon에 해당하는 파일이름이 없을 경우에 여기서 지정한 기본 아이콘파일(unknown.gif)로 보여주도록하는 설정이다.

 

#AddDescription "GZIP compressed document" .gz

#AddDescription "tar archive" .tar

#AddDescription "GZIP compressed tar archive" .tgz

 

AddDescription 지시자는 서버가 생성한 인데스의 파일 뒤에 간단한 설명을 표시할 때 사용한다. 이 설정은 IndexOptions가 FancIndexing으로 설정되었을때만 표시된다. 설정형식은 AddDescription "표시할 설명" 파일확장자

 

ReadmeName README.html

HeaderName HEADER.html

 

ReadmeName은 디렉토리 목록표시 뒤에 붙여서 보여질 README 파일의 이름을 지정한다. HeaderName은 디렉토리 목록표시 앞에 붙여질 파일의 이름을 지정한다.

 

 

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

 

디렉토리목록을 인덱싱할 때 표시할 파일리스트에서 제외할 파일들을 지정한다. 쉘스타일의 와일드카드(*,?)가 허용된다.

 

위의 AddIconByEncoding 지시자부터 IndexIgnore 지시자까지는 모두 해당 디렉토리의 <Directory> ~ </Directory> 지시자의 Options에 Indexes 지시자가 있어야하고 DirectoryIndex 지시자에 지정된 파일이 모두 없는 상태에서 IndexOptions 지시자의 값이 FancyIndexing으로 설정되었을 때에 적용된다.

 

 

# DefaultLanguage nlAddLanguage ca .ca

AddLanguage cs .cz .cs

AddLanguage da .dk

AddLanguage de .de

AddLanguage el .el

AddLanguage en .en

AddLanguage eo .eo

AddLanguage es .es

AddLanguage et .et

AddLanguage fr .fr

AddLanguage he .he

AddLanguage hr .hr

AddLanguage it .it

AddLanguage ja .ja

AddLanguage ko .ko

AddLanguage ltz .ltz

AddLanguage nl .nl

AddLanguage nn .nn

AddLanguage no .no

AddLanguage pl .po

AddLanguage pt .pt

AddLanguage pt-BR .pt-br

AddLanguage ru .ru

AddLanguage sv .sv

AddLanguage zh-CN .zh-cn

AddLanguage zh-TW .zh-tw

 

DefaultLanguage 지시자와 AddLanguage 지시자는 웹문서의 언어를 지정하기 위한 지시자이다. 웹브라우저(클라이언트)가 이해할 수 있는 언어를 제공하기 위한 설정으로 이 설정으로 인하여 사용자가 이해할 수 있는 언어로 브라우징하기 위한 컨텐츠 협상을 사용할 수 있다.

 

#LanguagePriority en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW

LanguagePriority en ko ca cs da de el eo es et fr he hr it ja ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW

 

LanguagePriority는 언어의 우선순위를 내림차순으로 지정하며 컨텐츠 협상 도중에 어떤 언어를 먼저 사용할 것인가에 대한 순서를 결정한 것이다. 웹문서의 내용에 있어 표시할 언어를 결정할 때는 웹브라우저에 설정된 인코딩 메뉴를 따르게 되어 있다. 그러나 자동설정으로 되어 있을 경우에는 웹서버에서 보내주는 정보로 판단하게 된다.

 

LanguagePriority 는 언어 우선권을 지정해서 웹 요청에 대한 언어 우선권을 보내준다. 쓰여진 순서대로 언어 우선권이 생기게 되므로 ko를 제일 앞에 오게 하자

 

 

ForceLanguagePriority Prefer Fallback

 

ForceLanguagePriority는 클라이언트가 브라우저로 요청한 언어에 부합하는 페이지가 한 개가 아니면 서버는 "NOT ACCEPTABLE(Fallback)"이나 "MULTIPLE CHOICES (Prefer)"로 응답하게 된다. 이 오류를 피하기 위해 클라이언트가 요청한 언어를 무시하고 위의 LanguagePriority 지시자의 설정내용대로 응답하도록 하게 하는 설정이다.

 

 

AddDefaultCharset UTF-8

이 지시자는 외부로 보내지는 모든 웹문서들에 대하여 기본 charset을 지정한 것이다. 최근에는 대부분 UTF-8로 다국적인 표준을 사용한다. ISO-8859-1 이나 EUC-KR 으로 설정할 수도 있다.

 

 

#AddType application/x-tar .tgz

AddType은 MIME 설정파일인 mime.types에 정의되어 있지 않은 타입을 추가로 설정하고자 할 때에 사용된다. php를 설정할때 이를 사용하는데 현재 살펴보고 있는 버전의 httpd.conf 파일은 php에 대한 설정관련 부분을 /etc/httpd/conf.d/php.conf에 따로 설정하고 있다.

 

 

#AddEncoding x-compress .Z#AddEncoding x-gzip .gz .tgz

AddEncoding은 특정 브라우저로 하여금 자료를 받으면서 정보에 대한 압축해제를 할 수 있도록 한다. 단 모든 웹브라우저에서 이 기능을 제공하는 것은 아니다.

 

 

AddType application/x-compress .Z

AddType application/x-gzip .gz .tgz

압축파일들에 대한 MIME 정의

 

 

AddType application/x-x509-ca-cert .crt

AddType application/x-pkcs7-crl .crl

SSL 인증과 관련된 MIME 타입 정의

 

 

#AddHandler cgi-script .cgi

AddHandler는 파일확장자(.cgi)를 처리기(Handler 위의 cgi-script)에 매핑(연결)시켜주게 된다. 즉 위의 설정은 *.cgi 형식의 파일들은 cgi-script라는 handler가 처리하라고 아파치웹서버에게 알려주는 것이다. 이 부분에 대한 설정을 제대로 해주지 않게 되면 CGI가 실행되지 않을 수 있다. 위의 CGI 스크립트를 정상적으로 적용하려면 Options 지시자에 ExecCGI 값이 설정되어 있어야한다.

 

 

#AddHandler send-as-is asis

자기자신의 HTTP 헤드(header)를 포함하고 있는 파일을 위한 설정이다.

 

 

AddHandler type-map var

type-map을 사용(협상 자원)하기 위한 지시자이다. 아파치는 기본적으로 "It Worked" 페이지를 다양한 언어로 배포하도록 활성화 되어있다.

 

 

AddType text/html .shtml

AddOutputFilter INCLUDES .shtml

SSI(Server Side Include)문서로 인식할 파일확장자를 지정한 것이다. 즉 SSI 코드가 들어있는 문서의 확장자를 *.shtml으로 사용할 수 있는 설정이다. SSI는 시스템의 날짜와 카운터등 CGI 프로그램을 하지 않아도 HTML 문서에서 단 몇줄로 CGI의 효과를 낼 수 있는 SSI기능을 인식하게끔하는 유용한 도구이다. 즉, 이 설정이 유효하게 설정되었을 경우에 SSI로 된 문서는 아파치 웹서버에서 먼저 해석된 후에 그 결과를 html 문서와 함께 웹브라우저로 보내지게 된다. 이 설정지시자는 Options 지시자에 Includes라는 값이 설정되어 있을 때만 유효하다.

 

Alias /error/ "/var/www/error/"

<IfModule mod_negotiation.c>

<IfModule mod_include.c>

    <Directory "/var/www/error">

        AllowOverride None

        Options IncludesNoExec

        AddOutputFilter Includes html

        AddHandler type-map var

        Order allow,deny

        Allow from all

        LanguagePriority en es de fr

        ForceLanguagePriority Prefer Fallback

    </Directory>

#    ErrorDocument 400 /error/HTTP_BAD_REQUEST.html.var

#    ErrorDocument 401 /error/HTTP_UNAUTHORIZED.html.var

#    ErrorDocument 403 /error/HTTP_FORBIDDEN.html.var

#    ErrorDocument 404 /error/HTTP_NOT_FOUND.html.var

#    ErrorDocument 405 /error/HTTP_METHOD_NOT_ALLOWED.html.var

#    ErrorDocument 408 /error/HTTP_REQUEST_TIME_OUT.html.var

#    ErrorDocument 410 /error/HTTP_GONE.html.var

#    ErrorDocument 411 /error/HTTP_LENGTH_REQUIRED.html.var

#    ErrorDocument 412 /error/HTTP_PRECONDITION_FAILED.html.var

#    ErrorDocument 413 /error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var

#    ErrorDocument 414 /error/HTTP_REQUEST_URI_TOO_LARGE.html.var

#    ErrorDocument 415 /error/HTTP_UNSUPPORTED_MEDIA_TYPE.html.var

#    ErrorDocument 500 /error/HTTP_INTERNAL_SERVER_ERROR.html.var

#    ErrorDocument 501 /error/HTTP_NOT_IMPLEMENTED.html.var

#    ErrorDocument 502 /error/HTTP_BAD_GATEWAY.html.var

#    ErrorDocument 503 /error/HTTP_SERVICE_UNAVAILABLE.html.var

#    ErrorDocument 506 /error/HTTP_VARIANT_ALSO_VARIES.html.var

</IfModule>

</IfModule>

 

위의 예는 에러 페이지에대한 설정을 하고 있다. 우선 에러가 발생하였을때 보여줄 웹문서의 위치를 Alias하였다. 기본적으로 제공되는 에레메세지는 국제표준적인 에러메세지의 모음이고 내용협상 기능과 SSI 기능을 사용하고 있다. 이때문에 두개의 모듈을 설정하고 그 안에서 에레문서의 디렉토리에 대한 설정을 하고 있다.

 

에레메세지는 가상호트별로 따로 설정할 수도 있는데 많이 사용하는 404 에러메세지를 개성에 맞게 꾸밀 수 있다. ErrorDocument 404 http://자신의 도메인/error.html 과 같은 방식을 이용할 수 있다.

 

BrowserMatch "Mozilla/2" nokeepalive

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

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

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

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

BrowserMatch 지시자는 특정 브라우저들에 대한 특정 수행을 지시하기 위한 설정들이다.

 

  • 첫번째 것은 네스케이프 2.x 또는 그를 흉내내는 브라우저에 대하여 KeepAlive 기능을 쓰지 않도록 한다. 이 브라우저들은 KeepAlive 구현에 문제점을 갖고 있기 때문이다.
  • 두번째 것은 HTTP/1.1을 잘못 구현하였고 301 또는 302 (redirect)반응에 대하여 KeepAlive를 제대로 지원하지 못하는 마이크로소프트 인터넷 익스플로러 4.0b2를 위한 것이다.
  • 세번째 것은 네번째 다섯번째 것들은 기본적인 1.1 반응도 제대로 처리하지 못함으로써 HTTP/1.1 스펙을 위반하고 있는 브라우저에 대하여 HTTP/1.1 반응을 하여 하지 않도록 한다.

BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully

BrowserMatch "MS FrontPage" redirect-carefullyBrowserMatch "^WebDrive" redirect-carefully

BrowserMatch "^WebDAVFS/1.[0123]" redirect-carefully

BrowserMatch "^gnome-vfs/1.0" redirect-carefully

BrowserMatch "^XML Spy" redirect-carefully

BrowserMatch "^Dreamweaver-WebDAV-SCM1" redirect-carefully

 

위 지시자들도 구현에 문제가 있는 것들에 대한 처리방식을 지정한 것이다.

 

#<Location /server-status>

#    SetHandler server-status

#    Order deny,allow

#    Deny from all

#    Allow from .example.com

#</Location>

 

<Location /server-status>

    SetHandler server-status

    Order deny,allow

    Deny from all

    Allow from 192.168.0.0/24

</Location>

 

mod_status를 이용해 서버 상태의 모니터링이 가능하다. http://도메인/server-status와 같이 실행한다. 관리자만이 접속할 수 있도록 서버와 같은 로컬 네트워크에서만 접속할 수 있게 설정했다.

 

아래와 같은 내용이 표기되며 위에서 설정한 ExtendedStatus On 지시자에 의해서 자세한 정보를 제공하고 있다.

#<Location /server-info>

#    SetHandler server-info

#    Order deny,allow

#    Deny from all

#    Allow from .example.com

#</Location>

 

<Location /server-info>

    SetHandler server-info

    Order deny,allow

    Deny from all

    Allow from 192.168.0.0/24

</Location>

 

mod_info 모듈을 사용하여 서버의 설정상태들을 보고 받을 수 있다. 실행방법은 http://도메인/server-info 와 같다. 관리자만이 접속할 수 있도록 서버와 같은 로컬 네트워크에서만 접속할 수 있게 설정했다.

 

#<IfModule mod_proxy.c>

#ProxyRequests On

#

#<Proxy *>

#    Order deny,allow

#    Deny from all

#    Allow from .example.com

#</Proxy>


#ProxyVia On

$\#

#<IfModule mod_disk_cache.c>

#   CacheEnable disk /

#   CacheRoot "/var/cache/mod_proxy"

#</IfModule>

#</IfModule>

 

프록시 서버를 다루는 지시자들이다. 프록시 서버 기능을 작동시키려면 위의 행들의 주석을 제거한다.

 

 

#NameVirtualHost *:80

이름 기반 기상호스트를 사용하겠다고 선언하는 부분이다. 대부분의 가상호스트는 하나의 서버주소 IP에 Servername(도메인이름)을 달리하여 여러개의 가상호스트를 운용한다.

 

*:80 은 :80 80번포트로 들어오는 * (모든 IP요청)에 대하여가상호스트를 수행한다는 것이다. mod_ssl을 이용한 SSL을 사용할 것이라면 포트번호를 :443 과 같이 적용해야 한다. httpd -S 옵션으로 가상호스트 설정에 대한 점검을 할 수 있다.

 

#<VirtualHost *:80>

#    ServerAdmin webmaster@dummy-host.example.com

#    DocumentRoot /www/docs/dummy-host.example.com

#    ServerName dummy-host.example.com

#    ErrorLog logs/dummy-host.example.com-error_log

#    CustomLog logs/dummy-host.example.com-access_log common#

</VirtualHost>

 

<VirtualHost *:80> ~ </VirtualHost>와 같이 가상호스트 구역을 설정하여 사용한다. 가상호스트의 첫번째 구역은 클라이언트가 요청한 ServerName(도메인)을 찾지 못하였을 경우에 보여지게 될 부분을 설정하게 된다.

 

  • ServerAdmin : 해당 가상호스트의 관리자 이메일 주소
  • DocumentRoot : 해당 가상호스트의 홈페이지디렉토리 위치
  • ServerName : 해당 가상호스트의 도메인명
  • ErrorLog : 해당 가상호스트의 웹에러로그 파일 위치
  • CustomLog : 해당 가상호스트의 웹로그파일 위치
반응형

댓글