가상 호스트

본 장에서는 가상 호스트의 사용 목적, 규칙 및 설정 방법 등에 대해 설명한다.

1. 개요

가상 호스트는 인터넷 도메인 이름을 기준으로 같은 URL로 서로 다른 웹 애플리케이션에 매핑할 수 있도록 한다. 즉, 2개 이상의 도메인 이름(예: “www1.foo.com” and “www2.foo.com”)을 하나의 웹 엔진에 설정하여 서로 다른 웹 컨텍스트를 서비스할 수 있다.

웹 엔진 관점에서 웹 컨텍스트는 웹 애플리케이션과 동일한 의미이다.

2. 웹 엔진과 가상 호스트

본 절에서는 가상 호스트의 사용 목적, 규칙, ServletContext 객체와 가상 호스트의 관계에 대해 설명한다.

사용 목적

가상 호스트에 매핑된 도메인 이름을 기준으로, 같은 URL로 서로 다른 웹 애플리케이션에 매핑할 수 있다. 따라서 서비스 제공자는 하나의 웹 엔진으로 2개 이상의 웹 사이트를 서비스 이용자에게 제공할 수 있다. 이는 HTTP 1.1의 호스트 헤더를 이용해서 가상 호스트를 제공하는 기능과 동일하다.

가상 호스트는 웹 엔진에 설정할 수 있는 일종의 웹 컨텍스트 그룹이다. 가상 호스트가 웹 엔진의 구성 요소로서 어떻게 위치하는지는 웹 엔진의 구성 요소를 참고한다.

다음은 가상 호스트의 사용 목적에 따른 이용 패턴을 보여준다.

figure basic idea behind virtual hosting
가상 호스트의 이용 패턴

위의 예제를 보면, 서로 다른 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"이다. 예약어이므로 다른 가상 호스트 이름으로 지정할 수 없다.

2.1. ServletContext 객체와 가상 호스트

Servlet API에는 jakarta.servlet.ServletContext.getContext(String contextPath)라는 메소드가 있다. "contextPath"에 의해 주어진 ServletContext 객체를 리턴한다. 이 메소드는 ServletContext가 속하는 가상 호스트에 존재하는 ServletContext를 리턴한다. 만약 해당 가상 호스트 내에 없으면 기본 가상 호스트에서 찾는다.

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이 매칭되는 순서는 다음과 같다.

  1. Host 헤더의 도메인 이름 및 포트 문자열을 등록된 모든 가상 호스트에 매칭시킨다. 매칭된 가상 호스트가 있다면 그 안에서 웹 컨텍스트를 찾는다.

    가상 호스트에 설정한 호스트 이름에 "IP:Port"와 같은 형식으로 포트 정보도 매핑할 수 있다. 포트가 있는 경우에는 Host 헤더값 전체(포트 포함)를 매칭하는 작업을 수행한다.

  2. 웹 컨텍스트가 발견되지 않았으면 기본 가상 호스트에서 찾는다.

  3. 기본 가상 호스트에서 원하는 웹 컨텍스트가 없으면 "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>