Apache HTTPD for Windows

httpd.conf

개요

 Apache의 기본이자 핵심적인 설정 파일이다. Apache의 대부분 핵심 기능을 여기에서 설정한다. 초기 설정값 또한 그대로 사용하기에 별 무리가 없어 처음에는 조금만 수정해서 사용해도 될 만큼 일반적이다. 이 문서에서는 자주 사용되는 설정들을 몇 가지 소개한다.

ServerRoot

Define SRVROOT "c:/Apache24"
ServerRoot "${SRVROOT}"

 Apache의 설치 경로에 대한 문자열을 SRVROOT 변수에 저장하고 이를 ServerRoot 설정에 대입한다. ServerRoot 지시자는 Apache 서버가 설치된 디렉터리 경로를 지정하기 위한 지시자이다. 더 정확히 말하자면 conf 및 logs 디렉터리의 위치를 찾기 위해 사용한다.

 이제 모든 Apache 설정 파일에서 Apache 설치 디렉터리를 가리킬 때는 SRVROOT를 사용하면 된다. 실제 사용할 때는 ${SRVROOT}로 기입한다.

 중복되는 값들은 이렇게 변수로 선언하여 할당하는 방법을 권장한다. 디렉터리 경로 등...

Listen

Listen 80

 Apache가 가동되는 동안 수신할 포트 번호를 지정한다. 여러 포트 번호를 수신하려면 Listen 지시자를 여러번 선언한다.

Listen 80
Listen 8000
Listen 8080

 응용하여, 80 포트는 모든 IP에서 접속하도록 하고 8080은 특정 IP로만 접속되게 하려면 'Listen 123.123.123.123:8080'과 같이 포트 번호 앞에 IP 주소를 지정한다. 그 뒤 서버를 재시작하면 localhost:8080은 접속이 안된다.

 TLS(SSL)를 지원하기 위한 443 포트는 httpd-ssl.conf 파일에서 따로 설정한다.

 Apache 서비스를 설치할 때 Windows 방화벽에서 httpd.exe에 대한 모든 포트 번호를 인바운드하고 있으므로 방화벽 관련 설정은 하지 않아도 된다.

LoadModule

LoadModule {modname} *.*

 Apache와 호환되는 모듈을 로드하는 지시자이다. 다음은 SSL을 지원하기 위해 사용하는 구문이다.

LoadModule ssl_module modules/mod_ssl.so

 대부분 *.so 확장자를 가지는데 모든 모듈이 그렇지만은 않다.

Include

Include *.conf

 Apache는 설정 파일을 분산시켜 저장하여 필요한 설정 파일만 로드할 수 있다. 이때 Include 지시자를 사용한다. 다음은 SSL을 지원하기 위해 필요한 설정 파일을 포함시킨다.

Include conf/extra/httpd-ssl.conf

Main Server Configuration

# 'Main' server configuration

 이 라인 이후부터 작성된 설정들은 메인 서버 설정이다. 또한 가상 호스트를 생성할 때 이 메인 서버 설정들이 각 가상호스트의 기본값으로 상속된다.

ServerAdmin

ServerAdmin webmaster@dummy-host2.example.com

 주로 서버 내부 오류(500)가 발생했을 때 띄우는 안내문에 출력될 서버 관리자 연락처이다. 주로 메일 주소를 적는다.

ServerName

ServerName example.com

 기본적으로 주석 처리되어 있다. 주석을 해제하고 명시적으로 지정하는 것을 권장한다. 서버를 식별하기 위한 호스트 이름을 지정한다. 등록된 도메인이 없다면 IP 주소를 대신 적을 수도 있다.

DocumentRoot

DocumentRoot "${SRVROOT}/htdocs"

 웹 페이지의 루트를 지정하는 지시자다. 경우에 따라 여러 가상 호스트로 구성된 웹 서버에서는 htdocs 밑에 각 웹 사이트 마다 루트 폴더를 두고 DocumentRoot가 그 곳을 가리킨다. 다시 말해 각 웹 사이트마다 루트 디렉터리를 지정하는 지시자이다.

# At Main Server Configuration
DocumentRoot "${SRVROOT}/htdocs/root"
# In Virtual Host Directive
DocumentRoot "${SRVROOT}/htdocs/www"

 DocumentRoot 라인 이후에 <Directory> 블록 지시자가 작성된다.

 블록 지시자는 HTML 태그처럼 여는 태그와 닫는 태그로 범위를 지니고 있으며, 그 범위 안에서 효력을 발휘한다. 대표적으로 <Directory> 블록 지시자가 있다. 블록 지시자의 문법은 다음과 같다.

<directive option0 option1 option2 ... optionn>
    ...
</directive>

Directory

<Directory {디렉터리 명}>
    ...
</Directory>

 각 디렉터리에 고유한 설정을 적용하기 위한 블록이다. 이 때 인수로 지정되는 {디렉터리 명}은 웹 서버의 가상 디렉터리가 아니라 서버 자체 실제 디렉터리의 절대 경로다.

 또한 <Directory> 지시자를 적용하면 별도의 <Directory> 지시자를 사용하지 않는 한 그 이하의 서브 디렉터리들도 모두 이 지시자의 속성을 상속받는다. 마치 NTFS의 권한이 하위 폴더로 상속되는 과정과 비슷하다. 다음은 httpd.conf의 메인 서버 설정에 있는 최상위 <Directory> 지시자다.

<Directory />
    AllowOverride none
    Require all denied
</Directory>

 웹 서버의 파일 시스템 루트(/)에 대한 설정이다. (DocumentRoot 및 ServerRoot 이하의 위치가 아니라 C:\임을 명심하라.) 또한 경로는 와일드카드 및 정규표현식을 지원한다. 아직 언급하지 않은 AllowOverride와 Require all denied가 나오는데 미리 설명하자면 이는 클라이언트가 기본적으로 웹 서버의 최상위 경로부터 모든 하위 경로까지 액세스를 금지한다는 뜻이다. 그리고 httpd.conf 밑에 보면 또 다른 <Directory> 지시자가 나오는데 htdocs 폴더에 액세스 권한을 부여하고 있다(Requre all granted). 즉, Apache는 일단 모든 디렉터리의 액세스를 금지시키고 서비스를 제공할 디렉터리만 새로 설정하여 허용시키는, 선금지 후허용 원칙을 기본 설정값으로 하고 있다. 다음 예를 보자.

<Directory "${SRVROOT}/htdocs">
    Options FllowSymLink
    AllowOverride All
    Require all granted
</Directory>

 블록 지시자 내에는 디렉터리가 갖는 권한, 보안 등에 관련된 별도의 지시자들이 포함될 수 있다. 여기서 가장 중요한 것이 바로 Options인데 이 지시자는 이 디렉터리가 어떤 용도로 사용되는지를 정의한다.

Options

Options opt0 opt1 opt2 ... optn

Options 뒤에는 필요한 옵션을 공백 구분하여 작성해주면 된다. Options는 다음과 같은 인자가 올 수 있다.

  • FllowSymLinks: 이 디렉터리 내에서 심볼릭 링크를 가능하게 한다.
  • Indexes: 디렉터리 경로가 요청되고 DirectoryIndex에 맞는 파일이 없으면 해당 디렉터리의 목록을 출력한다.
  • Includes: SSI(Server Side Include)를 허용한다.
  • IncludesNOEXEC: SSI는 가능하나 SSI 내에서의 CGI는 불가
  • ExecCGI: CGI 가능, 자세한 내용은 후술
  • All: MultiViews 옵션을 제외한 모든 옵션을 적용한다.
  • None: 어떠한 옵션도 적용하지 않는다.

 더 자세한 Options 지시자 옵션은 Apache 기술문서를 참조한다.

AllowOverride

 디렉터리의 설정 내용을 별도의 외부 파일(.htaccess)에서 재설정 또는 덮어쓸 수 있는지 여부를 결정한다. httpd.conf 설정이 무시되고 외부 파일의 내용이 적용된다. 보안 및 성능상의 이유로 None으로 설정하고 <Directory> 블록에 직접 작성하는 방법이 권장된다. WordPress 등의 플랫폼에서는 .htaccess 파일이 기본적으로 사용되기도 한다.

Alias

 웹 서버 상의 경로와 URL 상의 경로를 연결하는 작업을 매핑(Mapping)이라 한다. 매핑에 사용되는 지시자가 Alias이다. 다음 모듈이 로드되었기에 사용될 수 있다.

LoadModule alias_module modules/mod_alias.so

 Alias 지시자는 DocumentRoot 지시자에 의해 지정된 경로가 아닌 곳을 매핑할 때 사용한다. 다음은 C:\ 디렉터리의 목록을 웹 서버 상에서 볼 수 있게 한다. 그러나 이러한 지시자를 너무 많이 사용하면 서버 유지보수가 힘들어진다.

 Alias의 URL 경로(첫번째 인수)는 끝에 슬래쉬(/)를 붙히지 않는 것을 권장한다.
Alias /filesystem "C:/"
<Directory "C:/">
    Options Indexes
    Require all granted
</Directory>
 최상단 <Directory> 지시자에 의해 기본적으로 파일 시스템 액세스 권한이 없으므로 Alias 하단에 <Directory> 지시자를 추가해 액세스를 허용시켜야 한다.

 물론 서버의 파일 시스템 루트를 대상으로 매핑하는 행위는 웹 서버가 할 수 있는 가장 위험한 설정이다.

  정규표현식을 적용하려면 AliasMatch 지시자를 사용한다.

Redirect

 URL을 다른 URL로 리다이렉트 시킨다. 클라이언트는 새로운 URL을 돌려받고 그 주소로 다시 접속을 시도한다.

Redirect [status] url-path new-url
Redirect /service http://example.com/here

 localhost/service/index.html로 접속할 시 http://example.com/here로 이동한다. 위치에 관계없이 Alias나 ScriptAlias보다 우선권을 가진다. status는 이 리다이렉션의 상태를 클라이언트에게 전달하기 위한 인자이며 생략하면 temp가 지정되어 임시 이동으로 판단한다. status의 인자는 다음과 같다.

  • permanent: 영구적으로 리소스가 이동했다.
  • temp: 임시적으로 이동했다.
  • seeother: 요청한 리소스는 교체되어서 다른 것으로 바뀌었다.
  • gone: 요청한 리소스는 삭제됬다.

 이 설정들은 검색 엔진 최적화(SEO)에도 영향을 미친다. 웹 브라우저의 주소 표시줄 또한 새로운 URL로 변경된다.

 정규표현식을 적용하려면 RedirectMatch 지시자를 사용한다.

 Redirect는 클라이언트가 새로운 위치를 인식하는 반면 Alias는 그렇지 못하다.

Rewrite

 Rewrite 지시자는 재작성 패턴(Rewriting-pattern)을 통해 URL을 생성한다. 재작성 패턴은 정규표현식을 통해 정의된다. 이 지시자의 활용 범위는 상당히 넓어서 모든 사례들을 짚어보기 힘들다.

 다음 모듈을 활성화한다.

LoadModule rewrite_module modules/mod_rewrite.so

RewriteEngine

RewriteEngine on|off

 재작성 엔진의 사용 여부를 결정한다. RewriteRule을 주석/해제하는 대신 이 지시자를 사용하면 간단하게 재작성 패턴 적용 여부를 설정할 수 있다.

RewriteCond

 재작성 패턴을 정의하기 위해 한 개 이상의 RewriteCond 조건을 지정할 수 있다. RewriteRule 지시자 전까지만 적용된다.

RewriteCond testString conditionPattern

 testString에는 주로 서버 변수가 온다.

RewriteRule

RewriteRule pattern substitution

프록시 서버(Proxy server)

 다음 모듈을 활성화 한다.

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

ProxyRequests

 프록시 서비스의 활성화 여부를 지정한다. ProxyRequests가 off로 설정되어도 ProxyPass는 유효하다.

ProxyRemote

ProxyRemote match remoteServer

 현재 프록시에 대한 원격지 프록시 서버를 지정한다. 와일드카드(*)를 지정하면 해당 서버가 모든 요청에 대해 프록시 서비스를 수행한다.

ProxyPass

ProxyPass path URL

  특정 경로 및 그 하위 경로에 대한 요청을 프록시 서버로 중계한다. 다음은 /remote 요청을 http://example.com으로 중계한다.

ProxyPass /remote http://example.com

ProxyPassReverse

 리버스 프록시는 여러 서버로 서비스 부하를 분한시킬 수 있는 방법이다. 하나의 서버가 모든 요청을 받아들인 후 서버 뒷 단에 있는 여러 서버 중 하나에게 그 요청을 넘기기만 한다. mod_rewrite 모듈이 이 기능을 지원한다. 이 지시자는 응답 헤더의 Location을 Apache가 임의의 URL로 변경할 수 있게 한다. mod_rewrite 또는 ProxyPass에 의해 리버스 프록시 서비스를 구성했다면 이 지시자를 통해 리버스 프록시로부터 반환된 응답의 Location 헤더를 재작성하므로써 다시 클라이언트에게 전달한다.

DirectoryIndex

<IfModule dir_module>
    DirectoryIndex index.html index.php ...
</IfModule>

 URL에서 파일명을 생략했을 때(example.com/index.html이 아닌 example.com으로 접속할 때) 웹 서버가 기본적으로 찾게 되는 파일이다. 관례상 index.* 파일이 기본값인 경우가 많다. 첫번째 인수에 지정된 파일이 없으면 두번째 인수를 찾는 식으로 넘어가고 마지막 인수의 파일명까지 찾지 못하면 404 오류를 응답한다. 보다시피 <IfModule> 블록으로 감싸져있는데 예상하다시피 'dir_module이 로드된 상태라면'의 의미다.

IndexIgnore

 Index에서 생략하고자 하는 파일 목록이나 와일드카드 패턴을 지정한다. 디렉터리 또한 가능하다.

IndexIgnore *.html sub

 *.html 파일이나 sub 파일 또는 폴더는 Index에서 보이지 않는다. 단, *.html을 지정해도 DirectoryIndex index.html 인 경우 Index 목록이 출력되지 않고 index.html이 렌더링된다.

 본 결과가 출력되기 위해선 물론 Options Indexes 설정도 해 주어야 한다. 기타 인덱스 페이지를 꾸미는 다양한 옵션들은 Apache 기술문서를 참조하라.

ErrorDocument

 오류 페이지를 출력할 때 사용자 정의 페이지를 보여주기 위해선 이 지시자를 사용한다.

ErrorDocument 500 http://naver.com
ErrorDocument 404 /file-not-found.html
ErrorDocument 403 "<h1>Not Allowed</h1>"

댓글

댓글 본문
  1. LIM HYUN SEOK
    인덱스 뷰가 무엇을 가리키는 지 잘 모르겠습니다. 상황을 더 구체적으로 말씀해주세요~
    대화보기
    • 김코딩
      itwork는 뜨는데 인덱스 뷰가 안되네요 .. 404 not found 가 뜹니다 ...