16.6 mod_jk 커넥터
mod_jk 개요
아파치 웹 서버는 전세계적으로 가장 많이 사용되는 대표적인 웹 서버이며 플러그인 모듈을 사용하여 확장 할 수 있다.
mod_jk 커넥터는 아파치 웹 서버에 로드되는 mod_jk.so 모듈이다. 이 모듈은 클라이언트 요청을 받아 JBoss EAP에 전송하고, JBoss EAP는 이 요청을 받아 웹 서버에 보낸다.
mod_jk 설정 방법
점검 사항
- 앞에서 언급한 “JBoss EAP 6 Apache HTTP 서버 설치”에 따라 웹 서버가 설치되어 있어야 한다.
- root 권한을 사용하여 설치해야 한다.
mod_jk 설정 절차
따라하기
- mod_jk.conf 파일 작성
- workers.properties 파일 작성
- 웹 커넥터 라이브러리를 다운로드
- HTTPD 모듈 디렉터리에 mod_jk.so 파일 복사
- 웹 서버 restart
- jkstatus를 통해 정상 동작 확인
-
mod_jk.conf 파일 작성
Apache HTTP서버가 설치된 디렉터리의
conf.d디렉터리($HTTPD_HOME/conf.d) 에서mod_jk.conf파일을 열어 아래의 내용들을 참조하여 환경에 맞게 작성한다.# Load mod_jk module# Update this path to match your modules locationLoadModule jk_module modules/mod_jk.so# Where to find workers.properties# Update this path to match your conf directory location (put workers.properties next to httpd.conf)JkWorkersFile conf.d/workers.properties# Where to put jk logs# Update this path to match your logs directory location (put mod_jk.log next to access_log)JkLogFile logs/mod_jk.logJkShmFile logs/mod_jk.shm# Set the jk log level [debug/error/info]JkLogLevel info# Select the log formatJkLogStampFormat "[%a %b %d %H:%M:%S %Y] "# JkOptions indicate to send SSL KEY SIZE,JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories +ForwardURICompatUnparsed# JkRequestLogFormat set the request formatJkRequestLogFormat "%w %V %T"# Send everything for context /examples to worker named worker1 (ajp13)JkMount /*.jsp lbJkMount /*.do lbJkMount /*.mvc lbJkMount /jkstatus* jkstatus# Add jkstatus for managing runtime data<Location /jkstatus>JkMount jkstatusOrder Deny,AllowAllow from 127.0.0.1Allow from 192Deny from all</Location> -
workers.properties 파일 작성
Apache HTTP서버가 설치된 디렉터리의 conf.d 디렉터리(
$HTTPD_HOME/conf.d/) 에서workers.properties파일을 열어 아래의 내용들을 참조하여 환경에 맞게 작성한다.여기서 주의할 것은
worker.properties에balance_worker리스트에 호스트명과 JBoss EAP의instance-id와 같아야 한다. 여기서instance-id는server1,server2로 지정한다.worker.list=lb,jkstatus# Templatesworker.template.type=ajp13worker.template.maintain=60worker.template.lbfactor=1worker.template.ping_mode=Aworker.template.ping_timeout=2000worker.template.prepost_timeout=2000worker.template.socket_timeout=60worker.template.socket_connect_timeout=2000worker.template.socket_keepalive=trueworker.template.connection_pool_timeout=60worker.template.connect_timeout=10000worker.template.recovery_options=7# Set properties for server1 (ajp13)worker.server1.reference=worker.templateworker.server1.host=127.0.0.1worker.server1.port=8009# Set properties for server2 (ajp13)worker.server2.reference=worker.templateworker.server2.host=127.0.0.1worker.server2.port=8109worker.lb.type=lbworker.lb.balance_workers=server1,server2worker.lb.method=Sessionworker.lb.sticky_session=Trueworker.jkstatus.type=status -
웹 커넥터 라이브러리를 다운로드
레드햇 고객 포탈에 접속하여 OS 플랫폼에 맞는 JBoss EAP 6 의 웹 커넥터 네이티브 패키지를 다운로드한다.

-
HTTPD 모듈 디렉터리에 mod_jk.so 파일 복사
-
다운로드한 웹 커넥터 네이티브 패키지 압축을 푼다.
$ cd /EAP6book/jboss$ unzip ~/Downloads/jboss-eap-native-webserver-connectors-6.2.0-RHEL6-x86_64.zipArchive: /home/admin/Downloads/jboss-eap-native-webserver-connectors-6.2.0-RHEL6-x86_64.zipcreating: jboss-eap-6.2/modules/system/layers/base/native/creating: jboss-eap-6.2/modules/system/layers/base/native/etc/… 생략 …creating: jboss-eap-6.2/modules/system/layers/base/native/lib64/httpd/modules/inflating: jboss-eap-6.2/modules/system/layers/base/native/lib64/httpd/modules/mod_jk.soinflating: jboss-eap-6.2/modules/system/layers/base/native/lib64/httpd/modules/mod_manager.soinflating: jboss-eap-6.2/modules/system/layers/base/native/lib64/httpd/modules/mod_advertise.soinflating: jboss-eap-6.2/modules/system/layers/base/native/lib64/httpd/modules/mod_proxy_cluster.soinflating: jboss-eap-6.2/modules/system/layers/base/native/lib64/httpd/modules/mod_slotmem.soinflating: jboss-eap-6.2/SHA256SUM -
mod_jk.so 파일을
$HTTPD_HOME/modules에 복사한다.$ cd /EAP6book/jboss/jboss-eap-6.2/modules/system/layers/base/native/lib64/httpd/modules/$ cp mod_jk.so /EAP6book/web/jboss-ews-2.0/httpd/modules/
-
-
웹 서버 restart
-
mod_jk 환경 설정 후 웹 서버를 restart 한다.
$ cd /EAP6book/web/jboss-ews-2.0/httpd/sbin$ sudo ./apachectl restart
-
-
jkstatus를 통해 정상 동작 확인
-
http://localhost/jkstatus 에 접속하여 정상 작동 확인

-
mod_jk.conf 설정 항목
| 구분 | 설정방법 | 예제 |
|---|---|---|
| JkMount | JkMount 는 웹서버가 mod_jk 모듈로 전송할 URL을 지정한다. 지시어 설정에 따라 mod_jk는받은 URL을 올바른 Servlet 컨테이너에 전송한다. | 정적 콘텐트는 웹서버에서 제공하고 Java 애플리케이션만 부하 분산을 사용하려면 URL 경로가 /application/* 이거나 확장자를 사용하여 /.jsp와 같이 지정한다. JkMount /.jsp lb |
| JKMountFile | mod-jk.conf 의 JKMount 외에도, mod_jk에 전달되는 여러 URL 패턴을 포함하는 별도의 파일을 지정할 수 있다. | 여러 URL 패턴을 설정하기 위해서 $HTTPD_HOME/conf/ uriworkermap.properties라는 파일을 만든다. JkMountFile conf/uriworkermap.properties |
표 5. mod_jk 설정항목
workers.properties 설정
workers.properties 파일은 클라이언트 요청을 전달하는 워커 노드의 동작을 정의한다. 이 파일은 $HTTPD_HOME/conf/workers.properties에 있다. workers.properties 파일은 웹 서버와 연결되는 여러 개의 서블릿 컨테이너의 위치와 컨테이너 전체에 부하를 분산시키는 방법을 정의한다.
설정은 크게 세가지 부분으로 구성된다.
- 모든 워커 노드에 적용되는 전역 프로퍼티
- 각각의 워커에게 적용되는 설정
- 로드 밸런싱을 위한 워커 리스트 설정
프로퍼티의 구조는 worker.WORKER_NAME이다. WORKER_NAME가 워커의 고유 이름이고, JBoss EAP 6의 웹 서브시스템에서 설정한 instance-id와 같은 이름이어야 한다.
| 구분 | 항목 | 설명 |
|---|---|---|
| 전역 프로퍼티 | worker.list | mod_jk에서 사용하는 워커 리스트. 이 워커들이 요청을 받을 수 있다. |
| 워커 리스트 | type | 워커의 타입. 기본 타입은 ajp13 이다. 가능한 타입은 ajp14, lb, status이다. lb는 로드 밸런싱 타입이고, status는 mod_jk의 상태를 출력하기 위해 사용된다. |
| balance_workers | 로드 밸런서가 관리할 워커를 지정한다. 컴마로 구분한 워커 리스트를 작성한다. | sticky_session |
| 같은 세션에 대한 요청이 항상 같은 워커로 라우팅할 것인를 지정한다. 기본값은 0으로 스티키 세션을 사용하지 않는다. 스티키 세션을 사용하려면 1이나 True로 설정한다. 로그인이 필요한 애플리케이션이면 일반적으로 스티키 세션을 사용하도록 설정해야 한다. .5+ | 워커 | host |
| 워커의 호스트 이름 또는 IP 주소. 기본값은 localhost 이다. | port | JBoss 서버 인스턴스의 AJP포트 번호. 기본값은 8009이다. |
| ping_mode | JBoss 서버의 상태를 검사하는 방법을 지정한다. 검사방법은 CPing이라는 빈 AJP13 패킷을 보내 응답 CPong을 받는다. ping_mode는 C, P, I, A를 조합하여 사용한다. * C - Connect. 서버에 연결한 후 한 번만 연결을 검사한다. connect_timeout 값을 사용하여 제한 시간을 지정한다. 지정하지 않으면 ping_timeout 을 사용한다. * P - Prepost. 서버에 요청을 보내기 전에 연결을 검사한다. prepost_timeout 을 사용하여 제한 시간을 지정한다. 지정하지 않으면 ping_timeout 을 사용한다. * I - Interval. connection_ping_interval에 지정된 간격으로 연결을 검사한다. * A - All. 위의 모든 연결 검사 방법을 사용하도록 설정한다. | ping_timeout, connect_timeout, prepost_timeout, connection_ping_interval |
| 연결 검사 설정의 제한 값. 값은 밀리 초 단위이다. ping_timeout 의 기본값은 10000이다. | lbfactor | 각 워커의 부하 분산 지수를 지정한다. 이것은 더 사양이 좋은 서버에 더 많은 부하를 할당하는 경우에 사용한다. 예를 들어 특정 워커에 다른 워커의 3배 부하를 할당하려면 3으로 설정한다. worker.my_worker.lbfactor=3 |
표 . worker 설정 항목
JBoss EAP 6에 AJP설정
JBoss EAP 6 와 JBoss EAP 6 Apache HTTP Server를 mod_jk 로 연결하기 위해서는 웹 서버와 mod_jk 커넥터가 설치되어 있어야 한다. 설치되어 있지 않으면 먼저 설치한다.
-
- 웹 서버 설치에 따라 웹 서버가 설치되어 있어야 한다.
-
- mod_jk 커넥터 설정방법에 따라 커넥터가 설정되어 있어야 한다.
작업 수행
아래와 같이 웹 서버와 JBoss EAP 6 인스턴스 2개를 Port Off Set을 100으로하여 같은 머신에서 구성한다. 웹 서버의 구성 부분은 앞서 설명한 JBoss EAP 6 Apache HTTP Server 구성과 mod_jk 구성과 같은 내용이므로 필요한 경우 앞의 내용을 참조하여 진행한다. 다음에서는 웹 서버의 주요 구성 환경에 대해서만 간단히 절차에 포함하였다.

그림 6. 웹 서버와 JBoss 인스턴스의 연결 구성
그림에서는 3개의 서버에 웹 서버와 JBoss EAP 6를 설치하는 구성으로 설명하였지만, 따라하기에서는 웹 서버와 JBoss EAP 6 인스턴스를 모두 한 머신에서 설정하는 것으로 설명하고 있다.
따라하기
- mod_jk.conf 파일 작성
- workers.properties 파일 작성
- HTTPD 모듈 디렉터리에 mod_jk.so 파일 복사
- standalone-ha.xml 파일 수정
- JBoss server1 실행 스크립트 작성
- server1 에 session.war 파일 배포
- JBoss server2 실행 스크립트 작성
- server2 에 session.war 파일 배포
-
mod_jk.conf 파일 작성
Apache HTTPD서버가 설치된 디렉터리의
conf.d하위 디렉터리($HTTPD_HOME/conf.d)에mod_jk.conf파일을 아래의 내용들을 참조하여 환경에 맞게 작성한다.# Load mod_jk module# Update this path to match your modules locationLoadModule jk_module modules/mod_jk.so# Where to find workers.properties# Update this path to match your conf directory location (put workers.properties next to httpd.conf)JkWorkersFile conf.d/workers.properties# Where to put jk logs# Update this path to match your logs directory location (put mod_jk.log next to access_log)JkLogFile logs/mod_jk.logJkShmFile logs/mod_jk.shm# Set the jk log level [debug/error/info]JkLogLevel info# Select the log formatJkLogStampFormat "[%a %b %d %H:%M:%S %Y] "# JkOptions indicate to send SSL KEY SIZE,JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories +ForwardURICompatUnparsed# JkRequestLogFormat set the request formatJkRequestLogFormat "%w %V %T"# Send everything for context /examples to worker named worker1 (ajp13)JkMount /*.jsp lbJkMount /*.do lbJkMount /*.mvc lbJkMount /jkstatus* jkstatus# Add jkstatus for managing runtime data<Location /jkstatus>JkMount jkstatusOrder Deny,AllowAllow from 127.0.0.1Allow from 192.168Deny from all</Location> -
workers.properties 파일 작성
Apache HTTP서버가 설치된 디렉터리의
conf.d하위 디렉터리($HTTPD_HOME/conf.d/) 에workers.properties파일을 아래의 내용을 참조하여 환경에 맞게 작성한다.여기서 주의할 것은
worker.properties에balance_worker리스트에 호스트명과 JBoss EAP의instance-id명이 같아야 한다. 여기서instance-id명은server1,server2로 지정한다.worker.list=lb,jkstatus# Templatesworker.template.type=ajp13worker.template.maintain=60worker.template.lbfactor=1worker.template.ping_mode=Aworker.template.ping_timeout=2000worker.template.prepost_timeout=2000worker.template.socket_timeout=60worker.template.socket_connect_timeout=2000worker.template.socket_keepalive=trueworker.template.connection_pool_timeout=60worker.template.connect_timeout=10000worker.template.recovery_options=7# Set properties for server1 (ajp13)worker.server1.reference=worker.templateworker.server1.host=127.0.0.1worker.server1.port=8009# Set properties for server2 (ajp13)worker.server2.reference=worker.templateworker.server2.host=127.0.0.1worker.server2.port=8109worker.lb.type=lbworker.lb.balance_workers=**server1,server2**worker.lb.method=Sessionworker.lb.sticky_session=Trueworker.jkstatus.type=status -
HTTPD 모듈 디렉터리에 mod_jk.so 파일 복사
-
mod_jk.so 파일을
$HTTPD_HOME/modules/디렉터리에 복사한다.$ cd /EAP6book/jboss/jboss-eap-6.2/modules/system/layers/base/native/lib64/httpd/modules/$ cp mod_jk.so /EAP6book/web/jboss-ews-2.0/httpd/modules/복사한 후 Apache HTTP Server 를 재기동한다.
$ cd /EAP6book/web/jboss-ews-2.0/httpd/sbin$ sudo ./apachectl restart
-
-
standalone-ha.xml 파일 수정
- standalone-ha.xml 파일의 웹 서브시스템에
instance-id속성을 추가한다.
- standalone-ha.xml 파일의 웹 서브시스템에
$ vi $JBOSS_HOME/standalone/configuration/standalone-ha.xml
- 웹 서브시스템을 찾아 환경변수
jboss.node.name을 사용할 수 있도록instance-id속성을 추가한다.
<subsystem xmlns="urn:jboss:domain:web:1.5" default-virtual-server="default-host" instance-id="${jboss.node.name}" native="false">
-
JBoss server1 실행 스크립트 작성
-
$JBOSS_HOME/server1디렉터리에서server1.sh실행 스크립트를 작성한다.$ cd $JBOSS_HOME$ cp -R standalone server1$ cd server1$ vi server1.sh -
server1.sh 파일의 내용을 다음과 같이 작성한다.
#!/bin/sh$JBOSS_HOME/bin/standalone.sh -c standalone-ha.xml -b 127.0.0.1 -bmanagement 127.0.0.1 -Djboss.socket.binding.port-offset=0 -Djboss.node.name=server1 -Djboss.server.base.dir=$JBOSS_HOME/server1 -
server1.sh파일에 실행 권한을 부여한다.
$ chmod u+x server1.shserver1.sh을 실행하여 JBoss EAP 6server1인스턴스를 실행한다.
$ ./server1.sh -
-
server1에session.war파일 배포-
http://localhost:9990/console/에 접속하여
server1인스턴스에session.war파일을 배포한다. -
session.war파일은 세션에 Integer값을 하나 저장하고 요청 때마다 세션에 저장된 값을 하나씩 증가시키는 간단한 JSP 프로그램이다. http://github.com/nameislocus/session에서 다운로드할 수 있다. Runtime Manage Deployments Add를 클릭하여 session.war 파일을 선택하고 ‘Save’한다. ‘En/Disable’ 버튼을 클릭하여session.war애플리케이션을 Enable한다.
-
-
JBoss
server2실행 스크립트 작성-
$JBOSS_HOME/bin디렉터리에서server2.sh실행 스크립트를 작성한다.$ cd $JBOSS_HOME$ cp -R standalone server2$ cd server2$ vi server2.sh -
server2.sh파일의 내용을 다음과 같이 작성한다.#!/bin/sh$JBOSS_HOME/bin/standalone.sh -c standalone-ha.xml -b 127.0.0.1 -bmanagement 127.0.0.1 -Djboss.socket.binding.port-offset=100 -Djboss.node.name=server2 -Djboss.server.base.dir=$JBOSS_HOME/server2 -
server2.sh파일에 실행 권한을 부여한다.
$ chmod u+x server2.sh- server2.sh을 실행하여 JBoss EAP 6 server2 인스턴스를 실행한다.
$ ./server2.sh -
-
server2에session.war파일 배포-
http://localhost:10090/console/ 에 접속하여
server2인스턴스에도session.war파일을 배포한다. ⑥과 같은 방법으로 ***server2***에도 배포한다.JBoss EAP 6
server1과server2에 대한 웹 콘솔 접속 아이디와 패스워드는 3장에서 설치시 설정했던admin과opennaru!234이다.
-
mod_jk 구성 테스트
mod_jk 로 연결된 웹 서버와 JBoss EAP 6 인스턴스 간의 로드 밸런싱과 세션복제 상태를 검증한다. 먼저 mod_jk의 구성이 잘 되어 정상적으로 기동되었는지 확인하여야 한다.
웹 브라우저에서 http://localhost/jkstatus/ 로 접속하면 다음 그림과 같이 mod_jk와 JBoss 인스턴스 간의 연결 상태가 표시된다.

그림 7. mod_jk 상태 모니터링 페이지
이제 세션 복제가 되고 있는지 웹 브라우저를 사용하여 테스트해보자.
웹 브라우저에서 요청을 보내면 웹 서버는 mod_jk를 통해 연결된 JBoss 인스턴스로 요청을 전달한다. 접속된 JBoss 인스턴스를 정지시켰을 때 정상적으로 다른 JBoss 인스턴스에 요청이 전달되고 세션 정보가 업데이트되는지를 확인한다.
따라하기
- 1번째 요청 전송
- 접속한 1번 JBoss 인스턴스 정지
- 2번째 요청 전송
- 정지 상태인 1번 JBoss 인스턴스를 다시 실행
- 2번 JBoss 인스턴스 정지
- 3번째 요청 전송
-
1번째 요청 전송
-
웹 브라우저를 열고 http://localhost/session/index.jsp URL을 입력하여 웹 서버로 1번째 요청을 보내면 다음과 같이 세션 ID를 표시하는 페이지가 출력된다. 세션 ID의 뒤에
.server1이 접속한 JBoss 인스턴스의instance-id이다. -
여기서 ‘1 times’로 표시된 것은 세션에 저장된 숫자 값이다.

-
-
접속한 1번 JBoss 인스턴스 정지
-
Ctrl + C를 눌러 세션이 생성된 JBoss 인스턴스server1을 중지한다.17:20:27,265 INFO [org.jboss.as] (Controller Boot Thread) JBAS015951: Admin console listening on http://127.0.0.1:999017:20:27,266 INFO [org.jboss.as] (Controller Boot Thread) JBAS015874: JBoss EAP 6.2.0.GA (AS 7.3.0.Final-redhat-14) started in 19045ms - Started 175 of 299 services (123 services are passive or on-demand)17:20:28,919 INFO [org.jboss.as.clustering] (Incoming-1,shared=udp) JBAS010225: New cluster view for partition web (id: 1, delta: 1, merge: false) : [server1/web, server2/web]17:20:28,920 INFO [org.infinispan.remoting.transport.jgroups.JGroupsTransport] (Incoming-1,shared=udp) ISPN000094: Received new cluster view: [server1/web|1] [server1/web, server2/web]17:21:00,889 INFO [stdout] (ajp-/127.0.0.1:8009-1) session=ABrqVi3VCi74JLu1Smwe+p8U.server1^C… 생략 …17:21:16,211 INFO [org.infinispan.remoting.transport.jgroups.JGroupsTransport] (MSC service thread 1-2) ISPN000082: Stopping the RpcDispatcher17:21:16,228 INFO [org.jboss.as] (MSC service thread 1-1) JBAS015950: JBoss EAP 6.2.0.GA (AS 7.3.0.Final-redhat-14) stopped in 564ms
-
-
2번째 요청 전송
-
웹 브라우저에서 ‘새로 고침’을 클릭하여 웹 서버로 2번째 요청을 보내면 세션 ID가
.server2로 변경된다. -
세션에 저장된 숫자 값이 ‘2’로 변경된 것을 확인할 수 있다.

-
-
정지 상태인 1번 JBoss 인스턴스를 다시 실행
-
앞서 정지시켰던
server1JBoss 인스턴스를 실행한다. 이 단계는server2JBoss 인스턴스를 정지시키기 전에 상태 정보를 백업하기 위한 것이다.$ ./server1.sh… 생략 …17:23:23,141 INFO [org.jboss.as] (Controller Boot Thread) JBAS015961: Http management interface listening on http://127.0.0.1:9990/management17:23:23,142 INFO [org.jboss.as] (Controller Boot Thread) JBAS015951: Admin console listening on http://127.0.0.1:999017:23:23,143 INFO [org.jboss.as] (Controller Boot Thread) JBAS015874: JBoss EAP 6.2.0.GA (AS 7.3.0.Final-redhat-14) started in 10619ms - Started 175 of 299 services (123 services are passive or on-demand)
-
-
2번 JBoss 인스턴스 정지
-
현재 세션이 생성되어 있는
server2JBoss 인스턴스를 정지한다.17:22:48,812 INFO [stdout] (ajp-/127.0.0.1:8109-3) session=ABrqVi3VCi74JLu1Smwe+p8U.server217:23:22,031 INFO [org.jboss.as.clustering] (Incoming-9,shared=udp) JBAS010225: New cluster view for partition web (id: 3, delta: 1, merge: false) : [server2/web, server1/web]17:23:22,033 INFO [org.infinispan.remoting.transport.jgroups.JGroupsTransport] (Incoming-9,shared=udp) ISPN000094: Received new cluster view: [server2/web|3] [server2/web, server1/web]^C… 생략 …17:25:09,232 INFO [org.infinispan.remoting.transport.jgroups.JGroupsTransport] (MSC service thread 1-2) ISPN000082: Stopping the RpcDispatcher17:25:09,250 INFO [org.jboss.as] (MSC service thread 1-1) JBAS015950: JBoss EAP 6.2.0.GA (AS 7.3.0.Final-redhat-14) stopped in 545ms
-
-
3번째 요청 전송
-
웹 브라우저에서 3번째 요청을 보내면 세션에 저장된 값이 3으로 변경되고
server1으로 요청이 전달된다.
-
웹 브라우저에서 총 3번의 요청을 전송하였고 접속한 JBoss 인스턴스를 강제로 종료하였음에도 불구하고 세션에 저장된 카운트는 차례로 증가하여 3이 되었고, 세션 아이디는 같음을 확인할 수 있었다. 즉, JBoss 인스턴스의 장애 상황에서도 세션 정보가 정상적으로 유지되는 것을 확인할 수 있었다.