Apache + Tomcat 연동 (Windows)
-- written by 박병철
이문서는 설치에 대한 요약만 다루며, 사용자 개개인의 특별한 상황은 고려되지 않았습니다.
설치 환경 :
- os : windos XP
- java : j2sdk1.4.2_07
- apache : 2.0.52
- tomcat : 4.1.30
- mod_jk : mod_jk-1.2.8-apache-2.0.52.so
목 표 :
아파치와 톰캣을 연동하여 virtual host를 가능하도록 한다.(컨텍스트 추가 포함)
설 치 :
1. 필요한 파일을 다운받습니다.
-- java : http://dlc.sun.com/jdk/j2sdk-1_4_2_07-windows-i586-p.exe
-- Apache : http://archive.apache.org/dist/httpd/binaries/win32/apache_2.0.52-win32-x86-no_ssl.exe
-- Tomcat : http://mirror.apache.or.kr/jakarta/tomcat-4/v4.1.31/bin/jakarta-tomcat-4.1.31.exe
-- mod_jk : http://mirror.apache.or.kr/jakarta/tomcat-connectors/jk/binaries/win32/mod_jk-1.2.8-apache-2.0.52.so (위에 파일로 따로 올려 놓았습니다.)
==> 위의 링크는 2005.02.17 시점이며, 앞으로 사라질 수 있습니다.
이경우, java는 1.4.x 대 버전, apache는 2.0.x 버전, tomcat은 4.1.x 버전 그리고 mod_jk 는 각각
자기가 다운받은 Apache 버전에 맞는 것을 다운 받으면 됩니다.
(사실 연동을 위해서는 mod_jk를 먼저 찾고, mod_jk 가 지원하는 아파치 버전을 확인후 그에 맞는
Apache 버전을 다운로드 받아야 합니다. mod_jk 의 릴리즈가 더 늦기 때문이지요.
이것은 윈도우이기 때문에 발생되는 현상입니다. 미리 각 아파치 버전에 맞게 윈도우 라이브러리에서
컴파일된 mod_jk.so 파일을 받아야 하기 때문이죠. Linux라면 소스를 받아 새로 컴파일 하기 때문에
이런 버전상의 압박은 좀 덜한 편입니다. )
2. 먼저 서비스할 root 디렉토리부터 만들고 시작하겠습니다.
위치는 아래와 같습니다.
c:/www/yourdomain/log /htdocs/WEB-INF/src /lib /classes |
위에 올려놓은 파일에 config.zip을 풀어보면 위 경로를 그대로 압축한 폴더가 있으니
귀찮으신분은 C:/ 밑에 그대로 풀어놓으셔도 됩니다.
==> 서버 연동 설정은 점 하나, 글자 하나 틀려도 안되는 경우가 많으니 일단 저위치 그대로
잡아 놓고 연동이 잘 되는 것을 확인한 후 나중에 yourdomain만 자신의 dns name으로 바꾸던지
아니면 아예 root 디렉토리를 바꾸시던지...여하튼 강좌 그대로 먼저 하시는게 좋을 것 같군요..
3. 각 파일들을 설치합니다.
1) 자바 : j2sdk.....exe를 꾹 눌러 그냥 끝까지 설치 합니다.
( c:/ 밑에 j2sdk.... 디렉토리가 생겼는지 확인합니다.)
내컴퓨터 => 속성 => 고급 => 환경변수를 열어 다음을 설정 해 줍니다.
1. path에 다음을 추가합니다.
C:\j2sdk1.4.2_07\bin
2. JAVA_HOME = C:\j2sdk1.4.2_07 을 설정해 줍니다.(톰캣 설치시 필요)
2) Apache : exe를 눌러 설치하고, 설치 중간에 domain과 serverName 설정하는 부분은 자신에 맞게
설정하시면 됩니다. 없으면, localhost로 설치 하세요.
그리고 아파치 디렉토리 설정에서는 c:\apache2\ 밑으로 까세요
그러면 c:\apache2\Apache2 가 Apache 홈 디렉토리가 됩니다.
3) Tomcat : exe를 눌러 설치하시고, 설치옵션에서는 전부 선택해서 깔도록 합니다.
톰캣 디렉토리는 c:\tomcat4131로 하세요
port : 8080 에 user name과 password 도 알맞게 넣습니다.
4) mod_jk : 다운 받은 xxxx.so 파일을 아파치 홈 디렉토리의 modules 폴더 안에다 옮겨 놓으세요
5) tomcat이 설치된 곳의 (톰캣 홈 디렉트리) /webapps/ROOT/WEB-INF/web.xml을
위에서 우리가 홈으로 만들려고 만들어놓은 디렉토리의 /htdocs/WEB-INF/ 밑으로
복사해 놓습니다. 나중에 servlet mapping 하려면 필요합니다.
환경설정 :
브라우저에서 먼저 아파치와 톰캣을 각각 확인해 보겠습니다.
"서비스"를 열어 Apache 와 tomcat 이 실행중인지 보고, 실행중이 아니면 실행시켜놓습니다.
(아파치 실행이 혹시 안되는 분은 IIS가 돌고 있는지 확인해보세요)
이제 확인이 되었으면, 두개 모두 서비스에서 종료시켜 주세요. 이제 환경설정을 해 줄 차례입니다.
내컴퓨터 => 속성 => 고급 => 환경변수를 열어 다음을 설정 해 줍니다.
CLASSPATH = .;C:\tomcat4131\common\lib\servlet.jar
APACHE_HOME = C:\apache2\Apache2
TOMCAT_HOME = c:\tomcat4131
여기까지 하셨으면 시스템 상에 필요한 건 다 해준 셈입니다.
이제 Apache 와 tomcat 관련 conf 파일들만 수정하면 되는데, 여기까지 제가 쓴것과 모든 path를 똑같이
맞춰오신 분이면, 위의 config.zip에 있는 각 설정 파일들을 각 디렉토리로 이동시키는 것으로 설정은 끝나게
됩니다.
httpd.conf => $APACHE_HOME/conf/httpd.conf
server.xml => $TOMCAT_HOME/conf/server.xml
web.xml => $TOMCAT_HOME/conf/web.xml
workers.properties => $TOMCAT_HOME/conf/jk/workers.properties
각 경로상에 이미 파일이 존재하고 있으면 반드시 백업하길 권장해 드립니다.
workers.properties 는 tomcat의 conf 디렉토리 밑에 jk 디렉토리를 만들고 그 안에 넣으셔야 합니다.
경로를 다르게 설정 하신 분이라면 아래와 같이 설정을 해줍니다.
httpd.conf :
DriectoryIndex 부분을 찾아 인덱스 우선순위를 바꿔줍니다. DirectoryIndex index.jsp index.html 파일의 맨 끝에 아래를 추가 합니다. LoadModule jk_module modules/mod_jk-1.2.8-apache-2.0.52.so # 가상 호스트를 구성합니다. <VirtualHost localhost>
JkMount /*.jsp ajp13 |
server.xml
<Server port="8005" shutdown="SHUTDOWN" debug="0"> <!-- 아래에 다음을 추가합니다. --> modJk="c:/apache2/Apache2/modules/mod_jk-1.2.8-apache-2.0.52.so" />
<!-- 가상 호스트를 구성합니다. --> <Host name="localhost" debug="0" appBase="c:www/yourdomain/htdocs" <!-- 아래에 다음을 추가합니다. --> <!-- 로그가 찍히는 위치를 바꿔 줍니다. --> <Logger className="org.apache.catalina.logger.FileLogger" <!-- 루트 컨텍스트를 설정 해 줍니다.(path="/"라고 설정하면 안됩니다.) --> <Context path="" docBase="c:/www/yourdomain/htdocs/" debug="0" reloadable="true"/> </Host>
|
web.xml
<!-- 아래 부분은 원래 주석으로 막혀 있습니다. servlet 지원을 위해 주석을 풀어주세요 --> <servlet-mapping>
<!-- 아래는 index 파일 우선순위를 변경해 줍니다. --> <welcome-file-list> <!-- 디렉토리 서비스를 막기위해 listings 부분을 false로 해주세요. --> <servlet> |
workers.properties
# 아래 네줄이 workers.properties의 내용입니다. 저 위에 적혀있는 경로로 파일을 만들어 놓습니다. worker.list=ajp13 |
분홍색 부분은 path에 신경 써주세요
노란색 부분은 주의하세요
한글 주석은 에러의 원인입니다 . 복사후 한글 주석은 모든 conf 파일에서 제거해주세요
초록색의 loalhost 는 가상호스트를 맞추는 작업임을 강조한 색깔 입니다.
테스트
이제 모든 환경설정이 끝났습니다. 테스트를 할 차례 이지요
위에서 설정한 홈 디렉토리에 index.jsp를 만들고 (config.zip 안의 www 폴더에 테스트용이 들어가 있습니다.)
테스트 준비를 합니다.
"서비스" 를 열어 톰캣, 아파치의 순서대로 서비스를 동작 시키고,
브라우저에서
http://localhost:8080/index.jsp
을 확인해 봅니다. 똑같은 결과가 나오면 연동에 성공한 것입니다.
이제 톰캣의 8080 서비스를 막기위해 server.xml에서 다음 부분을 주석 처리 해줍니다.
<!-- <Connector className="org.apache.coyote.tomcat4.CoyoteConnector" --> |
컨텍스트 추가
먼저 이 부분을 이야기 해야 겠군요 . 톰캣 홈 디렉토의 conf 밑에 보면 auto 폴더를 확인해 보세요
이 폴더 안에 보면 mod_jk.conf 라는 파일이 있습니다. 이 내용을 보면,
########## Auto generated on Fri Feb 18 15:11:36 KST 2005########## <IfModule !mod_jk.c> JkWorkersFile "C:/tomcat4131/conf/jk/workers.properties" JkLogLevel emerg <VirtualHost localhost> ..... .... .... |
이렇게 되어 있는데요 Auto generated...... 라는 말이 주석으로 되어있고, 우리가 Apache의 httpd.conf
파일에 환경 설정 해놓았던 것이 그대로 적혀있고, 그 밑에는 localhost로 시작하는 Virtual 호스트 셋팅이
있는 것을 보실 수 있습니다.
사실 이것은 우리가 위부분 톰캣의 server.xml 설정할 때 추가시켜준 Listener 가 이러한 역할을 해주는 것인데요
톰캣이 부팅하면서 자신의 host 와 context를 읽어 Apache에서 자동으로 Virtual host를 잡아 줄 수 있도록
설정 파일을 만들어 주는 것입니다.
다른 연동 강좌를 보면 그냥 이 파일을 Apache에서 Include 하라고 되어 있습니다. 다음과 같이 말이죠
Include c:/tomcat4131/conf/auto/mod_jk.conf
사실 이렇게 하면 관리자의 입장에서 편하죠 . 왜냐하면 아파치 쪽은 신경 쓰지 않고도 그냥
톰캣에서만 host 추가나 Context 추가만 해주면, 자동으로 mod_jk.conf 가 만들어지고 그 설정을
바로 아파치가 읽어 가니 아파치 쪽은 손댈 이유가 없기 때문이죠
그런데 이 문서에서 제가 수동으로 Apache 쪽에 설정을 해준 이유가 있습니다.
위와 같이 Include 만하면 컨텍스트 추가나 host를 추가했을 경우 인식은 잘 되지만
바로 루트 컨텍스트연동이 제대로 안된다는 점입니다. 실제로 mod_jk 안에 VirtualHost 부분을 보면,
root 컨텍스트에 대한 부분이 없으며, 그렇다고 해서 server.xml 의 root 컨텍스트 부분에
<Context path="/" docBase="c:/www/yourdomain/htdocs/" debug="0" reloadable="true"/>
이렇게 슬래쉬(/)를 넣어주면 mod_jk.conf 에는 root 컨텍스트가 추가는 되지만 서비스가 정상적으로
되지 않습니다.
따라서 저의 경우는 일단 루트 컨텍스트를 따로 httpd.conf에 지정 해 놓고
다른 컨텍스트가 추가해야 되는 경우는 아래와 같이 합니다.
만약 /dba 라는 컨텍스트를 추가한다면,
server.xml
<Context path="/dba" docBase="D:/eclipse/workspace/dba/" debug="0" reloadable="true" > |
httpd.conf
# 가상 호스트를 구성합니다.
<VirtualHost localhost>
JkMount /*.jsp ajp13
#################### localhost:/dba #################### # Static files <Directory "D:/eclipse/workspace/dba">
<Location "/dba/META-INF/*"> <Directory "D:/eclipse/workspace/dba/META-INF/"> JkMount /dba/servlet/* ajp13 </VirtualHost> |
Alias : 아파치에서는 DocumentRoot 로 선택된 곳만 알고 있기 때문에 톰캣쪽에만 컨텍스트를
추가하면 apache는 DocumentRoot 하위 패스에서만 찾기 때문에 정상적인 서비스를 못합니다.
그래서 Alias로 해당 컨텍스트를 등록? 한다고 보시면 됩니다.
<Directory...> : directory 에 대한 접근 권한을 줘야 합니다.
WEB-INF 나 META-INF 는 Alias만 설정하면 노출되기 때문에 보이지 않도록 해줍니다.
이상이 추가되는 내용이었습니다. 그럼 AutoGenerate 되는 $TOMCAT_HOME/conf/auto/mod_jk.conf 부분은
필요 없지 않을까요? 하지만 제가 수동으로 아파치를 설정함에도 불구하고
일부러 mod_jk,conf 로 설정파일이 자동으로 generate 되게 놔둔 이유는, 아무리 아파치 쪽에
수동으로 설정하더라도 컨텍스트 하나 추가 할때 마다 저 많은 설정을 일일이 손봐주기가 힘들기 때문에
일단 컨텍스트를 톰캣 쪽에만 추가하고 톰캣을 재실행 한뒤 conf/auto/mod_jk.conf 에서
context 가 추가된 부분만 복사해서 httpd.conf 쪽에 복사해주고 Apache만 재실행 하면 편하게 setting
할 수 있기 때문에 이 설정을 놔 두었습니다.
Host 추가
가상 호스트를 추가 하는 경우는 쉽습니다.
그냥 apache 쪽의 httpd.conf에 있는 <VirtualHost> 부분과 tomcat 쪽의 server.xml에 있는 <host>
섹션만 똑같이 새로 추가하는 domain 으로 만들어 주면 되기 때문이죠.
가령 www.aabbcc.org 를 추가한다 하면,
httpd.conf
<VirtualHost www.aabbcc.org>
JkMount /*.jsp ajp13 |
server.xml
<Host name=www.aabbcc.org debug="0" appBase="webapps"
<Logger className="org.apache.catalina.logger.FileLogger"
<Context path="" docBase="c:/www/aabbcc/htdocs/" debug="0" reloadable="true" > </Host> |
이렇게만 하면 되겠습니다.
질문 :
이 문서를 보시는 분들께 여쭤봅니다 . 저같은 경우는 mod_jk.conf를 Include 하지 않고 수동으로
전부 설정하는데, 이유는 위에 말씀드렸듯이 자동 설정 구성을 이용하게 되면 root 컨텍스트가
잘 인식이 안되기 때문에 그런 것이었습니다.
혹시 자동구성을 사용하면서 루트 컨텍스트를 인식하게 하는 방법을 알고 계신분 있으신가요?
알고 계시면 말씀해 주세요.
혹시 mod_jk2 를 이용해서 연동하면 되려나? ㅡㅡ;
세계적으로 보면 jk2를 실패한 프로젝트로 인식하고 다시 mod_jk로 회기 한다는
그래서 version up도 mod_jk 가 더 빠르다는 소문이 돌던데 이야기는 사실인지 몰겠습니다.
끝 :
아파치의 httpd.conf 나 톰캣의 server.xml, web.xml은 연동에 관련된 부분 말고도 더욱 많은 기능을
제공하기위해 다양한 옵션이 존재 합니다. 여기서는 그런 부분(연동과 필요없는 부분)은 다루지
않았습니다.
쓰고 나서 보니 보기힘든 문서가 되어 버렸군요..
시간을 내서 깔끔하게 정리할 수 있도록 할께요...^^;
다음 번엔 어떻게 mod_jk 모듈이 apache와 tomcat을 연동하여 사용자의 리퀘스트를
선별하여 (jsp와 servlet 만 tomat 으로 보내죠...) 서비스 하는지 알아보겠습니다.
이문서의 잘못된 점은 가차없이 지적해 주시기 바랍니다.
문서도 발전해야 결국 좋은 문서가 됩니다. ^^;