Loading
2010. 1. 4. 15:38 - 나쁜철군

[리눅스 가상호스트]Virtual host


하나의 웹서버에서 2개 이상의 여러 개의 웹서버를 운영하는 것을 virtual host라고 합니다. virtual
host는 복수의 홈페이지를 하나의 서버에서 운영하므로 서버의 비용절감에 큰 효과가 있습니다.
대부분의 호스팅업체에서 사용하는 각기 다른 회사의 홈페이지의 운영방법이라고 생각하시면
됩니다. virtual host는 컴퓨터만 한 대이지 ip와 domain도 다르기 때문에 외부에서는 같은
호스트에서 운영되는 사실을 알 수 없습니다. 호스팅업체에서 웹서버를 운영하는 방법에는
4가지가 있는데 다음과 같습니다.

분  류

설 명

       Name Based Virtual host

  도메인네임 기반 가상 호스트

       IP Based Virtual host

   IP 주소 기반 가상 호스트

       Port Based Virtual host

  포트 기반 가상 호스트

       Default Virtual host

  디폴트 가상호스트

 

위에서 각각의 경우는

Name Base

하나의 ip에 여러 개의 도메인을 부여하여 각각 다른 호스트로 운용

IP Base

가상 호스트 각각에 다른 IP 주소를 부여해서 운용

Port Base

하나의 동일한 호스트에 포트만 다르게 지정해서 운용

Default

위의 세가지에 해당사항이 없는 경우 기본으로 응답하는 호스트

3가지 중 가장 많이 쓰이는 것은 하나의 ip 에 여러 개의 도메인을 부여하는 방법으로, 초기에는 ip base
방식이 많이 쓰였지만 요즘은 ip 주소의 부족으로 거의 사용되지 않는다고 합니다. 아래는 알짜 리눅스의
httpd.conf 파일의 가상호스트 부분에 대한 설명을 옮긴 것인데 참고하시기 바랍니다.

##################################################################
### 섹션 3: 가상 호스트
#
# VirtualHost: 여러분의 리눅스 박스에 여러 개의 도메인/호스트이름을
# 관리하고 싶다면 각각에 대하여 VirtualHost 컨테이너를 설정한다.
# 가상 호스트를 설정하기에 앞서 자세한 설명을
# <URL:http://www.apache.org/docs/vhosts/>에 들러 읽어보기 바란다.
# 가상 호스트 설정 내용을 점검해보기 위해서는 아파치를 실행할 때
# 명령행 옵션으로 '-S'를 사용한다.

#
# 이름 기반의 가상 호스트를 사용하려면 사용할 IP 주소 (최소 1 개,
# 그리고 포트 번호)를 정의해주어야 한다.
#
# 경고 : 아파치 1.2.x 버전에서만 가상 호스트 기능을 사용해 온 관리자들은
#        아파치 1.3.x 버전에서 NameVirtualHost 지시자로 IP 주소를
#        해주어야만 가상 호스트가 제대로 동작한다는 사실을 꼭 알아야 한다!!!
#        1.2 버전을 쓰다 1.3 버전으로 와서 가상 호스트가 동작하지 않는
#        문제의 99% 는 바로 NameVirtualHost 설정에 있다.
#
#

#NameVirtualHost 12.34.56.78:80
#NameVirtualHost 12.34.56.78

#
# 가상 호스트 예제:
# 거의 모든 아파치 지시자가 VirtualHost 컨테이너에 올 수 있다.
#
#<VirtualHost ip.address.of.host.some_domain.com>
#    ServerAdmin webmaster@host.some_domain.com
#    DocumentRoot /www/docs/host.some_domain.com
#    ServerName host.some_domain.com
#    CustomLog logs/host.some_domain.com-access_log common
#    ErrorLog logs/host.some_domain.com-error_log

#</VirtualHost>

#<VirtualHost _default_:*>
#</VirtualHost>


그럼 하나, 하나 예를 들어서 설명하겠습니다..
단 각각의 경우에서 다큐먼트 파일의 위치는 임의로 한 것임을 알립니다.

1. Name base virtual host 의 예제입니다.

하나의 ip 192.168.1.1에 alpha.linux.org, bravo.llinux.org 2개의 호스트를 운영할 경우.

<VirtualHost 192.168.1.1>
ServerAdmin root@alpha.linux.org
ServerName

alpha.linux.org 

DocumentRoot

/home/alpha/public_html

ScriptAlias/cgi-bin /home/alpha/wwwhome/cgi-bin
CustomLoglogs/alpha.linux.org-access_log common 
ErrorLog

logs/alpha.linux.org-accss-errog_log

</VirtualHost>  


 

<VirtualHost 192.168.1.1>
ServerAdmin root@alpha.linux.org
ServerName

bravo.linux.org 

DocumentRoot

/home/bravo/public_html

ScriptAlias/cgi-bin /home/bravo/wwwhome/cgi-bin
CustomLoglogs/bravo.linux.org-access_log common 
ErrorLog

logs/bravo.linux.org-accss-errog_log

</VirtualHost>




2. IP base virtual host 의 예제

   ip 192.168.1.1 ,  192.168.1.2 , 192.168.1.3  3개의 주소사용할 때.

port 80

ServerName alpha.linux.org

DocumentRoot /usr/local/apache/htdocs          <<  주 호스트 alpha 192.168.1.1 의 설정


<VirtualHost 192.168.1.1>
ServerAdmin root@alpha.linux.org
ServerName

alpha.linux.org 

DocumentRoot

/home/alpha/public_html

ScriptAlias/cgi-bin /home/alpha/wwwhome/cgi-bin
CustomLoglogs/alpha.linux.org-access_log common 
ErrorLog

logs/alpha.linux.org-accss-errog_log

</VirtualHost>  



<VirtualHost 192.168.1.2>
ServerAdmin root@alpha.linux.org
ServerName

bravo.linux.org 

DocumentRoot

/home/bravo/public_html

ScriptAlias/cgi-bin /home/bravo/wwwhome/cgi-bin
CustomLoglogs/bravo.linux.org-access_log common 
ErrorLog

logs/bravo.linux.org-accss-errog_log

</VirtualHost>


<VirtualHost 192.168.1.3>
ServerAdmin root@alpha.linux.org
ServerName

charlie.linux.org 

DocumentRoot

/home/charlie/public_html

ScriptAlias/cgi-bin /home/charlie/wwwhome/cgi-bin
CustomLoglogs/charlie.linux.org-access_log common 
ErrorLog

logs/charlie.linux.org-accss-errog_log

</VirtualHost>



3. Port base virtual host 의 예제

Listen 80

ServerName alpha.linux.org

DocumentRoot /usr/local/apache/htdocs          <<  주 호스트 alpha 192.168.1.1 의 설정

 

Listen 8080                                                           << 사용할 포트번호

Listen 8081


<VirtualHost 192.168.1.2 :8080>
ServerAdmin root@alpha.linux.org
ServerName

alpha.linux.org 

DocumentRoot

/home/alpha/public_html

ScriptAlias/cgi-bin /home/alpha/wwwhome/cgi-bin
CustomLoglogs/alpha.linux.org-access_log common 
ErrorLog

logs/alpha.linux.org-accss-errog_log

</VirtualHost>


<VirtualHost 192.168.1.2 :8081>
ServerAdmin root@alpha.linux.org
ServerName

bravo.linux.org 

DocumentRoot

/home/bravo/public_html

ScriptAlias/cgi-bin /home/bravo/wwwhome/cgi-bin
CustomLoglogs/bravo.linux.org-access_log common 
ErrorLog

logs/bravo.linux.org-accss-errog_log

</VirtualHost>





4. Default virtual host 의 예제

<VirtualHost _default_:*>
ServerAdmin root@alpha.linux.org
ServerName

bravo.linux.org 

DocumentRoot

/home/bravo/public_html

ScriptAlias/cgi-bin /home/bravo/wwwhome/cgi-bin
CustomLoglogs/bravo.linux.org-access_log common 
ErrorLog

logs/bravo.linux.org-accss-errog_log

</VirtualHost>

상기 예제에서 CustomLog,  ErrorLog 와 TransferLog, 등 log 파일은 꼭 필요로 하거나 원하는 경우에
만 설정하는 것이 좋습니다. 한 서버에 많은 도메인이 있을 경우 전부 log 파일을 주게 되면 너무 많은
파일이 열리게 되어 cgi 나 apache 서버의 오작동을 불러올 수 있으므로 주의를 필요로 합니다. 하지만
웹로그분석을 할 경우에는 로그를 로테이트하거나 지우면 안 되겠지요.


그럼 실제 예를 들어보지요. 제가 관리하던 서버의 아파치 설정 부분입니다.
이 경우는 요즘 거의 대부분의 웹호스팅에 쓰이는 Name base virtual host
의 예제입니다.
전부는 보여드릴 수 없고 일부를 보여드립니다.
그리고 실제 도메인인 관계로 xxx처리한 것을 이해하시기 바랍니다.

우선 아파치 설정파일을 열어서 다음과 같이 virtual host 부분을 작석하거나 적당하게 수정합니다.

[root@tradexxxx /root]# vi /usr/local/apache/conf/httpd.conf

#NameVirtualHost 211.174.60.28
## Section 3: Virtual Hosts #


####################################################
# hosting group #
####################################################


#### acexxxx.co.kr ################################
ServerAdmin webmaster@xxxventure.com
ServerName www.acexxxx.co.kr
DocumentRoot /home/hosting/acexxxx/wwwhome
ScriptAlias /cgi-bin /home/hosting/acexxxx/wwwhome/cgi-bin
CustomLog logs/acexxxx.co.kr-access_log common
# ErrorLog logs/host.some_domain.com-error_log


#### celexxx.co.kr ##################################
ServerAdmin webmaster@xxxventure.com
ServerNamewww.celexxx.co.kr
DocumentRoot/home/hosting/celexxx/wwwhome
ScriptAlias/cgi-bin /home/hosting/celexxx/wwwhome/cgi-bin
CustomLoglogs/celexxx.co.kr-access_log common
# ErrorLog logs/host.some_domain.com-error_log


#### suanxx.com ####################################
ServerAdmin webmaster@xxxventure.com
ServerNamewww.suanxx.com
DocumentRoot/home/hosting/suanxx/wwwhome
ScriptAlias/cgi-bin /home/hosting/suanxx/wwwhome/cgi-bin
CustomLoglogs/suanxx.com-access_log common
# ErrorLog logs/host.some_domain.com-error_log


#### imyxxx.com ####################################
ServerAdmin webmaster@xxxventure.com
ServerNamewww.imyxxx.com
DocumentRoot/home/hosting/imyxxx/wwwhome
ScriptAlias/cgi-bin /home/hosting/imyxxx/wwwhome/cgi-bin
CustomLoglogs/imyxxx.com-access_log common
# ErrorLog logs/host.some_domain.com-error_log

 



이런 식으로 설정을 한 후에 httpd.conf 파일을 저장하고 아파치를 재실행 시킵니다.

[root@traderoad /root]# /usr/local/apache/bin/apachectl stop
/usr/local/apache/bin/apachectl stop: httpd stopped
[root@traderoad /root]# /usr/local/apache/bin/apachectl start
/usr/local/apache/bin/apachectl start: httpd started


물론 dns 세팅도 제대로 되어어야 겠지요. 이상에서 예제를 통해 설정방법을 알아보았습니다.
Name Base virtual host 에서는 상위의 네임서버에 도메인이 등록되어야 사용할 수 있고,
IP Base virtual host 에서는 하나의 랜카드에 두 개 이상의 ip 주소를 부여하기 위해 ip alias를
사용하야 하며, Port base virtual host에서는 포트번호를 알아야 접근이 가능합니다.