[mod_jk] Apache 2 + Tomcat 5.0 + mod_jk 1.2 on Linux 연동 프로그래밍

Apache 2 + Tomcat 5.0 + mod_jk 1.2 on Linux 연동할 일이 생겨서 정리해둔다.
이미 내가 예전에 정리했던 문서들을 참조하는 것도 도움이 될것이다.

왜 mod_jk2 가 아니라 mod_jk로 선택했는가? mod_jk2 는 자카르타 프로젝트에서 단종되었다.

현재 이 문서 작성시 작업한 리눅스는 CentOS 3.4 이다.

톰캣과 연동시 컨텍스트는 "/" 이다.

참조 URL:
* http://johnturner.com/howto/apache2-tomcat4112-sol8-howto.html
* http://galatea.com/flashguides/home
Apache 2
패키지로 설치했다.

그외에 libtool과 autoconf 등이 설치되어 있어야 한다.

$ yum install httpd httpd-devel

아파치2를 직접 컴파일하고자 하는 경우 다음과 같이 한다.
# ./configure --with-layout=Apache --prefix=/usr/local/apache2 --enable-module=most --enable-mods-shared=most
# make
# make install

이 경우 "/usr/local/apache2" 디렉토리에 아파치가 설치된다.

mod_jk 컴파일
http://ftp.apache-kr.org/jakarta/tomcat-connectors/jk/source/에서 최신 버전의 mod_jk 를 받는다. 리눅스에서 작업하려면 소스를 받고, 그 외의 플랫폼에 이미 컴파일된 바이너리가 있다면 그것을 사용해도 된다.

$ cd jakarta-tomcat-connectors-1.2.버전-src/jk/native
$ ./configure --with-apxs=/usr/sbin/apxs --enable-EAPI
$ make
$ cd apache-2.0
$ ls mod_jk.so
$ cp mod_jk.so /usr/lib/httpd/modules/


mod_jk의 컴파일이 끝났고, ./apache-2.0 디렉토리로 이동해서 보면 mod_jk.so 파일이 생성되었음을 볼 수 있다. 이 파일을 아파치 모듈 디렉토리(/usr/lib/httpd/modules, 아파치를 직접 컴파일하거나, 다른 배포판을 사용한다면 다를 수 있다)에 복사한다.

workers.properties 설정
/etc/httpd/conf/workers.properties 파일을 다음과 같이 생성한다. 물론 디렉토리 경로는 아파치의 설치 형태에 따라 달라질 수 있다.
# BEGIN workers.properties
worker.list=ajp13
worker.ajp13.port=8009
# change this line to match apache ServerName and Host name in server.xml
worker.ajp13.host=localhost
worker.ajp13.type=ajp13
# END workers.properties


httpd.conf의 설정
/etc/httpd/conf/httpd.conf 파일에서 LoadModule 항목이 모여있는 곳에서 다음을 추가한다.
LoadModule jk_module modules/mod_jk.so


DocumentRoot "/var/www/html" 항목을 찾아서 JSP 컨텍스트 루트 디렉토리로 바꿔준다.
ServerName 을 통해 호스트이름과 아파치 접속 포트를 지정한다. 기본은 당연히 80 이다.
그리고 HTML 파일을 지정하지 않고 디렉토리만 지정했을 때 기본적으로 읽어들이는 인덱스 파일 목록에 index.jsp를 추가한다.
DocumentRoot "/home/tomcat/website"
ServerName 웹호스트이름:80
DirectoryIndex index.jsp index.html

# Default Charset
AddDefaultCharset EUC-KR


그리고 mod_jk와 웹 컨텍스트 관련 설정을 다음과 같이 추가한다.
# mod_jk 설치 설정
<IfModule mod_jk.c>
JkWorkersFile "/etc/httpd/conf/workers.properties"
JkLogFile "/var/log/httpd/mod_jk.log"
JkLogLevel emerg

# / 웹 컨텍스트에 *.jsp 요청이 들어올 경우 톰캣으로 넘기라는 설정
JkMount /*.jsp ajp13
</IfModule>

# 보안을 위해 WEB-INF 접근 불가설정
<Location "/WEB-INF/*">
AllowOverride None
deny from all
</Location>

# 보안을 위해 META-INF 접근 불가설정
<Location "/META-INF/*">
AllowOverride None
deny from all
</Location>

# 아래는 examples 웹 컨텍스트에 대한 설정 예제이다.
Alias /examples "/usr/local/jakarta-tomcat-5.0.28/webapps/examples"

<Directory "/usr/local/jakarta-tomcat-5.0.28/webapps/examples">
Options Indexes FollowSymLinks
DirectoryIndex index.html index.htm index.jsp
</Directory>

<Location "/examples/WEB-INF/*">
AllowOverride None
deny from all
</Location>

<Location "/examples/META-INF/*">
AllowOverride None
deny from all
</Location>

JkMount /examples/jsp/security/protected/j_security_check ajp13
JkMount /examples/CompressionTest ajp13
JkMount /examples/SendMailServlet ajp13
JkMount /examples/servletToJsp ajp13
JkMount /examples/snoop ajp13
JkMount /examples/*.jsp ajp13
JkMount /examples/servlet/* ajp13



기왕이면 rotatelogs 로 로그 파일도 매일 바뀌게 설정한다.

톰캣 server.xml 수정
Tomcat 5.x 의 경우 <Connector>에서 설정한 값에 의해 GET 방식의 인코딩이 결정된다. 다음처럼 por="8009"의 커넥트 설정 부분에 URIEncoding="euc-kr" 설정을 추가해야 한다. 참조.
<Connector port="8009"
    enableLookups="false" redirectPort="8443" debug="0"
    protocol="AJP/1.3" URIEncoding="euc-kr"/>


실행한다
이제 아파치와 톰캣을 실행하면 된다.
$ service httpd start
# 혹은 apachectl start

$ cd /usr/local/jakarta-tomcat-5.0.28/bin/
$ startup.sh