mod_jk 사용법
By Gal Shachor <shachor@il.ibm.com>
Trans By Kenu <heogn@shinbiro.com>
목차
mod_jk 는 이전의 mod_jserv의 대치용입니다. Tomcat 과 Apache 를 연동하는 아주 새로운 Tomcat-Apache plugin 입니다.
여러 이유:
- mod_jserv 는 너무 복잡해. Apache/JServ로부터 나왔기 때문에, Apache에 필요없는 수많은 JServ 용 코드가 있습니다.
- mod_jserv 는 오직 Apache에만. Tomcat 은 jk 라이브러리를 통해 많은 웹서버를 지원합니다. 지원, 문서화, 버그 수정의 측면에서 두가지 다른 작업모드를 지원한다는 것은 문제 많을 여지가 있습니다. mod_jk 는 그것을 수정합니다.
- jk library 의 계층화된 접근법은 Apache1.3.x 과 Apache2.xx. 모두를 보다 쉽게 지원합니다.
- SSL을 보다 강력하게 지원. mod_jserv HTTP 와 HTTPS 각각의 요청을 구분하지 못합니다. mod_jk 는 새로운 Ajpv13 protocol을 사용해서 구분해서 처리합니다.
새롭고 단순한 설치기법을 알 필요가 있겠죠. 이 기법을 알게된다면 IIS나 Netscape 같은 웹서버에 Tomcat을 연동할 때 아주 쉽게 할 수 있을 것입니다.
이 문서에서 사용되는 단어들의 뜻은 다음과 같습니다:
용어 |
의미 |
Worker process |
worker는 웹서버로부터의서블릿 요청을 처리하기 위해 동작하는 tomcat 인스턴스입니다. 대부분 하나의 worker 가 있습니다(하나의 유일한 tomcat process).그러나 때로는 load 밸런싱이나 site 파티셔닝을 위해 여러개의 worker를 띄우게 됩니다. 각각의 worker 는 자신이 자리잡은 호스트, 열려있는 포트, 메시지 교환에 사용되는 통신프로토콜에 의해 웹서버에서 구분되어집니다. |
In process worker |
특별한 worker입니다. 다른 프로세스에 상주하고있는 Tomcat process 와 동작하는 대신, 웹서버가 JVM을 열어서 웹서버 process 주소 공간에서 Tomcat을 내부적으로 실행합니다. 이 문서에서는 다루지 않는 내용입니다. |
Web server plugin/tomcat redirector |
Tomcat이 다른 웹서버와 함께 운영될 때 웹서버에 설치해서 웹서버로 들어오는 servlet 요청을 Tomcat으로 보내는 역학을 합니다. 웹서버 플러그인이고, 이 문서에서는 웹서버플러그인으로 mod_jk를 소개합니다. 이 전송자는 서버에 플러그인 되기 위해 DLL(win32) / shared object(linux) 모듈 형태로 되어 있습니다. |
Plugin configuration |
여러 다른 Tomcat worker가 동작할 경우 요청이 어느 곳으로 전달되야 할 지 구분하기 위해 웹서버플러그인을 설정할 필요가 있습니다. 로그레벨 같은 몇가지 내부 파라미터에 수반된 이 정보가 플러그인 설정을 구성합니다. |
Web server configuration |
각각의 서버는 어떻게 동작하는지 정의해주는 설정을 가지고 있습니다. 예를 들면 어느 포트를 사용하는지, 어떤 파일을 보낼지, 어떤 웹서버 플러그인을 불러와야 되는지 등등이죠. Tocmat 전달자를 불러와 사용하기 위해 웹서버 설정을 수정해주어야합니다. |
설치순서는 다음과 같습니다:
- 이전 mod_jserv 설치를 제거합니다. mod_jk 와 mod_jserv 함께 못씁니다!!
- mod_jk 다운받습니다.
- (선택) Tomcat 에서 Ajpv13 protocol 를 사용하도록 설정합니다.
- mod_jk 사용할 worker 를 정의합니다.(또는 quick start 옵션을 사용합니다.)
- mod_jk 에 맞게 Apache를 수정합니다. 그리고 mod_jk 내부도 조정합니다. (또는 quick start 옵션 사용)
- Tomcat에 보내질 URL 을 지정합니다. (또는 quick start 옵션 사용)
Apache에 mod_jserv가 설치되었다면, httpd.conf 파일에서 ApJServMount 지시자를 모두 제거합니다. 만일 tomcat-apache.conf 나 tomcat.conf를 포함하고 있다면 요 줄도 지워줍니다. 이것은 mod_jserv에 맞춰져 있습니다.
Tomcat 배포판을 받았던 곳의 bin 디렉토리에서 Linux와 Win32용 Binaries 파일들 구할 수 있습니다. Linux 에서는 mod_jk.so 로, Win32에서는 mod_jk.dll 로 되어있습니다. 만들어진 mod_jk 가 없다면 손수 만드셔야죠. 소스로부터 직접 만들 수 있습니다. 먼저, Tomcat 용
Source 배포판을 다운받습니다. 다운로드 디렉토리가 무진장 많지만 jakarta-tomcat 만 찾아서 다운받으면 됩니다.
NT 에서
Visual C++ Ver.6.0으로 만듭니다. 직접 만들기 위해서는 이게 깔려있어야 됩니다.
순서는 다음과 같습니다.:
- apache1.3/apache2.0 소스 디렉토리로 이동합니다. 도스창에서요.
- APACHE1_HOME 환경변수를 Apache가 설치된 곳의 위치를 지정해줍니다.
- 다음과 같이 Command 줄에 입력합니다.:
MSDEV mod_jk.dsp /MAKE ALL
msdev 가 path에 잡혀 있지 않다면, msdev.exe의 full path를 입력합니다. 그리고, ApacheCore.lib 파일이 컴파일 되기 전에 APACHE1_HOME\src\CoreD 와 APACHE1_HOME\src\CoreR 디렉토리에 각각 있어야 합니다. 이들 라이브러리를 생성하기 위해 충분한 Apache 소스를 build 할 필요가 있습니다.
- 만들어진 mod_jk.dll 를 Apache의 modules 디렉토리에 복사합니다..
이것은 배포판과 디버그버전을 모두 만듭니다(mod_jk).
다른 방법: mod_jk.dsp 파일을 msdev에서 열어서 build 메뉴로 만들어도 됩니다.
UNIX 에서
Apache 용
- Perl 5 설치되어 있어야 합니다. 모듈을 만드는 apxs 스크립트가 Perl로 짜져있습니다.
- jakarta-tomcat/src/native/apache1.3 (또는 apache2.0) 로 이동합니다.
- apache 배포판에 있는 apxs 명령을 돌립니다. (hint: /usr/local/apache/bin, /usr/sbin, 또는 Apache 인스톨 된 곳을 찾아보세요.). 한줄로 아래 명령을 다 칩니다.
Solaris :
apxs -o mod_jk.so -DSOLARIS -I../jk -I/usr/java/include -I/usr/java/include/solaris -c *.c ../jk/*.c
시스템별로 잘 되겠지만, 만일 "symbol "fdatasync" not found" 에러가 날 때가 있습니다. 수정하려면, -lposix4 를 -c 앞에 추가해 주시면 됩니다.
Linux:
apxs -o mod_jk.so -I../jk -I/usr/local/jdk/include -I/usr/local/jdk/include/linux -c *.c ../jk/*.c
소스 디렉토리가 아닌 ../jk 디렉토리에서 나온 objects 파일들이 현재 디렉토리에 컴파일되기 때문에 실패할 수도 있습니다. 그 때는 gcc -shared -o mod_jk.so *.o 를 돌려서 build 를 마쳐야 합니다.
(다른 디렉토리에 Java를 인스톨했다면 거기에 맞춰주세요.). 끝마쳐야 합니다만 기억할 것은 apxs 에 있는 arguments들의 순서는 중요하다!는 것입니다. For other *nixes you should be able to work it out, but remember that the order of the arguments to apxs is important!.
- mod_jk.so 를 Apache의 libexec 디렉토리에 복사합니다.
다른 웹서버들
여러가지 Makefiles 이
jakarta-tomcat/src/native 디렉토리의 하부 디렉토리에 있습니다.
mod_jk 는 원본 Ajpv12 protocol 또는 새로운 Ajpv13 protocol 양쪽다 사용할 수 있습니다. 후자를 선택했다면, "Ajp13" 커넥션핸들러를 톰캣에서 동작시켜야 합니다. 이로인해 빨라진 프로토콜의 잇점과 HTTPS를 통한 요청을 구분해낼 수 있는 능력을 갖게 됩니다.
아래 코드를
TOMCAT_HOME/conf/server.xml 파일에 추가해 주십시오.
<Connector className="org.apache.tomcat.service.PoolTcpConnector">
<Parameter name="handler" value="org.apache.tomcat.service.connector.Ajp13ConnectionHandler"/>
<Parameter name="port" value="8009"/>
</Connector>
이미
servlet.xml 파일은 이 부분과 유사한 8007포트를 사용하는 Ajp12 connections 을 포함하고 있습니다(mod_jserv 에 의해 전달됨). Ajp13만 사용하고 싶어도, Ajp12 커넥터를 지우지 마시죠(?) - Tomcat의 shutdown에 필요하댑니다.
Quick start?
대부분 단순한 경우 Tomcat은 Apache에 필요한 환경설정 파일들을 생성합니다. Tomcat 이 구동할 때 Apache 를 위해 TOMCAT_HOME/conf/mod_jk.conf-auto 파일을 자동으로 생성합니다. 우리가 할 일은 단지 이 파일을 httpd.conf 파일에 다음과 같이 한줄을 첨가하는 것 뿐입니다.
"Include TOMCAT_HOME/conf/mod_jk.conf-auto"
Ok, 이제 Tomcat 과 Apache를 시작하면 Apache서버에서 Tomcat에 접근할 수 있습니다.
특별한 경우, 예를 들면 기본값이 아닌 URL prefixes 마운팅 시에 이 파일을 커스터마이즈된 설정의 기반으로 삼고, 다른 파일 이름으로 저장합니다. Apache를 직접 관리한다면 새로운 컨텍스트가 추가될 때마다 Apache를 Update해야합니다.
Tomcat 3.2: 새 context 를 추가한 뒤에 tomcat과 apache 모두 재시작해야합니다; Apache는 재시작해야만 변화된 설정값이 적용됩니다.
또한, TOMCAT_HOME/conf/mod_jk.conf-auto 파일은 tomcat이 시작할 때 생성되므로, Apache를 시작하기 전에 Tomcat을 시작해야합니다. Tomcat은 매번 새로 시작할 때마다 TOMCAT_HOME/conf/mod_jk.conf-auto 파일을 덮어씁니다.
수동 workers 설정.
Worker는 TOMCAT_HOME/conf/workers.properties 파일로 설정됩니다. workers.properties howto 문서에는 상당한 분량의 정보가 있고, 먼저 알고 있어야 합니다. 그러나, 급하시다면 workers.properties 파일을 편집하고 workers.tomcat_home, workers.java_home 파일과 시스템에 맞는 ps 변수값들을 세팅하지 않아도 됩니다.
mod_jk를 사용하기 위한 Apache 설정법은 Apache 서버 설정 지시자를 통해 이루어진다; 시작하려면 자동 생성된 Tomcat 의 conf 폴더에 있는 mod_jk.conf-auto 파일을 본다.
- Apache 가 Tomcat을 불러오도록 지시해야 한다. Apache의 LoadModule 과 AddModule 설정지시자를이용한다.
- mod_jk 가 workers.properties 파일의 위치를 알고 있어야 한다. mod_jk의 JkWorkersFile 설정지시자를 사용한다.
- mod_jk가 사용할 log 파일의 위치와 로그 수준을 정해주어야 합니다. JkLogFile 과 JkLogLevel 설정지시자를 사용합니다. 로그 레벨의 종류는 debug, warn, error, emerg 이며 warn은 기본값입니다.
httpd.conf 파일에서 다음과 같은 형태로 작성해주면 됩니다:
LoadModule jk_module libexec/mod_jk.so
AddModule mod_jk.c
JkWorkersFile /usr/local/jakarta-tomcat/conf/workers.properties
JkLogFile /usr/local/apache/logs/mod_jk.log
JkLogLevel warn
mod_jk의 JkMount 지시자를 사용해 지정된 URL 들을 Tomcat으로 할당할 수 있습니다. 일반적으로 JkMount 지시자의 구조는 다음과 같습니다:
JkMount <URL prefix> <Worker name>
예를 들어 다음의 지시자들은 .jsp로 끝나는 요청들이나 /servlet 으로 시작하는 모든 요청들은 "ajp13" worker로 보냅니다. 그러나 /otherworker 에 있는 .jsp 요청은 "remoteworker" 로 보냅니다.
JkMount /*.jsp ajp13
JkMount /servlet/* ajp13
JkMount /otherworker/*.jsp remoteworker
httpd.conf 파일에서
JkMount 지시자를 Top레벨 이나
<VirtualHost> 섹션 내부에 둠으로 사용할 수 있습니다.
끝났습니다! 이제 Tomcat과 apache를 시작함으로 두 서버가 동작하면서 서블릿과 JSP 파일들을 돌릴 수 있습니다.
Here's an example configuration which probably reflects many real-world setups. A site is using Tomcat and Apache with two virtual hosts (one of them using HTTPS as well, which we're assuming is being handled by mod_ssl).
URLs ending in .jsp and beginning with /servlet are handled by Tomcat, the rest are handled by Apache. The files for each Host are server out of /web/host1 and /web/host2 respectively.
The example are over-simplified and incomplete but should get you started. Also note the virtual host setup is new in Tomcat 3.2 -
this example won't work with Tomcat 3.1.
.
.
<Connector className="org.apache.tomcat.service.PoolTcpConnector">
<Parameter name="handler" value="org.apache.tomcat.service.connector.Ajp12ConnectionHandler"/>
<Parameter name="port" value="8007"/>
</Connector>
<Connector className="org.apache.tomcat.service.PoolTcpConnector">
<Parameter name="handler" value="org.apache.tomcat.service.connector.Ajp13ConnectionHandler"/>
<Parameter name="port" value="8009"/>
</Connector>
<Host name="host1.apache.org">
<Context path="" docBase="/web/host1" debug="0"/>
</Host>
<Host name="host2.apache.org">
<Context path="" docBase="/web/host2" debug="0"/>
</Host>
.
.
|
Table 1 - Excerpt from server.xml showing the Ajp13 Connector and two virtual hosts.
# Setup for Solaris system
#
workers.tomcat_home=/usr/local/jakarta-tomcat
workers.java_home=/usr/java
ps=/
worker.list=ajp12, ajp13
# Definition for Ajp13 worker (Ajp12 left to readers imagination)
#
worker.ajp13.port=8009
worker.ajp13.host=localhost
worker.ajp13.type=ajp13
|
Table 2 - Excerpt from workers.properties showing the Ajp13 worker
# Load mod_jk
#
LoadModule jk_module libexec/mod_jk.so
AddModule mod_jk.c
# Configure mod_jk
#
JkWorkersFile /usr/local/jakarta-tomcat/conf/workers.properties
JkLogFile /usr/local/apache/logs/mod_jk.log
JkLogLevel warn
# First Virtual Host.
#
<VirtualHost 10.0.0.1:80>
DocumentRoot /web/host1
ServerName host1.apache.org
JkMount /*.jsp ajp13
JkMount /servlet/* ajp13
</VirtualHost>
# Second Virtual Host. Also accessible via HTTPS
#
<VirtualHost 10.0.0.2:80>
DocumentRoot /web/host2
ServerName host2.apache.org
JkMount /*.jsp ajp13
JkMount /servlet/* ajp13
</VirtualHost>
<VirtualHost 10.0.0.2:443>
DocumentRoot /web/host2
ServerName host2.apache.org
SSLEngine On
JkMount /*.jsp ajp13
JkMount /servlet/* ajp13
</VirtualHost>
|
Table 3 - Excerpt from Apaches httpd.conf showing JK directives.
Q. mod_jk를 도대체 어디에서 찾을 수 있나요? 어딨어요?
A. Tomcat 의 소스 배포판을 받아서 직접 컴파일(build)해야 합니다. 자세한 내용은
이 섹션을 참고하세요
Q. 어떤 protocol 을 사용해야 합니까? Ajp12 or Ajp13?
A. Ajp13 은 새로운 프로토콜이고, 빠릅고, SSL과도 잘 동작합니다. You almost certainly want to use that. There is more information in the
workers.properties howto document
Q. Tomcat 재시작할 때마다, Apache 가 죽습니다!
A. Ajp13 프로토콜은 Tomcat과 Apache 사이에서 오픈 소켓을 유지합니다. Tomcat을 재시작할 때 Apache도 역시재시작해줘야 합니다.
Q. 더 자세한 정보는?
A. The
workers.properties howto 문서에는 여기보다 상당히 고급 수준의 정보가 있습니다. 한번볼만 합니다. 또는 "mod_jk" 메일링 리스트에 가입하거나 mod_jk 소스를 직접 분석하는 것이죠.
This document was created by Gal Shachor, and was revised by Mike Bremford with help from the countless many on the tomcat-dev and tomcat-user lists!