가상 호스트
본 장에서는 가상 호스트의 사용 목적, 규칙 및 설정 방법 등에 대해 설명한다.
1. 개요
가상 호스트는 인터넷 도메인 이름을 기준으로 같은 URL로 서로 다른 웹 애플리케이션에 매핑할 수 있도록 한다. 즉, 2개 이상의 도메인 이름(예: “www1.foo.com” and “www2.foo.com”)을 하나의 웹 엔진에 설정하여 서로 다른 웹 컨텍스트를 서비스할 수 있다.
웹 엔진 관점에서 웹 컨텍스트는 웹 애플리케이션과 동일한 의미이다. |
2. 웹 엔진과 가상 호스트
본 절에서는 가상 호스트의 사용 목적, 규칙, ServletContext 객체와 가상 호스트의 관계에 대해 설명한다.
사용 목적
가상 호스트에 매핑된 도메인 이름을 기준으로, 같은 URL로 서로 다른 웹 애플리케이션에 매핑할 수 있다. 따라서 서비스 제공자는 하나의 웹 엔진으로 2개 이상의 웹 사이트를 서비스 이용자에게 제공할 수 있다. 이는 HTTP 1.1의 호스트 헤더를 이용해서 가상 호스트를 제공하는 기능과 동일하다.
가상 호스트는 웹 엔진에 설정할 수 있는 일종의 웹 컨텍스트 그룹이다. 가상 호스트가 웹 엔진의 구성 요소로서 어떻게 위치하는지는 웹 엔진의 구성 요소를 참고한다.
다음은 가상 호스트의 사용 목적에 따른 이용 패턴을 보여준다.
위의 예제를 보면, 서로 다른 2개의 주소로 서로 같은 컨텍스트 패스(/service)에 접근할 수 있다. 실제로는 하나의 서버뿐이지만 HTTP 클라이언트 입장에서는 "www.foo.com"과 "www.bar.com"이라는 2대의 서버가 존재하는 것처럼 인식된다.
서비스 제공자 입장에서는 "/service"라는 동일한 주소 패턴으로 서로 다른 서비스를 제공할 수 있다. 위의 예제에서는 "www.foo.com"은 한국어 서비스를, "www.bar.com"은 영어 서비스를 제공하고 있다.
규칙
가상 호스트를 구성할 때 적용되는 규칙은 다음과 같다.
-
가상 호스트에는 가상 호스트 이름을 부여한다.
가상 호스트의 이름은 설정 파일 내에서 가상 호스트를 참조하기 위해서 내부적으로 사용되는 이름으로 웹 엔진 내에서 유일해야 한다.
-
하나의 가상 호스트는 1개 이상의 도메인 이름이나 IP 주소를 매핑할 수 있다.
JEUS는 이를 호스트 이름이라고 한다. 서로 다른 가상 호스트에 같은 호스트 이름을 매핑할 수 없다는 점에 유의한다.
-
동일한 이름의 웹 컨텍스트는 서로 다른 가상 호스트에 deploy할 수 없다.
서블릿 표준에서 서로 다른 가상 호스트에서 동일한 웹 컨텍스트를 공유할 수 없다고 정의되어 있다.
-
동일한 패스를 가진 서로 다른 웹 컨텍스트 를 각각 서로 다른 가상 호스트에 deploy할 수 있다. 단, 하나의 가상 호스트 내에서는 동일한 패스를 가진 2개 이상의 웹 컨텍스트는 존재할 수 없다.
웹 컨텍스트 이름은 Jakarta EE 표준에서 정의한 애플리케이션 또는 모듈 이름을 의미한다. 패스는 웹 애플리케이션 내에서 정의하는 Context Root 또는 Context Path를 의미한다. 웹 컨텍스트 이름은 JEUS Deploy 차원에서 관리하는 것이며, 웹 엔진은 Context Path를 관리한다.
JEUS 웹 엔진에는 기본 가상 호스트(Default Virtual Host)라는 묵시적인 가상 호스트가 존재한다. 웹 컨텍스트를 deploy할 때 명시적으로 가상 호스트에 지정하지 않으면, 기본 가상 호스트로 deploy한다. 이 가상 호스트의 이름은 "DEFAULT_HOME"이다. 예약어이므로 다른 가상 호스트 이름으로 지정할 수 없다.
3. 가상 호스트를 통한 웹 컨텍스트 요청
본 절에서는 URL과 가상 호스트 내에 존재하는 웹 컨텍스트를 매칭하는 방법에 대해 설명한다.
다음은 웹 엔진과 가상 호스트, 웹 컨텍스트 간의 유효한 관계의 예시를 나타낸다.
3.1. URL 매칭 예제
웹 엔진과 가상 호스트, 웹 컨텍스트 간의 유효한 관계의 예를 기반으로 각각의 URL이 매칭되는 가상 호스트와 웹 컨텍스트는 다음과 같다.
-
http://www.foo.com/ctx1/test.jsp
매칭되는 가상 호스트
A
매칭되는 웹 컨텍스트 이름
ctx1
-
http://www.foo.com/ctx2/test.jsp
매칭되는 가상 호스트
A
매칭되는 웹 컨텍스트 이름
ctx2
-
http://www.bar.com/ctx1/
매칭되는 가상 호스트
B
매칭되는 웹 컨텍스트 이름
ctx1-1
-
http://www.bar2.com/ctx1/test.jsp
매칭되는 가상 호스트
C
매칭되는 웹 컨텍스트 이름
없음 (404 Not Found)
-
http://www.foo2.com/ctx2/
매칭되는 가상 호스트
C
매칭되는 웹 컨텍스트 이름
ctx2-2
웹 컨텍스트 이름과 컨텍스트 패스는 서로 다른 개념이다. 일반적으로 같은 값을 사용하지만 지금처럼 가상 호스트를 이용해서 서비스를 구분하는 경우에는 서로 달라진다. |
3.2. URL 매칭 순서
URL이 매칭되는 순서는 다음과 같다.
-
Host 헤더의 도메인 이름 및 포트 문자열을 등록된 모든 가상 호스트에 매칭시킨다. 매칭된 가상 호스트가 있다면 그 안에서 웹 컨텍스트를 찾는다.
가상 호스트에 설정한 호스트 이름에 "IP:Port"와 같은 형식으로 포트 정보도 매핑할 수 있다. 포트가 있는 경우에는 Host 헤더값 전체(포트 포함)를 매칭하는 작업을 수행한다.
-
웹 컨텍스트가 발견되지 않았으면 기본 가상 호스트에서 찾는다.
-
기본 가상 호스트에서 원하는 웹 컨텍스트가 없으면 "404 Not Found" 에러가 발생한다.
4. 가상 호스트 설정
콘솔 툴을 사용하여 가상 호스트를 추가, 수정 및 삭제할 수 있다.
본 절의 설정 예제에서는 편의상 이름을 "A", "B", "C"로 사용하였다. 실제 환경에서는 의미 있는 이름을 사용한다. |
4.1. 추가
콘솔 툴을 사용하여 가상 호스트를 추가할 수 있다.
콘솔 툴 사용
콘솔 툴을 사용하여 가상 호스트를 추가하려면 다음과 같이 add-virtual-host 명령어를 수행한다.
add-virtual-host [-cluster <cluster-name> | -server <server-name>] [-f, --forceLock] <virtual-host-name> -list <host-name-list> [-tmin <The minimum number of threads>] [-tmax <The maximum number of threads>] [-tidle <max-idle-time>] [-qs <max-queue-size>]
명령어에 대한 자세한 내용은 JEUS Reference 안내서의 add-virtual-host를 참고한다.
4.2. 수정
콘솔 툴을 사용하여 가상 호스트를 수정할 수 있다.
콘솔 툴 사용
콘솔 툴을 사용하여 가상 호스트를 수정하려면 다음과 같이 modify-virtual-host 명령어를 수행한다. 명령어에 대한 자세한 내용은 JEUS Reference 안내서의 modify-virtual-host를 참고한다.
modify-virtual-host [-cluster <cluster-name> | -server <server-name>] [-f, --forceLock] <virtual-host-name> [-alhnl <access-log-enable-host-name-lookup> | -aluse <use-access-log (true/false)> | -alf <access-log-format> | -aluph <access-log-use-parent-handler (true/false)> | -alext <access-log-excluded-extensions>] [-hnrm <host-name> | -hnadd <host-name>] [-ast <attach-stacktrace-on-error>] [-fhn <file-handler-name>] [-fhp <file-handler-permission>] [-tmin <The minimum number of threads>] [-tmax <maximum-thread-num>] [-tidle <max-idle-time>]
4.3. 삭제
콘솔 툴을 사용하여 가상 호스트를 삭제할 수 있다.
콘솔 툴 사용
콘솔 툴을 사용하여 가상 호스트를 삭제하려면 다음과 같이 remove-virtual-host 명령어를 수행한다. 명령어에 대한 자세한 내용은 JEUS Reference 안내서의 remove-virtual-host를 참고한다.
remove-virtual-host [-cluster <cluster-name> | -server <server-name>] [-f, --forceLock] <virtual-host-name>