Apache HTTP Server Version 2.2
이름기반 가상호스트 지원
이 문서는 이름기반 가상호스트를 사용하는 경우와 방법을 설명한다.
이름기반 대 IP기반 가상호스트
IP기반 가상호스트는 연결한 IP 주소를 가지고 서비스할 가상호스트를 결정한다. 그래서 각 호스트는 서로 다른 IP 주소를 가져야 한다. 이름기반 가상호스트의 경우 서버는 클라이언트가 HTTP 헤더로 호스트명을 알려주길 바란다. 이런 방법으로 한 IP 주소로 여러 다른 호스트를 서비스할 수 있다.
이름기반 가상호스트는 DNS 서버가 각 호스트명이 올바른 IP 주소로 대응하도록 가상호스트를 설정하고, 다른 호스트명을 구별할 수 있도록 아파치 웹서버를 설정하기만 하면되므로 더 간단하다. 이름기반 가상호스트는 또 여러 IP 주소가 필요없다. 그러므로 특별히 IP기반 가상호스트를 선택할 이유가 없다면 이름기반 가상호스트를 사용해야 한다. IP기반 가상호스트를 사용해야할 이유로는:
- 이름기반 가상호스트를 지원하지않는 오래된 클라이언트들이 있다. 이름기반 가상호스트를 사용하려면 클라이언트가 HTTP Host 헤더를 보내야 한다. 이는 HTTP/1.1에서는 필수이고, 최근 모든 HTTP/1.0 브라우저들도 확장으로 지원한다. 만약 이름기반 가상호스트를 사용하면서 오래된 클라이언트를 지원해야 한다면 이 문서 끝에 있는 방법을 살펴봐라.
- SSL 프로토콜의 성격상 SSL 보안서버에서 이름기반 가상호스트를 사용할 수 없다.
- 어떤 운영체제나 네트웍 장치는 다른 IP 주소를 사용하지 않으면 호스트를 구별하지 못하는 네트웍 사용량(bandwidth) 관리기술을 사용한다.
이름기반 가상호스트 사용하기
관련된 모듈 | 관련된 지시어 |
---|---|
이름기반 가상호스트를 사용하려면 서버는 연결을 받을
IP 주소를 (아마 포트도) 정해야 한다. 이는 NameVirtualHost
지시어로 가능하다.
일반적으로 서버의 모든 IP 주소를 사용한다면
NameVirtualHost
의
아규먼트로 *
를 사용한다. 여러 포트를 사용할
(예를 들어, SSL을 사용할) 계획이라면 *:80
과
같이 아규먼트에 포트를 추가해야 한다. NameVirtualHost
지시어에 IP 주소를
적어주었다고 서버가 자동으로 그 IP 주소를 기다리지 않음을
주의하라. 자세한 내용은 아파치가
사용할 주소와 포트 설정하기를 참고하라. 또, 여기서
지정한 IP 주소는 서버의 네트웍 인터페이스이어야 한다.
다음 단계는 서비스하려는 호스트별로 <VirtualHost>
블록을
만드는 일이다. <VirtualHost>>
지시어의 아규먼트는
NameVirtualHost
지시어의
아규먼트(예를 들어, IP 주소나 모든 주소를 뜻하는 *
)와
같아야 한다. <VirtualHost>>
블록 안에는
최소한 서비스할 호스트를 지정하는 ServerName
지시어와 호스트의
내용이 파일시스템 어디에 있는지를 지정하는 DocumentRoot
지시어가 필요하다.
주 호스트가 없어진다
기존에 사용하던 웹서버에 가상호스트를 추가한다면
기존에 사용하던 호스트에 대한 <VirtualHost>
블록도 추가해야
한다. 이 블록에 포함하는 ServerName
과 DocumentRoot
는 전체 ServerName
과 DocumentRoot
와 같아야 한다.
설정파일에서 이 가상호스트를 가장 먼저 적으면 기본 호스트가
된다.
예를 들어 www.domain.tld
도메인을 서비스하고
있었는데 같은 IP 주소에
www.otherdomain.tld
란 가상호스트를 추가하고
싶다고 가정하자. httpd.conf
에 다음과 같이
추가하면 된다:
NameVirtualHost *:80
<VirtualHost *:80>
ServerName www.domain.tld
ServerAlias domain.tld *.domain.tld
DocumentRoot /www/domain
</VirtualHost>
<VirtualHost *:80>
ServerName www.otherdomain.tld
DocumentRoot /www/otherdomain
</VirtualHost>
NameVirtualHost
와
<VirtualHost>
지시어 둘 모두 *
대신 직접 IP 주소를 지정할
수도 있다. 예를 들어, 이런식으로 한 IP 주소에 여러 이름기반
가상호스트들을 돌리고, 다른 주소에 IP기반 혹은 이름기반
가상호스트들을 돌릴 수 있다.
어떤 서버는 여러 이름으로 접속할 수 있길 바란다. 이는
<VirtualHost>
섹션 안에 ServerAlias
지시어를 사용하여 가능하다. 예를 들어 위의 첫번째 <VirtualHost>
블록에서
ServerAlias
지시어를
사용하면 열거한 이름으로 같은 웹사이트를 볼 수 있다:
ServerAlias domain.tld *.domain.tld
domain.tld
도메인에 있는 모든 호스트에 대한
요청을 www.domain.tld
가상호스트가 서비스한다.
이름을 줄때 와일드카드 문자 *
와 ?
를
사용할 수 있다. 물론 ServerName
이나 ServerAlias
에
이름을 적어주었다고 끝이 아니다. 먼저 이 이름들이 서버의
IP 주소로 대응하도록 DNS 서버를 알맞게 설정해야 한다.
마지막으로 <<VirtualHost>>
안에 다른
지시어들을 사용하여 가상호스트를 자세히 설정할 수 있다.
대부분의 지시어를 사용할 수 있으며, 관련된 가상호스트의 설정만을
변경한다. 어떤 지시어가 사용가능한지 알려면 지시어의 사용장소를
확인하라. (<<VirtualHost>>
안이 아닌)
주서버설정에서 지정한 설정 지시어는 가상호스트에
같은 설정 지시어가 없는 경우에만 사용된다.
요청을 받으면 서버는 먼저 NameVirtualHost
에서 지정한 IP
주소인지 검사한다. 그렇다면 그 IP 주소를 가진 <VirtualHost>
섹션들에서 요청한 호스트명과 일치하는 ServerName
이나
ServerAlias
를 찾는다. 찾으면 그 설정을 사용한다.
적절한 가상호스트를 찾지못하면, IP 주소에 해당하는
가상호스트들중 첫번째 것을 사용한다.
결과적으로 처음에 나온 가상호스트가 기본
가상호스트가 된다. IP 주소가 NameVirtualHost
지시어에 해당하면,
주서버의 DocumentRoot
는
절대로 사용하지 않는다. 특정 가상호스트에
해당하지않는 요청을 설정하려면 설정을 <VirtualHost>
에 담고 설정파일에서
먼저 나오도록 하면 된다.
오래된 브라우저와 호환
이미 적었듯이 이름기반 가상호스트가 올바로 동작하기위해 필요한 정보를 보내지않는 클라이언트가 있다. 이런 클라이언트는 항상 요청한 IP 주소에 대해 첫번째로 나오는 가상호스트 (최초의 이름기반 가상호스트)가 서비스한다.
얼마나 오래된 것을 말하는가?
여기서 오래되었음은 실제로 상당히 오래된 것을 뜻한다.
오늘날 이런 브라우저를 사용할 일은 거의없다. 요즘
브라우저는 모두 이름기반 가상호스트에 필요한 Host
헤더를 보낸다.
이 문제는 약간 거추장스럽지만 ServerPath
지시어로 해결할 수 있다:
설정 예:
NameVirtualHost 111.22.33.44
<VirtualHost 111.22.33.44>
ServerName www.domain.tld
ServerPath /domain
DocumentRoot /web/domain
</VirtualHost>
이게 무슨 뜻인가? "/domain
"로 시작하는
URI에 대한 요청은 가상호스트 www.domain.tld
가
서비스한다. 즉, Host:
헤더를 보내는 클라이언트는
http://www.domain.tld/
만으로도 접근할 수 있지만,
http://www.domain.tld/domain/
으로는 모든
클라이언트가 페이지에 접근할 수 있다.
이를 위해 최초의 가상호스트에 있는 페이지에
http://www.domain.tld/domain/
으로 가는 링크를
넣는다. 그리고 가상호스트 페이지에서는 상대링크 (예를 들어,
"file.html
" 이나 "../icons/image.gif
")
혹은 ("http://www.domain.tld/domain/misc/file.html
"이나
"/domain/misc/file.html
"과 같이) 앞에
/domain/
이 붙은 링크만을 사용한다.
조금 규칙이 필요하지만 이 규칙을 따르면 대부분의 경우 요즘 것이나 오래된 것이나 관계없이 모든 브라우저로 페이지를 볼 수 있다.