본문 바로가기

else if (개발)

아파치 가상 호스트와 톰캣의 연결

태터툴즈 설치하고 첫 포스팅은 바로 지금 이 시스템을 만들면서 얻은 경험을 적어보도록 하겠습니다.

환경과 작업 목표는 이렇습니다.
서버가 한대이고, 공인 ip도 한개입니다. 도메인 이름은 sragent.pe.kr 이고, 여기에다가 3개의 가상 호스트를 만들어서 사용하기로 계획을 세웠습니다. 그러니까,
blog.sragent.pe.kr : 이 가상 호스트에는 블로그를 위해서 태터툴즈를 설치합니다. 따라서, php를 사용할 수 있는 아파치 웹서버에서 돌아가야 합니다.
lab.sragent.pe.kr : 이 가상 호스트는 java로 만든 데모 프로그램들을 만들어 올릴 계획입니다. 그래서, 톰캣 서버로 연결되어야 합니다.
www.sragent.pe.kr : 여기에는 어떤 페이지를 올려야 할지 아직 미정입니다. 그냥 블로그로 리다이렉션 시켜야 하나 아니면 비활성화 시켜야 하나... 암튼 지금은 index.html 페이지 하나 있습니다.
그리고, 각각의 가상 호스트는 document root가 달라야 하겠지요. 말이 좀 길어진 탓에 다시 간단히 요약하자면 아래와 같습니다.

가상호스트 ip 서버 document root
www.sragent.pe.kr 122.49.118.84 아파치 /var/www
blog.sragent.pe.kr 122.49.118.84 아파치 /var/www/blog
lab.sragent.pe.kr 122.49.118.84 톰캣 /usr/share/tomcat5.5/webapps/lab

구성 방법을 간단히 얘기하자면, 아파치의 가상 호스트 기능을 이용하여 www, blog, lab 세개의 가상 호스트를 설정합니다. 그중에서 lab 호스트는 톰캣과의 연결을 위해서 mod-proxy 모듈을 이용하였습니다. 당연한 얘기지만 dns 서버에 www, blog, lab이 호스트 이름으로 등록되어 있어야 합니다.
여기에서는 아파치와 톰캣의 설치와 실행에 대해서는 생략을 하고, mod-proxy를 이용한 아파치와 톰캣의 연동, 아파치 가상 호스트 설정 부분만 설명하도록 하겠습니다.

mod-proxy를 이용한 아파치와 톰캣의 연동
아파치는 80포트로, 톰캣 htttp connector는 8080 포트로 떠있다고 가정합니다.
그러니까, http://www.sragent.pe.kr 페이지를 열면 아파치 웹서버에 의해서 페이지가 뜨고, http://www.sragent.pe.kr:8080 페이지를 열면 톰캣에 의한 페이지가 뜨는 상황입니다.
우리가 원하는 것은 http://lab.sragent.pe.kr 페이지를 열면 톰캣에 의해 열리는http://www.sragent.pe.kr:8080/lab 페이지가 보이도록 하고 싶은 것입니다. 최종적으로 원하는 것은 저것이지만, 좀 단계적으로 설명하기 위해서 일단 http://www.sragent.per.kr/lab 이라고 하면, http://www.sragent.pe.kr:8080/lab 페이지를 열어주는 것까지만 먼저 해보도록 하겠습니다.
원래 제가 알고 있던 아파치와 톰캣의 연동 방법은 mod_jk 모듈을 이용하는 방법이었는데요, 찾아보니 mod_proxy를 사용하는 방법이 속도도 빠르고, 설정도 훨씬 단순해서 이 방법을 사용하기로 했습니다. 두 방법의 기능 차이는 잘 모르겠습니다. 암튼, mod_proxy를 사용하기 위해 먼저,
httpd.conf 파일에 아래와 같이 세개의 모듈을 load하는 부분을 추가합니다.

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_http_proxy.so
LoadModule proxy_ajp_module modules/mod_ajp_proxy.so

mod_proxy를 사용하는 방법도 http 프로토콜을 이용하는 방법과 ajp 프로토콜을 이용하는 방법이 있는데요, 프로토콜에 따라서 아래 두줄 중에 하나는 지워도 상관이 없습니다. 아파치 모듈을 컴파일 하는 방법에 대해서는 생략하도록 하겠습니다. 저는 Ubuntu server 버전의 리눅스를 사용하고 있는데, 기본적으로 설치를 하니까, 저 아파치 모듈들은 이미 설치가 되어 있더군요. 그래서 설정만 추가했습니다.
다음으로 proxy를 이용한 호출 설정 부분을 추가해야 합니다. 마찬가지로 httpd.conf 파일에 다음과 같이 추가합니다.

ProxyPass /lab http://localhost:8080/lab
ProxyPassReverse /lab http://localhost:8080/lab
ProxyVia On

혹시 ajp 프로토콜을 이용하고자 하고, 톰캣 ajp connector가 8081 포트에서 listen하고 있다면, ajp://localhost:8081/lab 이렇게 수정해 주면 되겠죠.
보는 것처럼 의미가 명쾌합니다. /lab 으로 들어오는 요청은 http://locahost:8080/lab 요청한 결과를 대신 보내줘라 이런 내용입니다.

아파치 가상 호스트 설정
아파치 가상호스트 설정은 제 환경에서는 /etc/apache2/sites-enabled/000-default 파일에 있더군요. 이 파일에 추가해도 되고, httpd.conf 파일에 추가해도 됩니다. 어차피 apache2.conf 파일에서 include되어 지는 파일들이니까요.
저는 000-default 파일을 수정했습니다. 원래는

NameVirtualHost *:80
<VirtualHost *:80>
    DocumentRoot /var/www
    ServerName www.example.com
    ...
</VirtualHost>

이렇게 가상호스트 하나만 되어 있는 것을 다음과 같이 수정하고, 추가합니다.

NameVirtualHost *:80
<VirtualHost *:80>
    DocumentRoot /var/www
    ServerName www.sragent.pe.kr
    ...
</VirtualHost>
<VirtualHost *:80>
    DocumentRoot /var/www/blog
    ServerName blog.sragent.pe.kr
    ...
</VirtualHost>

생략된 부분은 그냥 복사해서 붙이면 됩니다. 이렇게 하면,
www.sragent.pe.kr, blog.sragent.pe.kr 두개의 호스트에 각각 맞는 Document Root 디렉토리를 찾아서 열게 됩니다. 마지막으로, lab.sragent.pe.kr 호스트에 대해서는  tomcat으로 연결하는 부분을 추가해야 하는데요, 이 부분은 위에서 얘기했던 아파치와 톰캣을 mod_proxy로 연결하는 부분을 가상호스트 설정 안에다가 약간 바꿔서  옮겨 적으면 됩니다.

<VirtualHost *:80>
   ServerName lab.sragent.pe.kr
   ProxyPass / http://localhost:8080/lab/
   ProxyPassReverse / http://localhost:8080/lab/
   ProxyVia On
</VirtualHost>

맨뒤에 /lab/  부분이 '/' 로 끝나는 것에 주의해야 합니다. 안 그러면 경로를 못찾습니다.
이렇게 하면 최종적으로 lab.sragent.pe.kr 가상 호스트로 들어온 요청은 http://localhost:8080/lab/ 페이지를 보여주게 됩니다.
이상입니다. 아 그리고 물론 아파치 설정으로 바꿨으면 restart를 당근 해줘야겠지요.