이름기반 VirtualHost 설정

하나의 서버가 여러개의 도메인을 가지고 있고,

각각의 도메인마다 다른 서비스를 하고 싶을때 아파치의 VirtualHost를 사용하면 편리합니다.

예를 들어 제 IP가 192.168.0.3 이고, 쇼핑몰 사이트와 자동차 판매 사이트를 운영하고 싶어

shopping.com 이라는 도메인과 car.com 이라는 도메인을 구입했다고 가정하겠습니다.

그리고 2개의 도메인은 둘다 192.168.0.3 서버를 가리킵니다.

shopping.com을 입력하고 들어왔을땐 쇼핑몰 사이트를 보여주고싶고,

car.com을 입력하고 들어왔을땐 자동차 판매 사이트를 보여주고 싶습니다.

이럴경우 아파치의 가상호스트(VirtualHost)를 사용하면 편리합니다.


저희는 현재 shopping.com, car.com의 도메인이 없기 때문에 적절한 테스트를 위하여 hosts 파일을 수정하겠습니다.

( hosts 파일은 C:\Windows\System32\drivers\etc 폴더내에 존재합니다. hosts 파일은 DNS서버보다 먼저 읽혀집니다.)

hosts 파일에 아래와 같이 추가합니다.


127.0.0.1 car.com

127.0.0.1 www.car.com

127.0.0.1 shopping.com

127.0.0.1 www.shopping.com


이로써 위의 4개의 도메인이 제 컴퓨터를 가리키게 되겠군요. ㅎㅎ


이제 VirtualHost 설정을 진행하겠습니다.

먼저 아파치 폴더 내 conf 파일안에 있는 httpd.conf 파일을 수정하겠습니다.

VirtualHost에 관한 설정은 httpd.conf 파일에 바로 설정해도 되지만, 가독성을 위해 다른 설정파일에 작성하도록 하겠습니다.


httpd.conf

# User home directories

#Include conf/extra/httpd-userdir.conf


# Real-time info on requests and configuration

#Include conf/extra/httpd-info.conf


# Virtual hosts

Include conf/extra/httpd-vhosts.conf


# Local access to the Apache HTTP Server Manual

#Include conf/extra/httpd-manual.conf


# Distributed authoring and versioning (WebDAV)

#Include conf/extra/httpd-dav.conf


# Various default settings

#Include conf/extra/httpd-default.conf

여기서 Include conf/extra/httpd-vhosts.conf 의 주석을 해제해줍니다. (480번 라인쯤에 있습니다)

저희는 httpd-vhosts.conf 파일에 VirtualHost 설정을 작성할 것이며, Include 지시어를 통해 httpd.conf 파일에 불러올 것입니다.


이제 VirtualHost 설정을 위해 httpd-vhosts.conf 파일을 수정하겠습니다.

아파치 설정을 건드리신 적이 없다면 VirtualHost 태그가 2개 정도 들어가 있는 것을 볼 수 있는데.. 이는 작성 예시를 적어놓은 것입니다.

주석처리하거나 삭제하시고, 아래와 같이 작성합니다.


httpd-vhosts.conf

NameVirtualHost *:80


<VirtualHost *:80>

    DocumentRoot "C:\shopping"

    ServerName shopping.com

    ServerAlias www.shopping.com      

</VirtualHost>


<VirtualHost *:80>

    DocumentRoot "C:\car"

    ServerName car.com

    ServerAlias www.car.com      

</VirtualHost>

NameVirtualHost에는 가상호스팅을 할 IP 영역을 지정하고,

아래의 VirtualHost 태그에서 세부적인 설정을 합니다.

그런데 제가 작성한 파일에는 NameVirtualHost가 *:80 으로 되어있는 것을 볼 수 있습니다.

이는 아파치가 80포트로 들어오는 모든 IP주소에 대해 가상호스트 요청을 기다린다는 것을 의미하는데,

현재 이 서버가 가지고 있는 IP는 192.168.0.3 하나 뿐이며, DHCP에 의해 동적할당된다면 IP가 수시로 변경될 수 있기 때문에,

위와 같이 * 를 쓰는것이 유용합니다. (실제 IP주소를 박아도 무방하긴 합니다)


아래의 VIrtualHost 태그는 NameVirtualHost에 대한 세부적인 설정이기 때문에, 태그가 끝나기 전 argument는 NameVirtualHost와 일치해야 합니다.


이제 태그 내 설정을 보겠습니다.

ServerName 에는 서비스할 도메인을 적어주고, ServerAlias 를 통해 추가적으로 별칭을 지정할 수 있습니다. www가 붙은것을 각자 추가하도록 하겠습니다.

ServerAlias 는 여러개가 와도 됩니다. 각 도메인들은 공백으로 구분합니다.

ex ) ServerAlias www.shopping.com www.shop.com *.shopping.com (*도 사용가능합니다)

마지막으로 DocumentRoot 에는 실제 소스파일이 있는 웹루트를 지정해주면 됩니다.

이렇게 해두면

shopping.com 이나 www.shopping.com 도메인을 호출했을 경우 C:\shopping 내의 index 파일을 찾아가게 됩니다.


아래의 car.com에 대한 VirtualHost는 위와 동일하므로 생략하겠습니다.


아직 아파치 재시작 하시면 안됩니다!

아파치 재시작하고, 해당 도메인을 호출할 경우 아래와 같은 화면을 보시게 될 겁니다.

접근 거부라니 !!

우리가 www.shopping.com의 documentRoot인 C:\shopping에 대한 접근 권한이 없다는 뜻입니다.

이는 httpd.conf 파일의 Directory 태그 를 통해설정 가능하므로 살펴보도록 하겠습니다.

먼저 httpd.conf 파일 내의 Directory 태그를 살펴보다 보시면 아래와 같은 구문을 발견하실 수 있는데요..

<Directory />

    Options FollowSymLinks

    AllowOverride None

    Order deny,allow    // deny, allow의 순서로 진행한다.

    Deny from all    // 모든 접속을 deny 한다

</Directory>

아래의 2개만 보셔도 됩니다.

Order 속성은 수행순서를 결정하는 것으로, 보다시피 deny,allow  라고 작성되어 있네요. Deny를 먼저 수행하고 Allow를 수행한다는 의미입니다.

그리고 마지막 속성을 보시면 Deny from all 이라고 작성되어 있습니다. 모든 접근을 거부한다고 하네요.

즉, Deny를 먼저 수행하고 Allow를 수행하므로 Deny from all에 의해 모든 접근이 거부됩니다.

그러나 뒤쪽의 추가적인 Allow가 없으므로 모든 접근을 차단하게 된다는 의미가 되지요.

Directory 태그의 파라미터에 / 가 입력되어 있으므로, 전체 폴더를 뜻하게 되겠지요.

정리하자면 

아파치를 통해 접근하는 모든 폴더에 대한 접근을 거부한다

정도 되려나요..ㅋㅋ 그래서 우리는 방금 www.shopping.com의 웹루트인 C:\shopping의 폴더에 접근하지 못했던 것입니다.


이는 httpd.conf 파일내에 Directory 태그를 추가하면서 해결해나갈 수 있습니다.

위의 Directory 태그 바로 아래에 2개의 Directory 태그를 추가하도록 하겠습니다.

<Directory "C:\shopping">

    Order Allow,Deny

    Allow from all

</Directory>


<Directory "C:\car">

    Order Allow,Deny

    Allow from all

</Directory>

이로써 shopping 폴더와 car 폴더에 대해서도 접근권한이 생기게 됩니다.

Allow  from, Deny  from 뒤에 붙은 all 대신 ip를 적어주게 되면 해당 ip에 대해 허용이나 거부를 할 수 있습니다.

구분은 공백으로 합니다.

ex ) Allow  from 192.168.0.3 192.168.0.4     // 2개 ip 허용

Order 속성을 유의하시면서 작성하시면 됩니다 ~ ^^


이제 다 되었네요. 아파치를 재시작 하시고

shopping.com, www.shopping.com, car.com, www.car.com에 각각 접속해 보시기 바랍니다.

index 파일을 각각 작성하여 잘 설정되었는지 확인해 볼 수 있겠네요.


전 잘 되네요.ㅎㅎ


포트기반 VirtualHost 설정

VirtualHost는 도메인(이름) 기반이 아닌 포트기반으로도 할 수 있습니다. (ip기반으로도 가능합니다)

예를 들어, car.com 도메인에서 자동차 판매 서비스를 제공하고 있지만, 중고차 판매 사이트까지 제공하고 싶습니다.

그런데 도메인 살 돈이 없습니다.. 잔고가 0원 ㅠ.ㅠ

이럴 경우 따로 포트를 지정하여, 지정한 포트로 들어올때 다른 서비스를 제공해 줄 수 있습니다.

중고차 파는 사이트는 도메인은 그대로 하고, 8888 포트를 사용하여 다른 사이트를 제공하도록 해보겠습니다.

먼저 아파치에서 포트 8888에 대한 접속도 받도록 해야합니다.

이는 httpd.conf 파일에 추가하시면 됩니다.

# prevent Apache from glomming onto all bound IP addresses.

#

#Listen 12.34.56.78:80


Listen 80

Listen 8888


#

# Dynamic Shared Object (DSO) Support

한 45번째 라인쯤 보시면 Listen 이라는 지시어가 보이실겁니다. 그곳에 위와 같이 Listen 8888 을 추가해줍니다.


이제 VIrtualHost 설정을 위해 httpd-vhosts.conf 파일로 이동하여 VirtualHost를 추가합시다.

NameVirtualHost *:80

NameVirtualHost *:8888


<VirtualHost *:80>

    DocumentRoot "C:\shopping"

    ServerName shopping.com

    ServerAlias www.shopping.com      

</VirtualHost>


<VirtualHost *:80>

    DocumentRoot "C:\car"

    ServerName car.com

    ServerAlias www.car.com      

</VirtualHost>


<VirtualHost *:8888>

    DocumentRoot "C:\usedCar"

    ServerName car.com

    ServerAlias www.car.com      

</VirtualHost>

위와 같이 NameVirtualHost와 VIrtualHost를 설정해주시면 됩니다. 설명은 생략해도 될 것 같네요.


Directory 태그도 추가해줘야겠지요!

<Directory "C:\usedCar">

    Order Allow,Deny

    Allow from all

</Directory>

다 되었습니다.


아파치 재시작 ~ 테스트 ~ 해봅시다.

잘 되네요. ㅎㅎㅎ


아.. 그리고

제가 위에서 NameVirtualHost에 IP영역을 지정하고 VirtualHost에서 세부적인 설정을 한다고 말씀드렸었는데,

테스트 해보니 NameVirtualHost가 굳이 없어도 잘 되네요. ㅠㅠ

아파치 버전이 바뀌면서 NameVirtualHost를 생략해도 되게 변경된건가요..?

이 둘의 관계를 말씀해주실 분 있으면 댓글 부탁드릴게요 ㅠㅠ


이상 포스팅을 마치겠습니다.

수고하셨습니다.

'Server' 카테고리의 다른 글

JBOSS 시스템 프로퍼티 설정  (0) 2016.08.17
아파치 톰캣 연동  (0) 2015.05.26
아파치 설정파일 구문 검사  (0) 2015.05.06
아파치 VirtualHost 설정  (6) 2015.05.05
톰캣 메모리 설정  (0) 2015.04.13
JConsole 서버 모니터링  (1) 2015.03.23