가상 호스트
가상 호스트란 웹 서버에 기본적으로 존재하는 호스트인 main host를 제외한 나머지 host를 말합니다.
아파치의 공식문서에 따르면 가상호스트는,
1) 이름 기반 가상 호스트 ( 단일 IP , 멀티 IP )
2) IP 기반 가상 호스트
3) Port 기반 가상 호스트
4) IP와 Port의 혼합 , 이름과 IP의 혼합
등의 방식으로 가상호스트를 제공한다고 합니다. ( 링크 )
이 글에서는 그 중에서 " 이름 기반 가상 호스트 " 방식으로 아파치 2.0.64 버전과 2.4.33 버전에서 가상 호스트를 사용해보도록 하겠습니다.
( 아파치 2.0.64 버전 설치는 여기를, 2.4.33 버전 설치는 여기를 참고해주세요 ! )
이름 기반 가상 호스트란, 하나의 IP에 대해서 URL에 따라 가상으로 호스팅을 하겠다는 의미입니다.
예를들어 서버가 할당 받은 IP는 192.168.245.132 라고 할 때,
서버 내에서 www.victolee.com으로 요청이 되는 경우와 www.example.com으로 요청 되는 처리를 다르게 할 수 있다는 것을 의미합니다.
쉽게 말하면, 한 집안에 여러 가정이 살고 있는 것입니다.
이제 아파치에서 이름 기반 가상 호스트를 하는 방법에 대해 알아보겠습니다.
아파치 2.0과 2.4는 가상 호스트를 할 때 약간의 차이가 있는데, 먼저 아파치 2.0 버전에서 가상 호스트를 사용하는 방법입니다.
아파치 2.0.64
1. 아파치에서 가상 호스팅 설정 - default
이름 기반 호스팅이기 때문에 각 URL에 따라 응답할 페이지의 디렉터리를 다르게 설정 해야 합니다.
그런데 직접 IP( 192.168.245.132 )로 접근할 경우는 어떻게 해야 할까요?
이 경우 에러페이지를 반환하거나 환영 페이지를 보여주는 등의 조취가 필요하기 때문에 default가 필요합니다.
# vi /usr/local/victolee/apache2.0.64/conf/httpd.conf ( NameVirtualHost을 검색해서 주석을 삭제 합니다. ( line : 1063 ) ) ( 더 아래에 <VirtualHost>의 주석을 풀어주고 아래와 같이 수정합니다. ( line : 1071 ) )
NameVirtualHost *:80 # VirtualHost example: # Almost any Apache directive may go into a VirtualHost container. # The first VirtualHost section is used for requests without a known # server name. # <VirtualHost _default_:80> ServerAdmin foo@example.com DocumentRoot /usr/local/victolee/apache2.0.64/htdocs ServerName localhost ErrorLog logs/localhost-error_log CustomLog logs/localhost-access_log common <Directory "/usr/local/victolee/apache2.0.64/htdocs"> Options Indexes FollowSymLinks AllowOverride None Allow from all </Directory> </VirtualHost>
가장 기본적인 설정입니다.
DocumentRoot에는 도메이 아닌, 192.168.245.132 같이 IP로 직접 접근할 경우 응답하는 웹 문서가 있는 디렉터리 경로를 지정합니다.
ServerName에는 실제 IP주소가 없기 때문에 localhost로 작성했습니다.
<Directory>와 관련된 설정은 아파치 공식 홈페이지에서 확인할 수 있습니다. ( 링크 )
이와 같이 설정을 한 후에, 아파치를 재실행 하고,
# /usr/local/victolee/apache2.0.64/bin/apachectl stop
# /usr/local/victolee/apache2.0.64/bin/apachectl start
브라우저에서 IP주소로 직접 접근하면( 저 같은 경우는, http://192.168.245.132 ) 아파치 메인 페이지가 보일 것입니다.
default는 도메인이 아닌 IP로 직접 접근할 경우에 대한 처리인데, 위의 설정과 같이 DocumentRoot가 아파치의 htdocs 디렉터리 경로이므로 아파치의 메인 페이지가 응답된 것입니다.
2. 아파치에서 가상 호스팅 설정 - victolee
이번에는 victolee 유저를 위한 가상 호스트를 만들어보겠습니다.
victolee를 위한 도메인은 www.victolee.com입니다.
# vi /usr/local/victolee/apache/conf/httpd.conf
( 방금 전에 설정했던 default 가상 환경 설정 밑에 이어서 추가 합니다. ( line : 1085 ) )
<VirtualHost *:80> ServerAdmin victolee@example.com DocumentRoot /home/victolee/htdocs ServerName www.victolee.com ErrorLog /home/victolee/logs/error_log CustomLog /home/victolee/logs/access_log common <Directory "/home/victolee/htdocs"> Options Indexes FollowSymLinks AllowOverride None Allow from all </Directory> </VirtualHost>
# /usr/local/victolee/apache2.0.64/bin/apachectl stop
# /usr/local/victolee/apache2.0.64/bin/apachectl start
이어서 victolee 계정을 생성하고, 홈 디렉터리 안에 logs와 htdocs 디렉터리를 생성하여 htdcos 디렉터리 안에 html 파일을 생성합니다.
또한 victolee 계정의 홈 디렉터리에 접근하는 것은 아파치이기 때문에 파일의 권한을 수정해야 합니다.
# useradd -g users victolee
# mkdir /home/victolee/htdocs
# mkdir /home/victolee/logs
# vi /home/victolee/htdocs/index.html
<H1> Hello world ! </H!>
# chown -R victolee:users /home/victolee/htdocs
# chmod 705 /home/victolee/
3) 도메인 등록
DNS 서버가 있다면 이 과정은 필요가 없습니다.
DNS 서버가 없다는 가정 하에, local에서 테스트를 하기 위해서는 hosts 파일을 수정해야 합니다.
우선 브라우저를 실행하는 것은 윈도우이기 때문에 윈도우의 hosts 파일( C:\Windows\System32\drivers\etc )에서 도메인을 등록합니다.
( 관리자 권한으로 실행해서 저장해야 합니다. )
# localhost name resolution is handled within DNS itself. # 127.0.0.1 localhost 192.168.245.132 www.victolee.com # ::1 localhost
서버의 IP 주소를 확인한 후, 위와 같이 IP와 URL을 작성합니다.
즉 www.victolee.com으로 접근하면 192.168.245.132임을 알 수 있도록 도메인에 등록한 것입니다.
마찬 가지로 서버에서도 도메인을 추가 합니다.
# vi /etc/hosts
192.168.245.132 www.victolee.com
이제 브라우저에서 http://www.victolee.com 으로 접근하면,
/home/victolee/htdocs 디렉터리안에 있는 index.html 파일이 응답될 것입니다.
즉 " Hello world ! "가 브라우저에 나타납니다.
이와 같은 작업을 반복해서 진행해보면, 하나의 IP로 여러 도메인을 호스팅할 수 있습니다.
가상 호스트는 각 도메인 마다 응답할 파일이 있는 디렉터리( DocumentRoot )가 다르기 때문에 가능합니다.
그리고 여기서 가상 호스트를 하는 방법은 " 이름 기반 가상 호스트 " 방식이였습니다.
아파치 2.4.33
아파치 2.4버전도 2.0과 구조상 큰 차이는 없지만, 몇 가지 다른점이 있습니다.
1) 이제 NameVirtualHost *:80 를 선언하지 않아도 아파치는 묵시적으로 이름기반 호스트라는 것을 알 수 있습니다.
2) <Directory> 에서 정의한 Allow from all는 deprecated 되었습니다.
따라서 대신에, Require all granted로 작성함으로써 해결이 가능합니다.
( 스택 오버 플로우 - 링크 )
따라서 다음과 같이 작성이 가능합니다.
Rewrite 엔진
Rewrite란 요청한 URL을 다시 작성하는 기법입니다.
예를들어 http://www.victolee.com/example/board.jsp 라는 요청이 들어왔다고 가정하겠습니다.
Rewrite는 위 URL에서 example을 제거하고 http://www.victolee.com/board.jsp로 재정의하겠다는 것을 의미합니다.
자바의 경우 ContextPath를 꼭 URL에 명시했어야 했는데, 이럴 경우 URL이 지저분해집니다.
이와 같은 경우에 Rewrite가 유용합니다.
이제 Rewrite를 어떻게 작성하는지 간단하게 알아보겠습니다.
( 공식 홈페이지에서 Rewirte와 관련된 예시가 있는데, 여기를 참고해주세요. )
Rewrtie를 사용하는 방법은, 아파치 설정 파일에서 <VirtualHost> 설정 부분에 Rewrite와 관련된 옵션을 추가하면 됩니다.
# vi /usr/local/victolee/apache/conf/httpd.conf
<VirtualHost *:80> ServerAdmin victolee@example.com DocumentRoot /home/victolee/htdocs ServerName www.victolee.com ErrorLog /home/victolee/logs/error_log CustomLog /home/victolee/logs/access_log common <Directory "/home/victolee/htdocs"> Options Indexes FollowSymLinks AllowOverride None Allow from all </Directory>
RewriteEngine on RewriteRule ^/example/(.*)$ /$1 [R] RewriteRule ^/(.*)$ /example/$1 [PT] </VirtualHost>
이와 같이 작성을 하면, http://www.victolee.com/example/board.jsp 대신 http://www.victolee.com/board.jsp 으로 URL이 수정됩니다.
물론 애플리케이션 내에서는 전자와 같은 URL로 돌아가기 때문에, 애플리케이션에는 아무런 문제가 되지 않습니다.
rewrite는 redirect보다 forward와 비슷한 개념이라고 생각하면 좋을 것 같습니다.
이상으로 가상호스트를 설정하는 방법과, URL을 재정의 하는 rewrite에 대해 알아보았습니다.