#title Apache2와 Tomcat5 연동하기
'''Apache2와 Tomcat5 연동하기'''
[[TableOfContents]]
작성자 : 박상현(브루펜시럽)
2006년 7월 9일 일요일 오전 5시즘 작성을 시작하였습니다. 기후는.. 제주도로 태풍이 북상중이라고 합니다.
= 서론 =
저는 사정상 PHP와 JSP 를 모두 처리해줄 필요가 있었기 때문에 Apache2/Tomcat5 연동 모델을 선택했습니다.
각자 처한 환경에 따라서 이 모델이 최선이 아닐 수도 있습니다. Tomcat5 의 standalone 모드도 고려해주시기 바랍니다. ^^
연동시 사용되는 connector 에는 mod_jserv, JK, !JK2, mod_webapp or mod_proxy 등이 있습니다.
자세한 내막은 알지는 못하지만 jserv 와 mod_webapp 는 오래전부터 외면받아온 것 같고
!JK2 는 개발자들의 흥미 부족을 이유로 개발이 중단되었습니다.
따라서 JK 와 mod_proxy 가 남는 데.. Apache2.2 부터는 mod_proxy_ajp 모듈이 제공됩니다.
국내에서는 해당 모듈을 이용한 연동 사례를 찾을 수 없어서 도전해보았습니다.
연동시 테스트된 환경은 다음과 같습니다.
||OS || Fedora core 5 ||
||Apache2.2 || httpd-2.2.2-1.0 ||
||Tomcat5.5 || tomcat5-5.5.15-1jpp_6fc ||
||Java || jdk 1.5.0_07 ||
리눅스에 입문한지 얼마 안되어서 !FC5 외의 환경에 대해서는 잘 알지 못하기 때문에
테스트에 사용된 설치 방법이 제공되지 않거나 적절하지 않을 수 있으며 언급된 경로등이 다를 수 있습니다.
find / -name {대상} 혹은 which {대상} 등으로 적절한 경로를 확인하시기 바랍니다.
= Apache 2.2 =
* yum 을 이용해서 관련 rpm 패키지들을 설치합니다.
{{{
# yum -y install httpd\*
}}}
* httpd.conf 파일을 열어서 다음에 언급된 구문들을 찾아서 수정해줍니다.
각 문구들이 의미하는 바에 대해서는 별도의 문서를 참고하여 주시기 바랍니다.
제가 수정한 부분에 대해서만 언급하였습니다.
{{{
# vim /etc/httpd/conf/httpd.conf
}}}
서버관리자의 email 주소를 입력해줍니다. 에러페이지에 표시됩니다.
{{{
ServerAdmin root@localhost
}}}
주석을 풀어줍니다. 브라우저에서 http://127.0.0.1/~계정 으로 접속하면 /home/계정/public_html/ 에서 웹문서을 찾게 됩니다.
{{{
UserDir public_html
}}}
언어별 우선 순위라고 합니다. ko 를 맨 앞으로 옮겨줍니다.
{{{
LanguagePriority ko en ca cs da de el eo es et fr he hr it ja ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW
}}}
UTF-8 을 사용하기엔 아직 환경이 충분히 조성되지 않은 것 같습니다. 인코딩 방식을 EUC-KR로 변경해줍니다.
{{{
AddDefaultCharset EUC-KR
}}}
* 방화벽에서 80번 포트가 열렸는 지 확인합니다.
* 아파치 데몬을 시작합니다.
{{{
# service httpd start
}}}
* 브라우저에서 http://127.0.0.1/ 로 접속해봅니다. 참고로 페도라에서는 Fedora Core Test Page 가 떴습니다.
* 아파치 데몬을 끝내려면 다음과 같이 입력합니다.
{{{
# service httpd stop
}}}
= !J2SE =
Fedora core 5 에서는 JDK 5.0 을 rpm.bin 을 받아서 설치할 경우에 각종 경로 설정 문제가 발생하게 됩니다.
따라서 다음 싸이트에 나와있는 방법을 사용했습니다. http://www.fedorafaq.org/#java
그 외의 환경에서는 JavaInstallation 에 나와있는 설치 방법을 따르시기 바랍니다.
* sun.com 홈페이지에서 다운로드 받습니다.
Linux Platform - J2SE(TM) Development Kit 5.0 Update 7 - Linux self-extracting file ( Linux RPM in self-extracting file 이 아닙니다. )
http://javashoplm.sun.com/ECom/docs/Welcome.jsp?StoreId=22&PartDetailId=jdk-1.5.0_07-oth-JPR&SiteId=JSC&TransactionId=noreg
* rpm-build 패키지를 설치합니다.
{{{
# yum -y install rpm-build
}}}
* 다운 받은 JDK 파일을 빌드를 위해서 source 디렉토리로 이동 시킵니다.
{{{
# mv jdk-1_5_0_07-linux-i586-rpm.bin /usr/src/redhat/SOURCES/
}}}
* JPackage 사이트에서 Java 1.5.0.07 Source RPM. 을 다운 받습니다. - http://www.jpackage.org/rpm.php?id=3557
http://mirrors.dotsrc.org/jpackage/1.6/generic/non-free/SRPMS/java-1.5.0-sun-1.5.0.07-1jpp.nosrc.rpm
* java rpm 을 빌드합니다.
{{{
# rpmbuild --rebuild java-1.5.0-sun-1.5.0.07-1jpp.nosrc.rpm
}}}
꽤 오래 작업합니다. 커피 드시면서 기다립니다.
* 빌드된 rpm 을 설치합니다.
{{{
# yum -y localinstall /usr/src/redhat/RPMS/i586/java-1.5.0-sun-*
}}}
제 경우에는 nosigned 메시지와 함께 설치가 되지 않았습니다. 이 경우에는 rpm -Uvh 로 설치해주면 됩니다.
설치하는 패키지 중에 unixODBC-devel 패키지에 의존성이 있는 패키지가 있으니 먼저 설치해줍니다.
{{{
# yum -y install unixODBC-devel
# rpm -Uvh ~~
}}}
* 설치가 정상적으로 되었는 지 확인해봅니다.
{{{
# java -version
}}}
java version "1.5.0_07" 과 같이 나오면 성공입니다.
만약 1.4.2 버전으로 나온다면 alternatives 에서 java 가 manual mode로 1.4.2 버전 디렉토리를 링크로 삼고 있을 수 있습니다.
다음과 같이 입력하시거나
{{{
# alternatives --auto java
}}}
다음과 같이 입력한 후에 1.5.0 버전 경로를 선택해주시면 됩니다.
{{{
# alternatives --confige java
}}}
= Tomcat 5.5 =
* yum 을 이용해서 관련 rpm 패키지들을 설치합니다.
{{{
# yum -y install tomcat5\*
}}}
* 방화벽에서 8080포트를 열어줍니다.
* 다음 파일을 수정합니다.
{{{
# vim /usr/share/tomcat5/bin/relink
}}}
이 구문을 찾아서 -type d 옵션을 뒷편으로 옮겨준다.
find /var/lib/tomcat5/webapps -type d -mindepth 1 -maxdepth 2
{{{
find /var/lib/tomcat5/webapps -mindepth 1 -maxdepth 2 -type d
}}}
* 다음 파일을 수정합니다.
{{{
# vim /usr/share/tomcat5/conf/workers.properties
}}}
{{{
#workers.tomcat_home=/var/tomcat
workers.tomcat_home=/usr/share/tomcat5
#workers.java_home=/opt/IBMJava2-13
workers.java_home=/usr/lib/jvm/java
}}}
* tomcat5 admin툴에서 사용되는 계정 정보가 담겨 있습니다. 수정해줍니다. ( adminpassword 부분은 원하시는 패스워드를 입력하세요. )
{{{
# vim /usr/share/tomcat5/conf/tomcat-users.xml
}}}
{{{
}}}
* 사용자 계정을 지원하기 위하여 수정해줍니다.
{{{
# vim /usr/share/tomcat5/conf/server.xml
}}}
{{{
...
...
}}}
적절한 호스트 아래에 다음의 Listener를 추가하게 되면 /etc/passwd 파일을 참고로 해서
http://127.0.0.1:8080/~user_account 로 들어온 접속을 /home/user_account/public_html 로 연결하여 준다고 합니다.
* tomcat을 실행합니다.
{{{
# service tomcat5 start
}}}
브라우저에서 http://127.0.0.1:8080/로 접속해봅니다. 고양이가 나타나면 OK.
* 이제 tomcat을 종료시킵니다.
{{{
# service tomcat5 stop
}}}
= mod_proxy_ajp =
mod_proxy_ajp.conf 에 기술된 mod_proxy_ajp 을 이용하는 방법은
다음과 같이 설정하여 줌으로서 특정 URL로 들어온 요청은 전부 톰캣이 처리하게 하는 것입니다.
{{{
ProxyPass /tomcat/ ajp://localhost:8009/
}}}
이 경우에는 jsp나 서블릿과 html 문서와 이미지등을 서로 경로를 구분해서 저장해야 본래의 목적을 달성할 수 있다는 문제점이 있습니다.
따라서 mod_rewirte 를 이용해서 .jsp 파일만 톰캣이 처리하는 방법을 사용하였습니다.
* proxy_ajp.conf 파일을 열어서 다음과 같이 추가해줍니다.
{{{
# vim /etc/httpd/conf.d/proxy_ajp.conf
}}}
{{{
RewriteEngine On
#RewriteLog /root/mod_proxy_ajp.txt
#RewriteLogLevel 9
RewriteCond %{REQUEST_FILENAME} .jsp
RewriteRule (.*) ajp://localhost:8009$1 [P]
}}}
* Tomcat5 의 홈디렉토리를 /var/www 로 변경해줍니다.
{{{
# cd /usr/share/tomcat5/webapps/ROOT
# mv ROOT ROOT.old
# ln -s /var/www/html /usr/share/tomcat5/webapps/ROOT
# cp -r /usr/share/tomcat5/webapps/ROOT.old/WEB-INF/ /usr/share/tomcat5/webapps/ROOT/WEB-INF
}}}
* 아파치 데몬을 실행합니다.
{{{
# service httpd start
}}}
* tomcat 을 실행합니다.
{{{
# service tomcat5 start
}}}
* 테스트용으로 test.jsp 파일을 작성합니다.
{{{
# vim /var/www/html/test.jsp
}}}
{{{
<%@ page contentType="text/html; Charset=EUC-KR" %>
<%
out.println("Hello");
%>
}}}
* 브라우저에서 http://127.0.0.1/test.jsp 를 열어봅니다. Hello 라고만 나온다면 OK.
= 기타 사항 =
페도라에서 service 명령어를 인식 못할 때는
일반 계정에서 root 계정으로 넘어갈 때 su 라고만 쳐줘서 /sbin 디렉토리가 PATH 에 추가되지 않은 경우일 수도 있습니다.
{{{
# . /etc/profile
}}}
하시면 PATH 가 적절하게 갱신되며 service 명령어가 제대로 인식될 것입니다. 다음부터는 su - 라고 입력하시는 게 바람직합니다.
뭐 제가 잘 몰라서 그랬습니다. 흐늘흐늘
= 참고 사이트 =
아래의 문서들 덕분에 무사히 항해를 마치고 라꾸라꾸 속으로 들어가봅니다. 감사합니다.
* tomcat5 apache2 mod_jk.so 연동 - 2006/06/12 [[BR]]
http://kldp.org/node/71058
* 아파치 서버의 최근 개발 동향 - 2005/07/31 [[BR]]
http://www.yeskisti.net/yesKISTI/Briefing/Analysis/TrendView.jsp?seq=93277&What=TREND&Type=THEME&Query=((CC1:F))
* 아파치와 톰캣 프록시로 연결하기 - 2002/08/18[[BR]]
http://www.javaservice.net/~java/bbs/read.cgi?m=appserver&b=engine&c=r_p&n=1029620887&k=프록시&d=tb#1029620
* mod_jk is dead. Long live mod_proxy_ajp - 2006/02/01[[BR]]
http://getahead.ltd.uk/blog/joe/2006/02/01/1138781915484.html
* Apache Module mod_proxy_ajp [[BR]]
http://httpd.apache.org/docs/2.2/en/mod/mod_proxy_ajp.html
* Tomcat FAQ 'Connectors' [[BR]]
http://tomcat.apache.org/faq/connectors.html
* Tomcat 간단히 rpm 으로 -2003.02.24[[BR]]
http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=17142
* 아파치 rewrite 모듈[[BR]]
http://www.superuser.co.kr/apache/rewrite_Module/Apache_rewrite_Module.htm
* Apache Module mod_rewirte[[BR]]
http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html
* 톰캣의 사용자 계정 지원 - 2002.12.16[[BR]]
http://www.javaservice.net/~java/bbs/read.cgi?b=qna2&c=r_p&n=1039985093
= 피드백 =
뭐라도 괜찮으니 한마디씩 써주고 가세요. ;ㅁ;
음 굿 ㅋ? -- ddakker
잘 읽고 갑니다. 수고에 감사드립니다. :-) -- allieus
좋은 문서 감사합니다. ^^
저희도 proxy_ajp를 사용하는데 저렇게 rewrite를 이용해서 특정 확장자에 대해서만 처리 할 수도 있군요. jk 커넥터보다 훨씬 편하기는 합니다. 좋은 글 감사합니다.
아놔 상현이형;;; 이름이 익숙타했더니 역시형이었어;; -- 멀티 실습조교 ㅋㅋ