이 문서는 자주 문의되는 가상호스트 질문에 답을 하려고 쓰여졌다. 상황은 이름기반이나 IP기반 가상호스트를 통해 한 서버에서 여러 웹사이트를 서비스하려는 경우이다. 한 프록시 서버 뒤에서 여러 서버를 사용하여 사이트를 운영하는 경우를 다룬 문서도 곧 나올 것이다.
서버에 IP 주소가 한개 있고, DNS에서 여러 주소(CNAMES)가
이 컴퓨터를 가리킨다. 이 컴퓨터에서 www.example.com과
www.example.org의 웹서버를 실행하고 싶다.
아파치 서버에 가상호스트 설정을
한다고 그 호스트명에 대한 DNS 항목이 자동이로 생성되지
않는다. 반드시 DNS에 IP 주소를 가리키는
이름이 있어야 한다. 안그러면 아무도 웹사이트를 볼
수 없다. 검사해보기 위해 hosts 파일에 항목을
추가할 수 있지만, 이는 hosts 항목을 가진 컴퓨터에만
반영된다.
별표는 모든 주소를 가리키므로, 주서버는 어떤 요청도
서비스하지 않는다. www.example.com이
설정파일에 처음으로 나오므로 가장 높은 우선순위를 가지며,
기본혹은 초기 서버가 된다.
어떤 ServerName 지시어에도 해당되지않는 요청은
첫번째 VirtualHost가 서비스한다.
원한다면 * 대신 시스템의 실제 IP
주소를 사용할 수 있다. 이 경우
VirtualHost의 아규먼트는
NameVirtualHost의 아규먼트와 일치해야
한다:
그러나 ISP에서 동적으로 IP 주소를 가져오는 등
IP 주소를 모르는 경우에는 *를 사용하는
것이 유용하다. *는 모든 IP 주소에
해당하므로, IP 주소가 변경되어도 설정을 변경할
필요가 없다.
거의 대부분의 이름기반 가상호스트 설정은 위와 같다. 예외는 다른 IP 주소나 포트로 다른 내용을 서비스하려는 경우이다.
여기서 설명한 방법은 IP 주소가 몇개라도 적용가능하다.
서버는 IP 주소가 두개있다. 하나에서
(172.20.30.40) "주" 서버
server.domain.com을 서비스하고, 다른 하나에서
(172.20.30.50) 여러 가상호스트를 서비스할
것이다.
172.20.30.50이 아닌 주소에 대한 요청은
주서버가 서비스한다. 호스트명 없이, 즉 Host:
헤더없이 172.20.30.50로 요청하면
www.example.com이 서비스한다.
서버 컴퓨터에 IP 주소가 두개 (192.168.1.1과
172.20.30.40) 있다. 컴퓨터는 내부 (인트라넷)
네트웍과 외부 (인터넷) 네트웍 사이에 위치한다. 네트웍 밖에서
server.example.com은 외부 주소를
(172.20.30.40) 의미하고, 네트웍 내부에서 같은
이름을 내부 주소로 (192.168.1.1) 사용한다.
서버는 VirtualHost 섹션 한개로 내부와 외부
응답에 같은 내용을 서비스할 수 있다.
이제 두 네트웍에서 들어온 요청을 같은
VirtualHost에서 서비스한다.
내부 네트웍에서는 완전한 호스트명
server.example.com 대신 이름
server도 가능하다.
또한 위의 예에서 IP 주소 대신 *을
사용하여 서버가 모든 주소에 동일하게 동작할 수
있다.
같은 IP의 여러 포트에서 서로 다른 도메인을 서비스한다고 가정하자. 이는 "NameVirtualHost" 태그에 포트를 정의하면 가능하다. NameVirtualHost name:port없이 <VirtualHost name:port>만 혹은 Listen 지시어만 사용하면 안된다.
서버는 각각 www.example.com과
www.example.org에 해당하는 두 IP 주소를
(172.20.30.40과 172.20.30.50)
가진다.
<VirtualHost> 지시어로 지정한 주소에
해당하지않는 주소로 (예를 들어, localhost)
요청이 들어오면 주서버가 있는 경우 주서버가 서비스한다.
서버는 각각 www.example.com과
www.example.org에 해당하는 두 IP 주소를
(172.20.30.40과 172.20.30.50)
가진다. 각 IP의 80번과 8080번 포트에 가상호스트를 돌린다.
주소중 몇몇은 이름기반 가상호스트로, 다른 것은 IP기반 가상호스트로 서비스하고 싶다.
_default_ 가상호스트
사용하기_default_ 가상호스트어떤 가상호스트에도 해당하지않은 IP 주소와 포트에 대한 모든 요청을 처리하기.
default(기본) 가상호스트의 포트로 와일드카드를 사용하여 어떤 요청도 주서버로 못가도록 만든다.
default 가상호스트는 절대로 이름기반 가상호스트가 사용하는
주소/포트로의 요청을 서비스하지 않는다. 알 수 없거나
Host: 헤더가 생략된 요청은 항상 최초의 이름기반
가상호스트(설정파일에서
주소/포트가 처음으로 나온 가상호스트)가 서비스한다.
_default_ 가상호스트위의 경우와 같지만, 서버는 여러 포트를 기다리고 80번
포트에 대해서 추가로 _default_ 가상호스트를
사용하고 싶다.
80번 포트에 대한 default 가상호스트는 (반드시 와일드카드 포트를 가진 기본 가상호스트 이전에 나와야 한다) 지정하지않은 IP 주소로 보내진 모든 요청을 서비스한다. 주서버는 절대로 요청을 서비스하지 못한다.
_default_ 가상호스트80번 포트에 대해서만 default 가상호스트를 만들고 싶다.
포트 80번에 지정하지않은 주소에 대한 요청은 기본 가상호스트가 서비스하고, 다른 지정하지않은 주소와 포트를 가진 요청은 주 서버가 서비스한다.
(이름기반의 첫번째 예에서) 호스트명
www.example.org에 대한 이름기반 가상호스트는
자신의 IP 주소를 가져야 한다. 이름기반 가상호스트의 이전
IP 주소를 캐싱하는 네임서버나 프록시와의 문제를 피하기위해
옮기는 동안 둘 모두를 서비스하고 싶다.
방법은 VirtualHost 지시어에 새 IP 주소만을
(172.20.30.50) 추가하면되므로 쉽다.
이제 (IP기반 가상호스트를 통한) 새로운 주소와 (이름기반 가상호스트를 통한) 이전 주소 모두 가상호스트에 접근할 수 있다.
ServerPath
지시어 사용하기두 이름기반 가상호스트를 가진 서버가 있다. 올바른
가상호스트를 선택하기위해 클라이언트는 올바른
Host: 헤더를 보내야 한다. 오래된 HTTP/1.0
클라이언트가 이 헤더를 보내지 못하면 아파치는 클라이언트가
어떤 가상호스트를 보려고하는지 알 수 없다 (그래서 최초의
가상호스트가 요청을 서비스한다). 오래된 브라우저와 가능한 호환을
유지하기위해 최초의 가상호스트를 만들고, 여기에 이름기반
가상호스트의 URL 접두사를 포함하는 링크 목록 페이지를
둔다.
http://www.sub1.domain.tld/sub1/에 대한
요청은 항상 subl-가상호스트가 서비스한다.
클라이언트가 올바른 Host: 헤더를 보낸다면,
URL http://www.sub1.domain.tld/에 대한 요청은
subl-가상호스트에서만 서비스한다. 만약 Host: 헤더를
보내지않으면 클라이언트는 최초의 호스트에 있는 정보페이지를
보게된다.
여기에 문제가 있음을 주의하라: 클라이언트가
Host: 헤더를 보내지않으면
http://www.sub2.domain.tld/sub1/에 대한 요청도
subl-가상호스트가 서비스한다.
Host: 헤더를 보내는
클라이언트는 (예를 들어, URL 전치사가 있거나 없는)
두 URL을 모두 사용할 수 있다.