Apache | 가상 호스트(VirtualHost) 설정 | 이름 기반 가상 호스트

이름 기반 가상 호스트

이름 기반의 경우 IP 주소는 한개가 아니어도 된다. 이름 기반의 경우는 클라이언트의 요청에 포함된 Hosts 헤더를 보고 어떤 호스트에 액세스할 것인지를 결정한다.

먼저 “VirtualHost"를 사용하여 ServerName마다 설정하고 있다.

<VirtualHost IP주소:포트-번호>
    ServerName www1.devkuma.com
    ....
</VirtualHost>

<VirtualHost  IP주소:포트-번호>
    ServerName www2.devkuma.com
    ....
</VirtualHost>

요청(request)에 포함된 Hosts 헤더를 참조하여 “ServerName"와 일치하는 블록을 찾는다. 일치하는 블록이 발견되면 그 블록의 설정이 적용된다.

좀 더 구체적으로 설명을 하자면, “ww1.devkuma.com"과 “ww1.devkuma.com” 두 호스트를 1개 이상의 IP 주소에 할당하고, 각각에 대한 액세스에 대해 다른 동작을 하게 하려면 다음과 같이 설정한다.

<VirtualHost *:80>
    ServerName     ww1.devkuma.com
    ServerAdmin    devkuma@devkuma.com
    DocumentRoot   "${SRVROOT}/htdocs-ww1"
    CustomLog      logs/ww1.access.log common
    ErrorLog       logs/ww1.error.log
</VirtualHost>

<VirtualHost *:80>
    ServerName     ww2.devkuma.com
    ServerAdmin    devkuma@devkuma.com
    DocumentRoot   "${SRVROOT}/htdocs-ww2"
    CustomLog      logs/ww2.access.log common
    ErrorLog       logs/ww2.error.log
</VirtualHost>

※ 위의 “*:80"이라고 지정되어 있는 부분은 “192.168.1.2:80"와 같이 명시적으로 IP 주소를 지정해도 된다.

실습

그럼 실제 실습을 해보도록 하겠다. 먼저 2개의 호스트에 대한 DNS 등록한다. 여기서는 DNS 대신에 “hosts” 파일에 다음과 같이 작성한다. (※ “hosts"파일에 대해서는 “호스트 접근 설정 (hosts 파일)“를 참조한다.)

127.0.0.1 ww1.devkuma.com
127.0.0.1 ww2.devkuma.com

다음은 “httpd.conf” 설정이다. 가상 호스트에 대한 설정은 “httpd-vhosts.conf” 파일에 작성하도록 하겠다.

먼저 “httpd-vhosts.conf” 파일을 사용한다. “httpd.conf” 파일에서 “httpd-vhosts.conf"로 검색해 보면, 다음과 같은 내용을 찾을 수 있을 것이다.

# Virtual hosts
#Include conf/extra/httpd-vhosts.conf

“Include” 앞에 있는 ‘#‘를 제거하고 “httpd-vhosts.conf"을 읽도록 설정한다.

# Virtual hosts
Include conf/extra/httpd-vhosts.conf

다음은 “httpd-vhosts.conf” 파일을 수정한다. “(Apache 설치 디렉터리)Apache24\conf\extra"디렉터리에 있다.

다음과 같이 샘플로 작성되어 있을 것이다. (주석은 생략한다.)

<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "${SRVROOT}/docs/dummy-host.example.com"
    ServerName dummy-host.example.com
    ServerAlias www.dummy-host.example.com
    ErrorLog "logs/dummy-host.example.com-error.log"
    CustomLog "logs/dummy-host.example.com-access.log" common
</VirtualHost>

<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host2.example.com
    DocumentRoot "${SRVROOT}/docs/dummy-host2.example.com"
    ServerName dummy-host2.example.com
    ErrorLog "logs/dummy-host2.example.com-error.log"
    CustomLog "logs/dummy-host2.example.com-access.log" common
</VirtualHost>

여기서는 다음과 같이 변경한다.

<VirtualHost *:80>
    ServerName     ww1.devkuma.com
    ServerAdmin    devkuma@devkuma.com
    DocumentRoot   "${SRVROOT}/htdocs-ww1"
    CustomLog      logs/ww1.access.log common
    ErrorLog       logs/ww1.error.log
</VirtualHost>

<VirtualHost *:80>
    ServerName     ww2.devkuma.com
    ServerAdmin    devkuma@devkuma.com
    DocumentRoot   "${SRVROOT}/htdocs-ww2"
    CustomLog      logs/ww2.access.log common
    ErrorLog       logs/ww2.error.log
</VirtualHost>

※ “httpd-vhosts.conf " 파일은 “Include"에 의해 “httpd.conf “파일에 로드된다. 그러므로 위의 로그 형식명을 지정하고 있는 “common"은 “httpd.conf” 파일에 정의된 “common"형식이 사용도 된다.

또한 위에서 설정한 대로 도큐먼트 루트를 각각 생성하고, 별도의 HTML 파일을 아래와 같이 각각 작성하여 넣는다.

{Apache 설치 디렉터리}/htdocs-ww1/index.html

<html>
<body>
<h1>WW1 Page</h1>
</body>
</html>

{Apache 설치 디렉터리}/htdocs-ww2/index.html

<html>
<body>
<h1>WW2 Page</h1>
</body>
</html>

“httpd.conf” 파일에서 아래와 같이 이 두 도큐먼트 루트에 적절한 권한을 설정한다.

<Directory "${SRVROOT}/htdocs-ww1">
    Require all granted
</Directory>

<Directory "${SRVROOT}/htdocs-ww2">
    Require all granted
</Directory>

이제 준비는 완료하였다. 우선 “http://ww1.devkuma.com"에 액세스해 본다.

이름 기반 가상 호스트

“ww1.devkuma.com"용의 도큐먼트 루트에 포함된 HTML 파일이 표시된다.

다음은 “http://ww2.devkuma.com/"에 액세스해 본다.

이름 기반 가상 호스트

“ww2.devkuma.com"용의 도큐먼트 루트에 포함된 HTML 파일이 표시된다.

이것으로 하나의 IP 주소와 Apache를 사용하여 여러 도메인을 사용하여 호스트에 대해 별도의 페이지를 반환하는 방법에 대해 알아보았다.




최종 수정 : 2019-12-10