The Jakarta Project The mighty Tomcat - Meow!

mod_jk 사용법

By Gal Shachor <shachor@il.ibm.com>
Trans By Kenu <heogn@shinbiro.com>

목차


mod_jk?

mod_jk 는 이전의 mod_jserv의 대치용입니다. Tomcat 과 Apache 를 연동하는 아주 새로운 Tomcat-Apache plugin 입니다.


왜 mod_jk?

여러 이유:


왜 쓸까?

새롭고 단순한 설치기법을 알 필요가 있겠죠. 이 기법을 알게된다면 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 전달자를 불러와 사용하기 위해 웹서버 설정을 수정해주어야합니다.


Apache에서의 mod_jk 설치

설치순서는 다음과 같습니다:

  1. 이전 mod_jserv 설치를 제거합니다. mod_jk 와 mod_jserv 함께 못씁니다!!
  2. mod_jk 다운받습니다.
  3. (선택) Tomcat 에서 Ajpv13 protocol 를 사용하도록 설정합니다.
  4. mod_jk 사용할 worker 를 정의합니다.(또는 quick start 옵션을 사용합니다.)
  5. mod_jk 에 맞게 Apache를 수정합니다. 그리고 mod_jk 내부도 조정합니다. (또는 quick start 옵션 사용)
  6. Tomcat에 보내질 URL 을 지정합니다. (또는 quick start 옵션 사용)

1. mod_jserv 지시자 제거하기

Apache에 mod_jserv가 설치되었다면, httpd.conf 파일에서 ApJServMount 지시자를 모두 제거합니다. 만일 tomcat-apache.conf tomcat.conf를 포함하고 있다면 요 줄도 지워줍니다. 이것은 mod_jserv에 맞춰져 있습니다.

2. mod_jk 구하기, 만들기

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으로 만듭니다. 직접 만들기 위해서는 이게 깔려있어야 됩니다.

순서는 다음과 같습니다.:

  1. apache1.3/apache2.0 소스 디렉토리로 이동합니다. 도스창에서요.
  2. APACHE1_HOME 환경변수를 Apache가 설치된 곳의 위치를 지정해줍니다.
  3. 다음과 같이 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 할 필요가 있습니다.
  4. 만들어진 mod_jk.dll 를 Apache의 modules 디렉토리에 복사합니다..

이것은 배포판과 디버그버전을 모두 만듭니다(mod_jk).

다른 방법: mod_jk.dsp 파일을 msdev에서 열어서 build 메뉴로 만들어도 됩니다.

UNIX 에서

Apache 용

  1. Perl 5 설치되어 있어야 합니다. 모듈을 만드는 apxs 스크립트가 Perl로 짜져있습니다.
  2. jakarta-tomcat/src/native/apache1.3 (또는 apache2.0) 로 이동합니다.
  3. 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!.
  4. mod_jk.so 를 Apache의 libexec 디렉토리에 복사합니다.

다른 웹서버들

여러가지 Makefiles 이 jakarta-tomcat/src/native 디렉토리의 하부 디렉토리에 있습니다.

3. (선택) Tomcat에서 Ajpv13 protocol 사용하기

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에 필요하댑니다.

4. "workers" 정의하기

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 변수값들을 세팅하지 않아도 됩니다.

5. Apache에서의 mod_jk 설치

mod_jk를 사용하기 위한 Apache 설정법은 Apache 서버 설정 지시자를 통해 이루어진다; 시작하려면 자동 생성된 Tomcat 의 conf 폴더에 있는 mod_jk.conf-auto 파일을 본다.

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

6. Tomcat 호출하는 URL 할당

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.

Troubleshooting 과 F.A.Q.s

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 소스를 직접 분석하는 것이죠.

Credits

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!

Copyright ©1999-2000 The Apache Software Foundation
Legal Stuff They Make Us Say
Contact Information