버추얼 호스트 관련하여.. 한개; :_My works_:

Name-based vs. IP-based virtual hosts

Name-based 방식의 Virtual hosts 방법을 소개하고자 한다.

요즘들어서 리눅스를 사용하는 인구가 급격히 늘고 있다. 또한 많은 기업들은 리눅스를 이용하여 웹호스팅 사업을 벌리고 있다. 그러나 기업에게 할당되는 IP 는 제한적이며 몇백개의 웹호스팅 을 운영하고 있다면, 실제로 아주 많은 IP 주소들이 필요할 것이다. 이럴때 사용할수 있는 방법이 name-based 의 가상호스트 방법이다.
현재 가상호스트로 흔히 사용하는 방법이 IP-based 의 가상호스트 방법이다. 그러나 이 방법이 가장 좋은 방법만은 아니다. 왜냐하면 같은 머신안의 모든 가상호스트에 고정된 IP 를 하나씩 할당하여야 하기 때문이다. 이렇다면 웹호스팅 업체들은 IP 부족및 File De***or 의 부족을 호소할 것이다. 이러한 문제를 해결하기 위한 방법이 HTTP/1.1 프로토콜을 이용하는 방법이다.
아파치 1.1 이상에서는 전통적인 IP 어드레스당 한 호스트를 매칭하는 방법뿐만 아니라 name based 의 방법을 제공한다.

새로운 name-based 가상호스트를 이용하여 간단한 환경설정 만으로 사실상 무제한적인 가상호스트 서비스가 가능하다. 또한 추가적인 하드웨어 및 소프트웨어가 전혀 필요치 않다.
name-based 가상호스트의 가장 큰 단점이라면 클라이언트가 HTTP/1.1 프로토콜을 지원해야만 한다는 것이다. 대부분의 최신 브라우저는 이 프로토콜을 지원한다. 그러나 아직 누가 오래된 브라우저를 사용하는지는 모르지만 분명히 사용하는 사람은 있을 것이다. :-) 이러한 문제를 해결하기 위하여 몇가지 해결책을 제시해 본다. 비록 몇가지 해결책을 제공해 준다 하지만 이러한 문제는 언제든지 발생할 수 있다.

1. IP 방식이 아닌 name-based 의 가상호스트 사용하기

새로운 가상호스트를 이용하기 위한 방법은 아주 쉽다. 그리고 이것은 외관상으로는 ip-based 방법처럼 보이기도 한다. IP-based 와 name-based 가상호스트의 특별히 다른점은 가상호스트 설정에 어떤 IP 주소가 name-based 를 사용할 것인지를 나타내어 주는 NameVirtualHost 가 포함되어 있다는 점이다.

예를 들면, www.domain.net 와 www.otherdomain.net 이 같은 IP 주소인 111.22.33.44 를 가르킨다고 하자. 이때 아파치 설정파일중의 하나(httpd.conf 또는 srm.conf) 에 간단히 다음과 같이 추가해 주기만 하면 된다.

NameVirtualHost 111.22.33.44

<VirtualHost 111.22.33.44>
ServerName www.domain.net
DocumentRoot /www/domain
</VirtualHost>

<VirtualHost 111.22.33.44>
ServerName www.otherdomain.net
DocumentRoot /www/otherdomain
</VirtualHost>

물론, <VirtualHost> 섹션안에는 추가적인 지시항목이 위치할 수 있다. 이 작업을 하기위해서는 www.domain.net 와 www.otherdomain.net 이 확실히 111.22.33.44 IP 주소를 가지고 있어야만 한다.
(다른 말로는 DNS 에서 같은 IP 주소를 가지고 있어야 한다는 뜻이다)

NameVirtualHost 지시자의 특정 IP 주소에 요청이 들어올 경우 <VirtualHost> 에 매칭되는 IP 어드레스만이 이용될 것이다. 만약 virtual hosts 로서 사용하려 한다면 독립적으로 작동하는 메인서버의 사용을 중지해야 할 것이며, 모든 virtual hosts 설정안에 특정 IP 주소를 사용한다는 것을 지시해야만 한다. 다시 말하면, 여러분의 서버에서 계속 유지되기를 원하는 모든 서버(호스트네임)는 <VirtualHost> 섹션을 추가해야만 한다는 것이다.

조금더 알아보자, 많은 서버들이 하나 이상의 이름으로 엑세스 할수 있었으면 한다. 예를들자면, 위에서 예로 들은 www.domain.net 은 domain.net 또는 www2.domain.net 으로 엑세스 되기를 바랄지도 모른다.
또는 domain.net 의 모든 호스트네임으로 접속을 원할지도 모른다. 이러한 것들은 ServerAlias 를 <VirtualHost> 섹션안에 위치하는 것으로 해결이 가능하다. 다음과 같이:

ServerAlias domain.net *.domain.net
(와일드 카드 문자인 * 및 ? 를 사용할 수 있다.)

도메인 네임이 너무 길고, 입력하기 귀챦다고 생각하는 로컬 사용자라면 ServerAlias 기능이 매우 유용할 것이다. 예를 들어, 흔히 "www" 또는 "www.foobar" 라고 치는 로컬 사용자가 있다면 ServerAlias www www.foobar 추가가 필요할 것이다. 서버는 클라이언트가 사용하는 이름이 어떤 도메인 인지 알지못한다. 왜냐하면 클라이언트는 요청에 이러한 정보들을 제공하지 않기 때문이다.

name-based 의 가상호스트를 제대로 이용하기 위해서는 클라이언트의 브라우저가 HTTP/1.1 프로토콜을 지원해야 한다. 그러나 name-based 의 가상호스트가 작동하기 위해 필요한 데이터를 보내지 않는 브라우저를 아직까지 사용하는 사용자는 있다. 이 뜻은 사용자가 접속하였을때 클라이언트는 항상 처음에 설정된 name-based 의 가상호스트 내용만 보게 된다는 것이다. (오래된 브라우저를 사용하는 유저)

그리하여 다음은 ServerPath 를 이용 하여 피해를 최소하 하고자 하는 방법을 적어본 것이다. (약간 번거롭기는 하지만) ^^;

설정예제:

NameVirtualHost 111.22.33.44

<VirtualHost 111.22.33.44>
ServerName www.domain.net
ServerPath /domain
DocumentRoot /web/domain
</VirtualHost>

이것이 의미하는 바는 무엇일까 ? "/domain" 으로 시작하는 URI에 대한 모든 요구사항은 가상의 호스트 www.domain.net 이 주관하게 된다.
비록 클라이언트가 http://www.domain.net 의 헤더정보를 보낸다 하여도 엑세스 하고자 하는 페이지는 http://www.domain.net/domain 으로 엑세스 하게 된다.

자세히 알아보자 !!

NameVirtualHost 111.22.33.44

<VirtualHost 111.22.33.44>
# primary vhost
DocumentRoot /www/subdomain
RewriteEngine On
RewriteRule ^/.* /www/subdomain/index.html
...
</VirtualHost>

<VirtualHost 111.22.33.44>
DocumentRoot /www/subdomain/sub1
ServerName www.sub1.domain.tld
ServerPath /sub1/
RewriteEngine On
RewriteRule ^(/sub1/.*) /www/subdomain$1
...
</VirtualHost>

<VirtualHost 111.22.33.44>
DocumentRoot /www/subdomain/sub2
ServerName www.sub2.domain.tld
ServerPath /sub2/
RewriteEngine On
RewriteRule ^(/sub2/.*) /www/subdomain$1
...
</VirtualHost>

ServerPath 를 이용하였기 때문에 sub1 에 대한 가상호스트는 http://www.sub1.domain.tld/sub1 으로 요청하게 된다. 클라이언트가 http://www.sub1.domain.tld 를 요청하였더라도 /sub1 에서 정보를 가져올 것이며 만약 오래된 브라우저를 사용하는 유저라면 HTTP/1.1 을 지원하지 않기 때문에 primary host 에서 정보를 가져오게 된다.
각 virtual host 섹션에서 Rewrite 모듈을 사용하였는데, 처음 프라이머리 호스트로 오는 모든 요청은 index.html 만이 출력되어 지게 되어 있으며, 나머지 섹션에는 원래의 DocumentRoot 에 설정되어진 디렉토리로 설정되어져 있다. 좀더 자세히 말하자면, 사용자가 www.sub2.domain.tld 를 요청하면 ServerPath 에 의해 /sub2 로 넘어 가고 또 RewriteRule 에 의해 결국은 원래 DocumentRoot 에 설정되어져 있는 디렉토리로 넘어간다는 것이다. ^(/sub2/.*) /www/subdomain/sub2 가 된다.
Rewrite 모듈을 사용함으로써 클라이언트가 확실히 접속할 수 있도록 해주고 있다. 물론 HTTP/1.1 을 지원하지 않는 브라우저는 primary 호스트의 index.html 을 읽어들여 접속하고자 하는 페이지를 클릭하여 접속할수 있다. (index.html 에 각 가상호스트의 링크가 걸려져 있으며, 다음과 같은 메세지를 뿌려준다.... " 지금 이 페이지를 보셨다면 귀하의 브라우저는 HTTP/1.1 을 지원하지 않는 브라우저 입니다. 최신버전의 브라우저를 사용하시어 접속하시기를 바랍니다" ^^;

이로서 name-based 의 가상호스트 방법에 대하여 알아보았다. 물론 이러한 작업들이 추가되어진다는 것은 여간 번거로운 작업이 아니다. 그러나 이러한 작업들이 최신 브라우저 또는 오래된 브라우저에서도 확실하게 홈페이지에 접속할 수 있는 방법이다.

덧글

댓글 입력 영역