아파치에 PHP 모듈이 등록되어 있고, JSP를 사용하기 위해 톰캣이 설치되어 있다고 가정한 후 설명한다. 아파치와 톰캣을 연동하기 위해서는 mod_jk.so 모듈을 아파치에 등록한 후 톰캣이 필요한 경우 톰캣에 요청 처리를 위임하는 방법으로 동작한다. mod_jk.so 모듈을 아파치에 등록하면 URL 요청을 분석하여 해당 URL에 톰캣에서 지정한 경우 톰캣에서 요청을 위임 받아 처리하는 방법이다.
설치 환경
설치 방법은 두 가지가 있다.
1. 톰캣 auto-configure 방식
2. 아파치 httpd.conf 설정 파일에 직접 모듈을 등록하는 방법
* mod_jk.so 파일 다운로드
위의 사이트로 접속한 후 해당 운영체제를 선택한다. so 파일을 다운로드 할 때 아파치 서버의 버전을 확인하고 해당 아파치 서버 버전의 so 파일을 다운로드해야 한다. 아파치 서버 버전이 다른 so 파일은 모듈을 등록해도 아파치 서버가 읽지 않는다. 이 때 아파치 서버는 "The requested operation has failed" 에러를 출력한다. 에러 로그를 볼 때는 아파치의 "test configure" 실행파일을 실행하면 된다.
1. 톰캣 auto-configure 방식
톰캣 ${톰캣 경로}/conf/server.xml 파일을 열어 <Engine ... ></Engine>태그 사이에 다음과 같이 모듈을 등록한다.
<Engine name="Catalina" defaultHost="localhost">
<Listener className="org.apache.jk.config.ApacheConfig" modJk="C:/server/Apache2.2/modules/mod_jk.so"/>
</Engine>
<Listener> 태그를 추가한 후 톰캣을 다시 실행한다. 톰캣을 다시 실행한 후 " ${톰캣 경로}/conf/ "에 /auto 와 /jk 디렉토리가 생성된다. /auto 디렉토리에서 mod_jk.conf 파일을 /jk 디렉토리로 복사한다.
mod_jk.conf 파일 내용
<IfModule !mod_jk.c>
LoadModule jk_module "C:/server/Apache2.2/modules/mod_jk.so"
</IfModule>
<VirtualHost localhost>
ServerName localhost
JkMount /manager ajp13
JkMount /manager/* ajp13
JkMount /docs ajp13
JkMount /docs/* ajp13
JkMount /examples ajp13
JkMount /examples/* ajp13
JkMount /host-manager ajp13
JkMount /host-manager/* ajp13
</VirtualHost>
mod_jk.conf 파일을 보면 요청 URL의 매핑을 정의하고 있다. 매핑 URL 주소 뒤에 ajp13이라는 값은 리다이렉트시 어떤 톰캣 컨터이너를 선택하는가를 결정하는 것이다. ajp12는 톰캣 3버전이고 ajp13은 톰캣 4버전~5버전까지이다. 앞의 URL 값이 들어온다면 리다이렉트 시킨다는 것이다.
톰캣을 재 시작한 후 아파치 설정 파일 수정 ( mod_jk.so 파일을 아파치에 등록 )
아파치 설정 파일의 맨 마지막에 생성된 mod_jk.conf 설정 파일을 등록
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>
Include C:servertomcat-6.0.26confjkmod_jk.conf
모듈을 등록했으면 아파치를 다시 시작한다. 이 때 에러가 발생하지 않고 정상적으로 동작한다면 아파치와 톰캣은 연동이 된 것이고 mod_jk.conf 파일에서 지정한 URL값으로 들어오는 요청은 톰캣 컨테이너가 처리하게 된다.
worker.properties 파일 작성 ( ${톰캣 경로}/conf/jk )
workers.tomcat_home = C:servertomcat-6.0.26
workers.java_home = C:serverJavajdk1.6.0_19
worker.list = ajp13
worker.ajp13.port = 8009
worker.ajp13.host = localhost
worker.ajp13.type = ajp13
/*.jsp = worker1
톰캣과 아파치를 재 시작하여 제대로 연동이 되었나 확인해 본다.
이 때 루트 경로를 공유하고자 할 경우가 있다. 즉, 아파치 PHP 루트 경로와 톰캣 JSP 루트 경로를 같이 사용하여 .php 일 경우 PHP 루트 경로를 기준으로 문서를 요청할 수 있고 .jsp 인 경우 톰캣의 루트 경로를 기준으로 문서를 요청할 수 있게 만들고 싶다면아파치 웹 서버의 루트 경로를 .jsp 톰캣의 루트 경로를 지정해야 하며 mod_jk.conf 파일에 jk 모듈을 사용하지 않을 시 경로를 지정해 주어야 한다.
# All URL goes to tomcat except the one containing /home
<VirtualHost *:80>
ServerName testxxx.mysys
DocumentRoot /www/testxxx/htdocs
# Use SetEnvIf to st no-jk when /home/ is encountered
SetEnvIf Request_URI "/home/*" no-jk
# Now /home will goes to /home/dataxxx/
Alias /home /home/dataxxx/
<Directory "/home/dataxxx">
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
JkMount /* myssys-xxx
</VirtualHost>
즉, jk 모듈을 사용하는 모듈을 기본 문서 루트로 잡고 jk모듈을 사용하지 않는 경우(PHP)는 가상으로 문서를 요청하게 해야 한다.