Apache HTTP Server Version 2.4

Apache > HTTP Server > Documentation > Version 2.4 > 가상호스트

# 이름기반 가상호스트 지원

이 문서는 최신판 번역이 아닙니다. 최근에 변경된 내용은 영어 문서를 참고하세요.

이 문서는 이름기반 가상호스트를 사용하는 경우와 방법을 설명한다.

### 참고

- IP기반 가상호스트 지원
- 가상호스트 찾기에 대한 자세한 설명
- 대량의 가상호스트를 동적으로 설정하기
- 일반적인 가상호스트 예
- ServerPath 설정 예

## 이름기반 대 IP기반 가상호스트

IP기반 가상호스트는 연결한 IP 주소를 가지고 서비스할 가상호스트를 결정한다. 그래서 각 호스트는 서로 다른 IP 주소를 가져야 한다. 이름기반 가상호스트의 경우 서버는 클라이언트가 HTTP 헤더로 호스트명을 알려주길 바란다. 이런 방법으로 한 IP 주소로 여러 다른 호스트를 서비스할 수 있다.

이름기반 가상호스트는 DNS 서버가 각 호스트명이 올바른 IP 주소로 대응하도록 가상호스트를 설정하고, 다른 호스트명을 구별할 수 있도록 아파치 웹서버를 설정하기만 하면되므로 더 간단하다. 이름기반 가상호스트는 또 여러 IP 주소가 필요없다. 그러므로 특별히 IP기반 가상호스트를 선택할 이유가 없다면 이름기반 가상호스트를 사용해야 한다. IP기반 가상호스트를 사용해야할 이유로는:

- 이름기반 가상호스트를 지원하지않는 오래된 클라이언트들이 있다. 이름기반 가상호스트를 사용하려면 클라이언트가 HTTP Host 헤더를 보내야 한다. 이는 HTTP/1.1에서는 필수이고, 최근 모든 HTTP/1.0 브라우저들도 확장으로 지원한다. 만약 이름기반 가상호스트를 사용하면서 오래된 클라이언트를 지원해야 한다면 이 문서 끝에 있는 방법을 살펴봐라.
- SSL 프로토콜의 성격상 SSL 보안서버에서 이름기반 가상호스트를 사용할 수 없다.
- 어떤 운영체제나 네트웍 장치는 다른 IP 주소를 사용하지 않으면 호스트를 구별하지 못하는 네트웍 사용량(bandwidth) 관리기술을 사용한다.

## 이름기반 가상호스트 사용하기

관련된 모듈 | 관련된 지시어
--- | ---
`core` | `DocumentRoot` `NameVirtualHost` `ServerAlias` `ServerName` `ServerPath` `<VirtualHost>`

이름기반 가상호스트를 사용하려면 서버는 연결을 받을 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/`이 붙은 링크만을 사용한다.

조금 규칙이 필요하지만 이 규칙을 따르면 대부분의 경우 요즘 것이나 오래된 것이나 관계없이 모든 브라우저로 페이지를 볼 수 있다.