JBoss EAP 6과 친해지기 24탄 - JBoss EAP 6 운영환경 구축 가이드
본문 바로가기
IT 이야기/JBoss EAP

JBoss EAP 6과 친해지기 24탄 - JBoss EAP 6 운영환경 구축 가이드

by 찬찬이 아빠 2021. 1. 29.
반응형
  1. 설치 환경

먼저 JBoss 인스턴스(노드)를 어덯게 구성할 것인지를 결정해야 합니다. 장애에 대비하기 위하여 같은 서비스를 제공하는 여러 개의 인스턴스를 클러스터로 구성합니다. 이때 인스턴스들은 서로 다른 머신에 배치하여 하으뒈어 장애에도 대비할 수 있도록 구성하는 것이 좋습니다.

 

Java의 힙 메모리를 많이 사용하면 JVM이 멈추는 Full GC 시간이 길어지기 때문에 1~2GB 정도의 힙 메모리를 사용해야 합니다. 1~2GB 정도의 메모리만 사용하면 하드웨어의 메모리가 남기 때문에 한 머신에 여러 인스턴스를 구성해야 합니다.

 

다음 그림과 같이 3대의 머신에 1대는 JBoss EWS 웹 서버를 설치하고, 2대에는 JBoss EAP 6를 2개 스탠드얼론 모드의 인스턴스를 설치하여 클러스터를 구성합니다.

 

예를 들어 각각의 머신은 다음과 같은 IP를 사용한다고 가정하겠습니다.

용도 HOSTNAME IP주소
웹 서버 WEB01 192.168.0.201
WAS 서버 WAS01 192.168.0.101
WAS 서버 WAS02 192.168.0.102

 

아래 그림과 같이 웹 서버와 JBoss EAP 6 서버 인스턴스를 구성한다고 가정하겠습니다.

구성할 아키텍처

 

 

 

(1) 디렉터리 구조

① 주요 설치 디렉터리

제품이 설치되는 디렉터리와 서비스에 사용할 인스턴스들이 있는 디렉터리를 분리하는 것이 좋습니다. 또, 로그 파일이 별도의 디렉터리에 저장되도록 설정하여 디스크가 곽차더라도 서비스에는 영향을 미치지 않도록 설정합니다. 물론 로그를 남길 디렉터리는 OS에서 다른 파티션을 사용하도록 설정해야합니다. 또, 별도의 외부 애플리케이션 배포 디렉터리를 설정하면 한 머신에 한 번만 애플리케이션을 배포하면 됩니다.

구분 디렉터리명 설명
JBoss EAP 제품 설치 디렉터리 /JBOSS/jboss-eap-6.2 JBoss EAP 6을 설치할 디렉터리
JBoss 인스턴스 디렉터리 /JBOSS/domains 서비스에 사용할 JBoss 인스턴스들을 구성할 디렉터리
로그 디렉터리 /JBOSS/LOG 인스턴스의 로그 파일들을 저장할 디렉터리
애플리케이션 디렉터리 /WebApp 애플리케이션 배포 디렉터리
JBoss EWS 2 제품설치 디렉터리 /APACHE/jboss-ews-2.0 JBoss EWS 2를 설치할 디렉터리

 

 

② 인스턴스 디렉터리 구성

JBoss EAP 6를 설치한 디렉터리의 파일들은 수정하지 않고, 별도의 인스턴스 디렉터리를 설정하여 서비스합니다.

 

/JBOSS/domains 라는 디렉터리 하위에 인스턴스들을 구성합니다. domains 하위에 서버 인스턴스 이름으로 디렉터리를 만듭니다. 인스턴스의 이름은 다음 그림과 같이 서버의 이름 + 머신번호 + 인스턴스와 같은 규칙을 사용하는 것이 좋습니다.

인스턴스 이름 지정 규칙

 

 

실제 서버의 이름은 서비스를 나타내는 고유명칭으로 변경하여 사용하면 됩니다. 머신 번호는 JBoss에 사용할 머신에 1번부터 차례대로 붙인 번호를 사용하고, 인스턴스 번호는 같은 머신 내의 인스턴스 개수를 1번부터 번호를 붙입니다.

 

이렇게 인스턴스 이름을 지정하면 모든 인스턴스가 고유한 이름을 갖게 됩니다. 이 고유한 인스턴스 이름은 클러스터링에서 세션ID, 로그 파일의 이름, nohup 로그 파일의 이름 등에 사용하게 됩니다. 장애 상황이나 로그 파일을 확인하는 등 어떤 상황에서도 서버 이름만 보면 어떤 머신의 어떤 인스턴스의 것인지 금방 구분할 수 있게 됩니다.

 

또, 포트 오프셋 번호는 '인스턴스의 번호x100'을 사용하면 포트를 구분하기 쉽습니다. 기본 포트셋 + 포트 오프셋으로 사용하는 포트가 지정되는데, 사용하는 대부분의 포트 번호가 100번대가 0이기 때문에 해당 인스턴스가 사용하는 번호를 기억하기 쉽습니다.

 

예를 들어 인스턴스 이름이 'frontSvr24'라면, 2번째 JBoss 머신의 4번째 인스턴스를 의미하며, 이 인스턴스가 사용하는 HTTP 포트는 8480(8080 + 400) 포트를 사용하고, AJP 포트는 8409(8009 + 400) 포트를 사용합니다.

 

예제에서는 다음과 같이 WAS 머신 2대에 각각 2개의 인스턴스를 구성합니다.

머신명 디렉터리명 포트오프셋 HTTP포트 AJP포트
WAS01
(192.168.0.101)
/JBOSS/domains/server11 100 8180 8109
/JBOSS/domains/server12 200 8280 8209
WAS02
(192.168.0.102)
/JBOSS/domains/server21 100 8180 8109
/JBOSS/domains/server22 200 8280 8209

 

③ JBoss EAP 6 운영 스크립트

JBoss EAP 6가 설치된 디렉터리가 아닌 다른 디렉터리에서 JBoss 인스턴스를 실행하려면 몇 가지 옵션을 지정해야 합니다. 가장 중요한 옵션은 '-Djboss.server.base.dir'로 서버 인스턴스의 디렉터리를 지정하는데 사용됩니다. 이 외에도 여러 가지 옵션들을 변경하여 위치를 변경해야 합니다.

 

JBoss 운영 환경을 구축하기 위해서는 많은 작업이 필요합니다. JBoss를 시작할 때도 백그라운드 프로세스로 실행해야 하며, nohup 로그를 남겨두어야 스레드 덤프를 받을 때 파일에 남게 됩니다. 백그라운드로 실행 중인 JBoss를 종료하는 방법도 필요합니다.

 

운영 환경에 사용할 수 있도록 JBoss EAP 6 스크립트를 github에서 다운로드 받아 사용하면 됩니다. 스탠드 얼론 모드용 스크립트와 도메인 모드용 스크립트를 모두 제공하고 있습니다.

 

  • JBoss EAP 6 스크립트 다운로드

https://github.com/nameislocus/jboss-eap-6-scripts

$ git clone https://github.com/nameislocus/jboss-eap-6-scripts

 

git가 설치되어 있지 않으면 다음 명령으로 git를 설치합니다.

$ sudo yum install git

 

github에 있는 주요 스크립트 파일은 아래 표와 같습니다. 인스턴스를 시작, 종료, kill, 로그 tail, 프로세스 확인, 스레드 덤프 등 JBoss 인스턴스를 운영하는데 필요한 대부분의 스크립트를 제공하고 있습니다.

 

이 스크립트 파일들은 모두 환경설정 파일인 env.sh 파일을 참조하여 실행됩니다. 따라서 위에서 설명한 JBoss 설치 디렉터리, 인스턴스 구성 디렉터리, 로그 디렉터리 등의 설정은 모두 env.sh 파일의 내용만 수정하면 됩니다.

 

JBoss EAP 6 운영 스크립트는 아래와 같습니다.

스크립트 파일 설명
env.sh JBoss 운영 환경 주요 환경 설정 스크립트
start.sh JBoss Standalone 인스턴스 실행 스크립트
shutdown.sh JBoss Standalone 인스턴스 정상 종료 스크립트
kill.sh JBoss 강제 종료 스크립트
nohup.sh nohup 로그의 tail 보기 스크립트
tail.sh JBoss server.log 파일 tail 보기 스크립트
status.sh JBoss 인스턴스가 실행 중인지 체크하는 스크립트
jboss-cli.sh JBoss CLI 모드로 접속하는 스크립트
jconsole.sh JConsole로 접속하여 JMX MBean 정보를 확인하기 위한 스크립트(GUI 환경 필요)
add-user.sh 사용자를 추가하기 위한 스크립트
dump.sh 인스턴스 장애 시 Java 프로세스의 스레드 덤프를 받기 위한 스크립트
env.properties Java 시스템 프로퍼티를 설정하는 파일
인코딩 설정이 정의되어 있음

 

  • env.sh 파일

env.shs는 JBoss EAP 6 환경설정을 위한 파일입니다. 각 인스턴스의 모든 설정은 이 파일에서 하면 됩니다. 4개의 JBoss 인스턴스마다 각각의 인스턴스의 이름, 디렉터리의 이름, 포트 오프셋 등을 설정하면 됩니다. 또 이 파일에는 JVM의 메모리 옵션, GC 옵션, OutOfMemory 오류가 발생할 때 Heapdump를 출력하는 옵션 등이 설정되어 있습니다.

 

스탠드얼론 인스턴스가 사용할 프로파일을 변경하려면, CONFIG_FILE=standalonke-full-ha.xml과 같이 프로파일 파일명을 지정하면 됩니다.

#!/bin/sh

DATE='date +%Y%m%d%H%M%S'

##### JBoss Directory Setup #####
export JBOSS_HOME=/JBOSS/jboss-eap-6.2
export DOMAiN_BASE=/JBOSS/domains
export SERVER_NAME=server11
export JBOSS_LOG_DIR=/JBOSS/LOG/server11

if [ e$JBOSS_LOG_DIR = "e" ]
then
	export JBOSS_LOG_DIR="$JBOSS_HOME/LOG"
fi

if [ e$JBOSS_LOG_DIR != "e" ]
then
	export JBOSS_LOG_DIR="$JBOSS_LOG_DIR"
fi

##### Configuration File #####
export CONFIG_FILE=standalone-ha.xml

export EXTERNAL_DEPLOYMENT=/JBOSS/domains/applications

export HOST_NAME=master
export NODE_NAME=$SERVER_NAME
export PORT_OFFSET=100

export JBOSS_USER=jboss

##### Bind Address #####
export BIND_ADDR=192.168.0.101

export MULTICAST_ADDR=230.1.1.1
export JMS_MULTICAST_ADDR=231.7.1.1
export MODCLUSTER_MULTICAST_ADDR=224.1.1.105

export MGMT_ADDR=192.168.0.101

export CONTROLLER_IP=$MGMT_ADDR
let CONTROLLER_PORT=9999+$PORT_OFFSET
export CONTROLLER_PORT

export LAUNCH_JBOSS_IN_BACKGROUND=true

##### JBoss System module and User module directory #####
export JBOSS_MODULEPATH=$JBOSS_HOME/modules

##### JVM Options : Server #####
export JAVA_OPTS="-server $AGENT_OPTS $JAVA_OPTS"

##### JVM Options : Memory - Java 힙 메모리 옵션 설정 #####
export JAVA_OPTS=" $JAVA_OPTS -Xms1024m -Xmx1024m -XX:MaxPermSize=256"
export JAVA_OPTS=" $JAVA_OPTS -XX:+PrintGCTimeStamps "
export JAVA_OPTS=" $JAVA_OPTS -XX:+PrintGCDetails "
export JAVA_OPTS=" $JAVA_OPTS -Xloggc:$JBOSS_LOG_DIR/gclog/gc_$DATE.log "
export JAVA_OPTS=" $JAVA_OPTS -XX:+UseParallelGC "
# export JAVA_OPTS=" $JAVA_OPTS -XX:+UseConcMarkSweepGC "
export JAVA_OPTS=" $JAVA_OPTS -XX:+ExplicitGCInvokesConcurrent "
export JAVA_OPTS=" $JAVA_OPTS -XX:-HeapDumpOnOutOfMemoryError "
export JAVA_OPTS=" $JAVA_OPTS -XX:HeapDumpPath=$JBOSS_LOG_DIR/heapdump "

# Linux Large Page Setting
# export JAVA_OPTS=" $JAVA_OPTS -XX:+UseLargePages "

# export JAVA_OPTS=" $JAVA_OPTS -verbose:gc "
export JAVA_OPTS=" $JAVA_OPTS -Djava.net.preferIPv4Stack=true "
export JAVA_OPTS=" $JAVA_OPTS -Dorg.jboss.resolver.warning=true "
export JAVA_OPTS=" $JAVA_OPTS -Dsun.rmi.dgc.client.gcInterval=3600000 "
export JAVA_OPTS=" $JAVA_OPTS -Dsun.rmi.dgc.server.gcInterval=3600000 "
export JAVA_OPTS=" $JAVA_OPTS -Djboss.modules.system.pkgs=org.jboss.byteman.com "

export JAVA_OPTS=" $JAVA_OPTS -Djava.awt.headless=true "
export JAVA_OPTS=" $JAVA_OPTS -Djboss.server.base.dir=$DOMAIN_BASE/$SERVER_NAME "
export JAVA_OPTS=" $JAVA_OPTS -Djboss.server.log.dir=$JBOSS_LOG_DIR "
export JAVA_OPTS=" $JAVA_OPTS -Djboss.external.deployments=$EXTERNAL_DEPLOYMENT "
export JAVA_OPTS=" $JAVA_OPTS -Djboss.socket.binding.port-offset=$PORT_OFFSET "
export JAVA_OPTS=" $JAVA_OPTS -Djboss.node.name=$NODE_NAME "
export JAVA_OPTS=" $JAVA_OPTS -Djboss.bind.address.management=$MGMT_ADDR "
export JAVA_OPTS=" $JAVA_OPTS -Djboss.bind.address=$BIND_ADDR "
export JAVA_OPTS=" $JAVA_OPTS -Djboss.default.jgroups.stack=tcp "
export JAVA_OPTS=" $JAVA_OPTS -Djboss.default.multicase.address=$MULTICASE_ADDR "
export JAVA_OPTS=" $JAVA_OPTS -Djboss.messaging.group.address=$JMS_MULTICAST_ADDR "
export JAVA_OPTS=" $JAVA_OPTS -Djboss.modcluster.multicast.address=$MODCLUSTER_MULTICAST_ADDR "
export JAVA_OPTS=" $JAVA_OPTS -Dorg.jboss.as.logging.per-deployment=false "

echo "=========================================================="
echo "JBOSS_HOME=$JBOSS_HOME"
echo "DOMAIN_BASE=$DOMAIN_BASE"
echo "SERVER_NAME=$SERVER_NAME"
echo "CONFIG_FILE=$CONFIG_FILE"
echo "BIND_ADDR=$BIND_ADDR"
echo "PORT_OFFSET=$PORT_OFFSET"
echo "MULTICAST_ADDR=$MULTICAST_ADDR"
echo "CONTROLLER=$CONTROLLER_IP:$CONTROLLER_PORT"
echo "=========================================================="

 

  • start.sh 파일

JBoss 인스턴스를 시작하는 스크립트입니다. 이 파일에서는 JBoss 인스턴스가 이미 실행되어 있는지 조사하여 다시 실행되지 않도록 하며, env.sh 파일에서 JBOSS_USER로 JBoss 프로세스를 관리하는 사용자로 지정한 사용자만 JBoss 인스턴스를 시작할 수 있도록 합니다.

 

GC 로그를 남길 디렉터리나 로그 디렉터리, Heap dump를 남길 디렉터리가 없으면 생성합니다.

 

JBoss 인스턴스는 nohup 로그를 남기며 백그라운드로 실행됩니다. 기존의 nohup 로그는 현재 실행 시각을 확장자로 하여 백업하고 새로운 nohup 로그를 남깁니다.

#!/bin/sh

DATE ='date +%Y%m%d%H%M%S'

. ./env.sh

PID=`ps -ef | grep java |grep "=$SERVER_NAME " | awk '{print $2}'`
echo $PID

if [ e$PID != "e" ]
then
	echo "JBoss SERVER - $SERVER_NAME is already RUNNING...."
    exit;
fi

UNAME='id -u -n'
if [ e$UNAME != "e$JBOSS_USER" ]
then
	echo "Use $JBOSS_USER account to start JBoss SERVER - $SERVER_NAME...."
	exit;
fi

echo $JAVA_OPTS

if [ ! -d "$JBOSS_LOG_DIR/nohup" ];
then
	mkdir -p $JBOSS_LOG_DIR/nohup
fi
if [ ! -d "$JBOSS_LOG_DIR/gclog" ];
then
	mkdir -p $JBOSS_LOG_DIR/gclog
fi
if [! -d "$JBOSS_LOG_DIR/heapdump" ];
then
	mkdir -p $JBOSS_LOG_DIR/heapdump
fi

mv $JBOSS_LOG_DIR/nohup/$SERVER_NAME.out
$JBOSS_LOG_DIR/nohup/$SERVER_NAME.out.$DATE

nohup $JBOSS_HOME/bin/standalone.sh -DSERVER=$SERVER_NAME -P=$DOMAIN_BASE/$SERVER_NAME/env.properties -c $CONFIG_FILE >>$JBOSS_LOG_DIR/nohup/$SERVER_NAME.out 2>&1 &

if [ e$1 = "enotail" ]
then
	echo "Starting... $SERVER_NAME"
    exit;
fi

#tail -f log/server.log
tail -f $JBOSS_LOG_DIR/nohup/$SERVER_NAME.out

 

 

  • shutdown.sh

shutdown CLI 명령을 사용하여 JBoss 인스턴스를 종료하는 스크립트입니다. shutdown 명령을 사용하여 종료하기 때문에 작업 중이던 처리를 모두 완료한 후 종료합니다.

#!/bin/sh
. ./env.sh
$JBOSS_HOME/bin/jboss-cli.sh --connect --controller=$CONTROLLER_IP:$CONTROLLER_PORT --command=:shutdown

 

  • status.sh

JBoss 인스턴스가 실행 중인지 프로세스를 체크하는 스크립트입니다.

#!/bin/sh
. ./env.sh
ps -ef | grep java | grep "SERVER=$SERVER_NAME"

 

  • kill.sh

'kill -9 <pid>'로 JBoss 인스턴스를 강제 종료하는 스크립트입니다. 서버를 실행하는 start.sh 스크립트에서 $SERVER_NAME 환경 변수를 지정하였기 때문에 해당 Java 프로세스만 kill합니다. grep 시 맨 뒤에 있는 공백이 꼭 필요하니 주의해야 합니다. 예를 들어 "SERVER_NAME이 node1인 프로세스와 node12인 프로세스가 실행중이면, 공백이 없으면 두 프로세스 모두 kill이 됩니다.

#!/bin/sh
. ./env.sh
ps -ef | grep java | grep "SERVER=$SERVER_NAME" | awk {'print "kill -9" $2'} | sh -x

 

 

  • nohup.sh

JBoss 인스턴스의 nohup 로그를 tail로 보는 스크립트입니다.

#!/bin/sh
. ./env.sh
tail -f $JBOSS_LOG_DIR/nohup/$SERVER_NAME.out

 

 

  • jboss-cli.sh

해당 JBoss 인스턴스에 CLI로 접속하는 스크립트입니다. 스크립트를 실행하면 env.sh 파일에 정의된 컨트롤러로 자동으로 접속합니다.

#!/bin/sh
. ./env.sh
export JAVA_OPTS=" Djava.awt.headless=false $JAVA_OPTS"
$JBOSS_HOME/bin/jboss-cli.sh --controller=$CONTROLLER_IP:$CONTROLLER_PORT --connect $@

 

 

  • jconsole.sh

JConsole을 실행하는 스크립트입니다. 이 스크립트를 실행하면 해당 JBoss 인스턴스에 접속하는 remoting-jmx URI를 화면에 출력하고, JConsole을 실행합니다. 원격에서 접속하려면 화면에 출력되는 JMX URL을 사용하면 됩니다.

#!/bin/sh
. ./env.sh
echo "================================================"
echo " JMX URL : service:jmx:remoting-jmx://$MGMT_ADDR:$CONTROLLER_PORT"
echo "================================================"
$JBOSS_HOME/bin/jconsole.sh

 

 

  • dump.sh

이 스크립트를 실행하면 자동으로 3초 간격으로 5회 스레드 덤프를 nohup에 출력합니다.

#!/bin/sh
. ./env.sh
for count in 1 2 3 4 5; do
	echo "Thread Dump : $count"
    for i in `ps -ef | grep java | grep "SERVER=$SERVER_NAME" | awk '{print $2}'`; do
    	echo "+kill -3 $i"
        kill -3 $i
        echo "sleep 1 sec"
        sleep 1
    done
    echo "done"
    sleep 3
done

 

 

 

  2. 운영체제 환경 설정

(1) JBoss 사용자

웹 애플리케이션 서버 프로세스는 일반 사용자 계정으로 기동해야 합니다. 보안상의 이유로 root 계정을 사용하지 않는 것이 좋습니다. 예제에서는 'jboss''라는 사용자를 추가합니다. JBoss EAP 6 스크립트에서 env.sh 파일에 JBOSS_USER 환경 변수에 JBoss 인스턴스를 구동할 리눅스 사용자 이름을 'jboss'로 설정하면, jboss 사용자만 인스턴스를 구동할 수 있습니다.

$ adduser jboss

 

아래와 같이 env.sh 파일에서 JBOSS_USER 환경 변수를 설정합니다.

export JBOSS_USER=jboss

 

 

(2) 리눅스 커널 파라미터

웹 서버와 웹 기반 미들웨어 서버는 모두 네트워크를 통해 서비스를 제공하는 시스템입니다. 네트워크를 통해 데이터를 전달하기 때문에, 운영체제의 TCP/IP에 대한 튜닝은 필수입니다. 아래 표에서 설명한 핵심적인 파라미터를 적용하는 것이 좋습니다. 특히 TCP의 수신, 송신 버퍼의 크기를 운영체제가 기본적으로 제공하는 것보다 크게 설정해야 서버의 성능을 향상할 수 있습니다. 다음 설정을 웹 서버와 JBoss 운영 서버에 대해 모두 적용해야 합니다.

파라미터 권장값 설명
net.ipv4.tcp_keepalive_time 30 keep-alive 시간을 줄입니다.
net.ipv4.cp_fin_timeout 10 FIN 타임아웃 시간을 줄여 FD를 빨리 확보할 수 있도록 합니다.
net.core.netdev_max_backlog 2500 백로그에 들어오는 소켓 개수를 늘립니다.
net.ipv4.tcp_retries1 3 TCP 연결에 문제가 있을 때 연결을 재시도하는 횟수를 줄입니다(최소값이 3).
net.ipv4.tcp_retries2 3 TCP 연결을 끊기 전에 재시도하는 횟수를 줄입니다.
net.ipv4.ip_local_port_range 1024 65000 사용할 수 있는 로컬 포트 범위를 늘립니다.
net.core.rmem_max 56777216 TCP 수신 버퍼크기 최대값을 늘립니다.
net.core.rmem_default 16777216 TCP 수신 버퍼크기 기본값을 늘립니다.
net.core.wmem_max 56777216 TCP 전송 버퍼크기 최대값을 늘립니다.
net.core.wmem_default 16777216 TCP 전송 버퍼크기 기본값을 늘립니다.
net.ipv4.tcp_window_scaling 1 65KB 이상의 큰 TCP 윈도우 스케일링을 사용합니다.
net.ipv4.tcp_orphan_retries 0 서버 측에서 닫은 TCP 연결을 끊기 전에 확인하는 횟수를 줄입니다. 기본값은 7로 50초~16분 정도 걸립니다.
net.ipv4.tcp_sack 0 SYNC 패킷을 전송한 후 일부 ACK를 받지 못했을 경우 선택적으로 받지 못한 ACK 패킷을 받도록 설정할 수 있습니다. 0은 받지 않는 설정입니다. 패킷 유실이 많은 네트워크에서는 1로 설정합니다.

 

 

  • 적용방법

웹 서버와 JBoss  서버 모두 '/etc/sysctl.conf' 파일에 다음 설정을 추가합니다.

# Updates
net.ipv4.neigh.default.unres_qlen = 100
net.ipv4.tcp_keepalive_time = 30
net.ipv4.tcp_fin_timeout = 10
net.core.netdev_max_backlog = 2500
net.ipv4.tcp_retries1 = 3
net.ipv4.tcp_retries2 = 3
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_max = 56777216
net.core.rmem_default = 16777216
net.core.wmem_max = 56777216
net.core.wmem_default = 16777216
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_sack = 0
net.ipv4.tcp_orphan_retries = 0

적용 방법은 sysctl 명령을 사용하면 됩니다. 물론 리눅스 커널 파라미터를 수정하는 것이기 때문에 root 계정을 사용해야합니다.

$ sudo sysctl -p

 

 

(3) 사용자 limit 값 설정

운영체제에서는 파일을 열 수 있는 개수 제한이 있습니다. 파일 오픈 개수를 늘려주는 것이 좋습니다.

 

웹 서버나 JBoss 서버 모두 네트워크를 주로 사용합니다. 연결을 맺을 때 소켓을 사용하는 것입니다. 그런데 운영체제에서는 이 소켓도 파일처럼 간주합니다. FD(File Descriptor)는 프로세스가 열 수 있는 파일과 소켓을 모두 포함한 값입니다.

 

사용자가 사용할 수 있는 FD 개수가 작다면 열 수 있는 솤ㅅ, 즉 동시에 받아들일 수 있는 요청의 개수도 작아지게 되는 것입니다. 동시에 더 많은 요청을 처리하려면 FD 값도 그 만큼 커야 합니다. 

 

리눅스의 '/etc/security/limits.conf" 파일에서 'jbsoss' 사용자가 오픈할 수 있는 파일의 개수를 지정합니다. 이 값은 웹 서버와 JBoss 서버 모두 지정합니다.

 

또, jboss 사용자에 대한 nproc 값도 지정했는데, 이것은 프로세스의 최대 개수를 지정하는 것입니다.

# /etc/security/limits.conf
#
... 생략 ...
jboss	hard	nofile	65536
jboss	soft	nofile	65536
jboss	soft	nproc	2047
jboss	hard	nproc	16384

# End of file

 

 

 

  3. JBoss EAP 6 인스턴스 구성

(1) JBoss EAP 6 설치

먼저 설치할 디렉터리를 생성합니다.

$ sudo mkdir -p /JBOSS/domains
$ sudo mkdir -p /JBOSS/LOG/server11
$ sudo mkdir -p /JBOSS/LOG/server12
$ sudo mkdir -p /WebApp

 

JBoss EAP 6.2를 /JBOSS 디렉터리에 설치합니다.

$ cp jboss-eap-6.2.0.zip /JBOSS
$ cd /JBOSS
$ unzip jboss-eap-6.2.0.zip

 

/JBOSS 디렉터리를 'jboss' 사용자가 사용할 수 있도록 권한을 줍니다.

$ sudo chown -R jboss:jboss /JBOSS

 

 

(2) 네이티브 모듈 설치

네이티브 모듈은 아파치 웹 서버의 통신 모듈을 라이브러리로 만든 APR(Apache Portable Runtime)을 사용하여 HTTP, AJP 통신을 하는 모듈입니다. 이 모듈을 설치하면 통신 성능이 향상됩니다.

 

설치 방법은 간단합니다. 해당 플랫폼과 아키텍처에 맞는 파일을 다운로드하여 압축을 풀기만 하면 됩니다.

$ cp jboss-eap-native-6.2.0-RHEL6-x86_64.zip /JBOSS
$ cd /JBOSS
$ unzip jboss-eap-native-6.2.0-RHEL6-x86_64.zip

 

네이티브 모듈을 사용하려면 리눅스에 다음 패키지들을 설치해야 합니다.

$ sudo yum install nss elinks apr-devel apr-util-devel krb5-workstation mod_auth_kerb

 

네이티브 모듈을 JBoss EAP 6에서 사용하려면 웹 서브시스템에서 native를 true로 설정해야합니다.

$ vim configuration/standalone-ha.xml
<subsystem xmlns="urn:jboss:domain:web:1.5" default-virtual-server="default-host" instance-id="${jboss.node.name}" native="true">

 

 

(3) 인스턴스 구성

도메인 디렉터리에 JBoss 스탠드얼론 인스턴스들을 구성합니다. 이제부터는 'jboss' 사용자로 로그인하여 작업을 수행합니다.

 

① 인스턴스 복사

JBoss EAP 6가 설치된 디렉터리에 있는 standalone 디렉터리를 구성하려는 서버 인스턴스 디렉터리로 복사합니다.

$ cp /JBOSS/jboss-eap-6.2
$ cp -R standalone /JBOSS/domains/server11
$ cp -R standalone /JBOSS/domains/server12

 

② 스크립트 복사

github에서 다운로드한 스크립트 파일들을 JBoss 인스턴스 디렉터리로 복사합니다.

$ cp git/jboss-eap-6-scripts/standalone1
$ cp *.sh /JBOSS/domains/server11
$ cp *.sh /JBOSS/domains/server12
$ cp *.properties /JBOSS/domains/server11
$ cp *.properties /JBOSS/domains/server12

 

스크립트 파일에 실행 권한을 줍니다.

$ chomd u+x /JBOSS/domains/server11/*.sh
$ chomd u+x /JBOSS/domains/server12/*.sh

 

③ env.sh 파일 수정

각 인스턴스 디렉터리 server11, server12, server21, server22 디렉터리에서 다음 env.sh 파일의 디렉터리 설정과 IP 주소, 포트 오프셋 등을 각각 머신 및 인스턴스 이름에 맞게 변경합니다.

... 생략 ...
##### JBoss Directory Setup #####
export JBOSS_HOME=/JBOSS/jboss-eap-6.2
export DOMAIN_BASE=/JBOSS/domains
export SERVER_NAME=server11
export JBOSS_LOG_DIR=/JBOSS/LOG/server11
export PORT_OFFSET=100
export JBOSS_USER=jboss

export BIND_ADDR=192.168.0.101

export MULTICAST_ADDR=230.1.1.1
export JMS_MULTICAST_ADDR=231.7.1.1
export MODCLUSTER_MULTICAST_ADDR=224.1.1.105

export MGMT_ADDR=192.168.0.101
... 생략 ...

 

수정한 SERVER11/ENV.SH 파일을 SERVER12로 복사하면 몇가지 설정만 변경하면 됩니다.

$ cp env.sh ../server12

 

다음과 같이 server12/env.sh 파일 변경을 수행합니다.

... 생략 ...
export SERVER_NAME=server12
export JBOSS_LOG_DIR=/JBOSS/LOG/server12
export PORT_OFFSET=200
... 생략 ...

 

④ 관리자 추가

add-user.sh 스크립트를 실행하여 JBoss 관리자를 추가합니다.

$ cd /JBOSS/domains/server11
$ ./add-user.sh
$ cd /JBOSS/domains/server12
$ ./add-user.sh

 

 

⑤ 웹 서브시스템 설정

웹 서브시스템에 몇 가지 설정이 필요합니다. 먼저 mod_jk 연결을 위해서 세션 ID에 사용할 instance-id를 설정해야 합니다. 이 이름은 mod_jk의 워커 이름과 같아야 합니다.

 

여기서 JBoss 인스턴스의 이름인 server11, server12, server21, server22를 사용합니다. 이미 env.sh 파일에서 '-Djboss.node.name=$NODE_NAME'으로 설정했기 때문에 standalone-ha.xml 파일에 ${jboss.node.name}만 설정하면 인스턴스별로 해당 노드 이름이 설정됩니다.

 

또, HTTP 요청을 APR 모듈을 사용하여 처리하는 네이티브 모듈을 설치하였기 때문에 native를 true로 설정합니다.

$ cd /JBOSS/domains/server11
$ vim configuration/standalone-ha.xml
<subsystem xmlns="urn:jboss:domain:web:1.5" default-virtual-server="default-host" instance-id="${jboss.node.name}" native="true">

 

 

⑥ 스레드 풀 설정

HTTP/AJP 연결에 대한 스레드 풀의 최대값을 충분한 값으로 설정해 주어야 합니다. http-thread-pool을 최대 250개 사용할 수 있도록 설정합니다.

<subsystem xmlns="ur:jboss:domain:threads:1.1">
... 생략 ...
	<unbounded-queue-thread-pool name="http-thread-pool">
    	<max-threads count="250"/>
        <keepalive-time time="60" unit="minutes"/>
    </unbounded-queue-thread-pool>
... 생략 ...
</subsystem>

 

ajp 커넥터와 http 커넥터가 위에서 설정한 'http-thread-pool' 스레드 풀을 사용하도록 다음과 같이 설정합니다.

<connector name="ajp" protocol="AJP/1.3" scheme="http" socket-binding="ajp" executor="http-thread-pool" max-connections="3260"/>
<connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http" enable-lookups="false" executor="http-thread-pool" max-connections="3260"/>

 

 

⑦ 배포 스캐너 설정

별도의 디렉터리를 애플리케이션 배포 디렉터리로 사용할 수 있도록 배포 스캐너를 설정합니다.

<subsystem xmlns="urn:jboss:domain:deployment-scanner:1.1">
	<deployment-scanner path="deployments" relative-to="jboss.server.base.dir" scan-interval="5000"/>
    <deployment-scanner name="external-deployment-scanner" path="${jboss.external.deployment:/WebApp}" scan-interval="5000" auto-deploy-exploded="false"/>
</subsystem>

 

server11에서 설정한 standalone-ha.xml 파일을 server12로 복사합니다.

$ cd/JBOSS/domains/server11/configurtaion
$ standalone-ha.xml ../../server12/configuration

 

 

(4) 모듈 설정

JBoss EAP 6의 근간이 되는 기술이 바로 모듈입니다. 어떤 jar 파일이던지 모듈로 만들어서 사용할 수 있습니다. 예를 들면 최근 프로젝트 대부분에서 공통으로 사용하는 스프링 프레임워크도 모듈로 만들어 사용할 수 있습니다. 이렇게 하면 jar 파일들이 모듈에만 있으면 되기 때문에 배포할 애플리케이션의 크기가 상당히 줄어들게 됩니다.

 

다른 방법도 있지만, 데이터베이스 드라이버도 모듈로 등록하여 사용하게 됩니다.

 

그런데 JBoss EAP 6 자체도 모두 모듈이기 때문에 JBoss가 설치된 modules 디렉터리에는 수 많은 모듈들이 등록되어 있습니다. 모듈을 추가해 사용하다 보면 어떤 것이 원래 JBoss에 있었던 것인지 분간하기 어려워집니다.

 

그래서 다음과 같이 사용자의 모듈을 등록할 별도의 디렉터리를 구성하여 이 디렉터리만 추가하는 것이 관리 효율성이 높습니다. 다음은 사용자 모듈 디렉터리를 설정하는 방법을 설명합니다.

 

① 사용자 모듈 디렉터리 설정

사용자가 추가하는 모듈을 별도의 modules/system/layers/ext 디렉터리로 사용할 수 있도록 설정합니다.

$ cd /JBOSS/jboss-eap-6.2/modules
$ vim layers.conf

 

$JBOSS_HOME/modules/layers.conf 파일을 다음과 같이 작성합니다.

layers=ext

 

ext 디렉터리를 생성하여 사용자 모듈들을 사용할 수 있도록 합니다.

$ mkdir -p /JBOSS/jboss-eap-6.2/modules/system/layers/ext

 

데이터 베이스 드라이버를 모듈화할 때도 ext 디렉터리에 저장하면 됩니다.

 

 

② 글로벌 모듈

JBoss EAP 6에는 클래스 패스가 없습니다. 이전 버전에서 클래스 패스에 jar 파일을 등록하는 경우에는 어떻게 설정할까요? 모듈로 만들어 애플리케이션에서jboss-deployment-descriptor.xml 파일에서 의존성을 선언하여 사용하면 되지만, JNI를 이용하여 인스턴스에서 꼭 한 번만 초기화되어야 하는 외부 패키지(암호화 모듈이 이런 경우가 있음)를 사용하는 경우 이런 방법을 적용할 수 없습니다.

 

이때 사용하는 방법이 글로벌 모듈입니다. 예를 들어 abc.jar 파일과 def.jar파일이 JBoss 인스턴스 전체에서 사용되어야 하는 클래스라면 먼저 아래 디렉터리에 jar 파일을 복사합니다.

$ cp abc.jar /JBOSS/jboss-eap-6.2/modules/system/layers/ext/com/app/main
$ cp def.jar /JBOSS/jboss-eap-6.2/modules/system/layers/ext/com/app/main

 

jboss-eap-6.2/modules/system/layers/ext/com/app/main 디렉터리에 module.xml 파일을 다음과 같이 작성합니다. com.app라는 이름의 모듈에 abc.jar와 def.jar 파일을 등록합니다.

 

  • module.xml 파일
<?xml version="1.0" encoding="UTF-8"?>

<module xmlns="urn:jboss:module:1.1" name="com.app">
	<resources>
    	<resource-root path="abc.jar"/>
        <resource-root path="def.jar"/>
    </resources>
    
    <dependencies>
    </dependencies>
</module>

 

com.app 모듈을 JBoss의 클래스 패스처럼 사용할 수 있도록 standalone*.xml 파일에 글로벌 모듈을 설정합니다.

 

 

  • 글로벌 모듈 설정
<subsystem xmlns="urn:jboss:domain:ee:1.1">
	<spec-descriptor-property-replacement>false</<spec-descriptor-property-replacement>>
    <jboss-descriptor-property-replacement>true</<jboss-descriptor-property-replacement>>
    <global-modules>
    	<module name="com.app" slot="main"/>
    </global-module>
</subsystem>

 

③ JDK 클래스 파일들에 접근하는 모듈 설정

JBoss EAP 6에 포함된 sun.jdk 모듈은 JDK에서 제공하는 클래스들에 접근할 수 있도록 제공하는 모듈입니다. 암ㅎ화 모듈 같은 경우 이 모듈에 포함되어 있지 않습니다. 클래스를 로딩하려면 jboss-deployment-structure.xml 파일을 작성하여 아래와 같이 설정합니다.

 

WEB-INF/jboss-deployment-structure.xml

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.1">
	<deployment>
    	<dependencies>
        	<system>
            	<paths>
                	<path name="sun/security/action"/>
                    <path name="javax/crypto"/>
                </paths>
            </system>
        </dependencies>
    </deployment>
</jboss-deployment-structure>

 

 

(5) 인코딩 설정

웹 서브시스템의 URI 인코딩이나 Java의 파일 인코딩 등 애플리케이션에서 사용하는 인코딩을 설정해야 합니다. env.properties 파일에는 Java의 시스템 프로퍼티를 설정할 수 있습니다. 기본적으로 애플리케이션에서 사용할 UTF-8 인코딩을 위한 설정들이 되어 있습니다. env.properties 파일은 env.sh 파일에서 로딩하도록 설정되어 있습니다.

 

이외에도 Java 시스템 프로퍼티로 사용할 값들을 추가해도 됩니다.

org.apache.catalina.connector.URI_	encoding=utf-8
org.apache.catalina.connector.USE_BODY_ENCODING_FOR_QUERY_STRING=true
file.encoding=UTF-8

 

 

(6) alias 설정

매번 JBoss 인스턴스가 있는 디렉터리로 이동하는 것은 무척 번거로운 일입니다. 손쉬운 관리를 위해 JBoss 관리자 계정에 alias를 설정하면 작업을 매우 간편하게 할 수 있습니다. 한 머신에 여러 개의 인스턴스를 각각 다른 이름으로 구성하기 때문에 머신마다 s1, s2, s3... 로 똑같은 이름을 설정합니다. 여기서 s1의 1은 첫 번째 인스턴스를 의미하며 ㅍ트 오프셋은 100입니다.

 

이렇게 설정하면 어떤 머신에서나 JBoss 관리자 계정으로 로그인하여 's1', 's2'만 입력하면 해당 머신의 첫 번째, 두 번째 인스턴스로 이동할 수 있습니다. 이렇게 설정하면 여러 대의 리눅스 머신을 동시에 같은 명령을 실행할 수 있는 clusterssh와 같은 툴을 이용할 때 매우 유용합니다.

 

/home/jboss.bash_profile 파일에 다음 alias를 추가합니다.

 

  • 머신1의 alias 설정
alias s1='cd /JBOSS/domains/server11'
alias s2='cd /JBOSS/domains/server12'

 

  • 머신2의 alias 설정
alias s1='cd /JBOSS/domains/server21'
alias s2='cd /JBOSS/domains/server22'

 

 

(7) Exploded 애플리케이션 배포

session.war 애플리케이션을 github에서 다운로드하여 압축이 풀린(exploded) 형태로 deploy 합니다.

$ git clone https://github.com/nameislocus/session.git
$ cd /WebApp
$ mkdir session.war
$ cd session.war
$ jar xvf ~jboss/git/session/session.war

 

deployment 마커 파일을 만듭니다.

$ touch session.war.dodeploy

 

 

(8) 서버 시작

이제 서버를 시작할 준비가 되었습니다. WAS01, WAS02 머신에서 다음과 같이 서버를 구동합니다.

$ s1
$ ./start.sh
^C

$ s2
$ ./start.sh
^C

 

웹 브라우저에서 배포한 session.war 애플리케이션에 접속하여 동작을 확인합니다. WAS01, WAS02 머신의 각 인스턴스에 접속합니다.

http://192.168.0.101:8180/session/index.jsp
http://192.168.0.101:8280/session/index.jsp
http://192.168.0.102:8180/session/index.jsp
http://192.168.0.102:8280/session/index.jsp

 

서버를 정상 종료하려면 shutdown.sh를 실행합니다.

$ s1
$ ./shutdown.sh
$ s2
$ ./shutdown.sh
===========================================================
JBOSS_HOME=/JBOSS/jboss-eap-6.2
DOMAIN_BASE=/JBOSS/domains
SERVER_NAME=server11
CONFIG_FILE=standalone-ha.xml
BIND_ADDR=0.0.0.0
PORT_OFFSET=0
MULTICAST_ADDR=230.1.0.1
CONTROLLER=127.0.0.1:9999
===========================================================
{ "outcome" => "success" }

 

 

(9) JBoss 운영 방법

JBoss 관리자인 'jboss' 계정에 alias를 설정하였기 때문에 s1, s2만 입력하면 인스턴스 디렉터리로 이동합니다.

 

다음과 같이 스크립트 파일들을 실행하여 JBoss 인스턴스를 관리할 수 있습니다.

스크립트 설명
$ ./start.sh 인스턴스 시작
$ ./stop.sh 인스턴스 정상 종료
$ ./kill.sh
인스턴스 강제 종료
$ ./status.sh
인스턴스 수행 중인지 체크
$ ./nohup.sh
인스턴스 nohup 로그를 tail로 출력
$ ./tail.sh
인스턴스 서버 로그를 tail로 출력
$ ./dump.sh
인스턴스의 스레드 덤프 출력

 

 

 

  4. JBoss EWS 2 설치

(1) 필요 패키지 설치

웹 서버 설치에 필요한 패키지를 설치합니다.

$ sudo yum install nss elinks apr-devel apr-util-devel krb5-workstation mod_auth_kerb

 

(2) EWS 설치

다음과 같은 디렉터리에 설치합니다.

구분 디렉터리명 설명
제품설치 디렉터리 /APACHE/jboss-ews-2.0 JBoss EWS 2를 설치할 디렉터리
로그 디렉터리 /APACHE/LOG 로그 파일들을 저장할 디렉터리

 

다음과 같이 설치합니다.

$ sudo mkdir -p /APACHE
$ cd /APACHE
$ cp ~jboss/jboss-ews-httpd-2.0.1-RHEL6-x86_64.zip .
$ unzip jboss-ews-httpd-2.0.1-RHEL6-x86_64.zip
$ cd /APACHE/jboss-ews-2.0/httpd
$ ./.postinstall

 

다음과 같이 로그 디렉터리를 만듭니다.

$ mkdir -p /APACHE/LOG

 

 

(3) JBoss EWS 설정

Apache 웹 서버는 1.x 버전에서는 차일드 프로세스를 미리 만들어 놓은 prefork 방식을 사용하였고, 2.x 버전부터 스레드를 사용하는 worker 방식을 사용할 수 있습니다. 이것을 MPM(Multi-Processing Module)이라고 합니다. 이 방식을 사용하면 더 적은 리소스를 사용하여 더 많은 처리를 할 수 있습니다.

 

JBoss EWS 2에서는 미리 컴파일한 worker 모듈과 prefork 모듈, event 방식의 모듈을 제공합니다. 기본값은 prefork 모듈입니다. 성능과 안정성을 위해서 다음과 같이 worker 모듈로 변경합니다.

$ cd /APACHE/jboss-ews-2.0/httpd/sbin
$ mv httpd httpd.prefork
$ cp httpd.worker httpd

 

worker 방식으로 변경되었는지 httpd -l 옵션으로 worker.c가 출력되는지 확인합니다.

$ cd /APACHE/jboee-ews-2.0/httpd/sbin
$ ./httpd -l
Compiled in modules:
 core.c
 worker.c
 http_core.c
 mod_so.c

 

웹 브라우저와 웹 서버 간의 소켓 연결도 매번 연결하고 끊는 것을 반복하면 성능이 떨어질 수 밖에 없습니다. 하나의 웹 페이지르르 구성하는 수십 개의 이미지, css, js와 같은 정적 컨텐츠들을 가져오기 위해 매 요청마다 연결을 맺고 끊지 않도록 KeepAlive를 On으로 설정하면 성능이 향상됩니다.

 

worker 모듈에 대해서도 상세한 튜닝이 필요하겠지만, 다음과 같이 웹 서버가 제공하는 기본값보다 더 많은 요청을 동시에 처리할 수 있도록 httpd.conf 파일의 <IfModule worker.c> 부분을 설정합니다.

$ vim /APACHE/jboss-ews-2.0/httpd/conf/httpd.conf
... 생략 ...

# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive On
#
# MaxKeepAliveRequests: The maximum nuber of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommand you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 1000

# worker MPM
# StartServers : initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threds in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule worker.c>
StartServers	3
ServerLimit	64
MaxClients	4096
ThreadLimit	4096
MinSpareThreads	512
MaxSpareThreads	1024
ThreadsPerChild	64
MaxRequestsPerChild	10000
</IfModule>

ListenBackLog	1000

#
# ExtendedStatus controls whether Apache will generate "full" status
# information (ExtendedStatus On) or just basic information (ExtendedStatus
# Off) when the "server=status" handler is called. The default is Off.
#
ExtendedStatus On
... 생략 ...

 

 

(4) mod_jk 설정 방법

mod_jk를 설정하려면 네이티브 케넉터를 다운로드받아 설치해야 합니다.

JBoss가 설치된 머신 WAS01 머신에서 모듈을 설치하고 웹 서버로 복사합니다. mod_jk.so 파일을 웹 서버의 modules 디렉터리로 복사합니다. 여기서는 scp 명령을 이용하여 복사합니다.

$ cd /JBOSS
$ cp ~jboss/jboss-eap-native-webserver-connectors-6.2.0-RHEL6-x86_64.zip .
$ unzip jboss-eap-native-webserver-connectors-6.2.0-RHEL6-x86_64.zip
$ cd jboss-eap-6.2/modules/system/layers/base/native/lib64/httpd/modules
$ scp  *.so root@192.168.0.201:/APACHE/jboss-ews-2.0/httpd/modules

 

다음과 같이 mod_jk.conf 파일을 작성합니다. JkMount로 jsp, do, mvc로 끝나는 URL들을 로드 밸런서로 포워딩하도록 설정되어 있습니다.

$ sudo vim /APACHE/jboss-ews-2.0/httpd/conf.d/mod_jk.conf
# Load mod_jk module
# Update this path to match your modules location
LoadModule 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	/APACHE/LOG/modjk/mod_jk.log
JkShmFile	/APACHE/LOG/modjk/mod_jk.shm

# Set the jk log level [debug/error/info]
JkLogLevel	info

# Select the log format
JkLogStampFormat	"[%a %b %d %H:%M:%S %Y]"

# JkOptions indicate to send SSL KEY Size
JkOptions	+ForwardKeySize +ForwardURICompat -ForwardDirectories +ForwardURICompatUnparsed

# JkRequestLogFormat set the request format
JkRequestLogFormat	"%w %V %T"

# Send everything for context /examples to worker named worker1 (ajp13)
JkMount	/*.jsp lb
JkMount	/*.do lb
JkMount	/*.mvc lb
JkMount	/jkstatus* jkstatus

# Add jkstatus for managing runtime data
<Location /jkstatus>
JkMount jkstatus
Order Deny,Allow
Allow from 127.0.0.1
Allow from 192
Allow from 10
Deny from all
</Location>

 

다음과 같이 workers.properties 파일을 작성합니다. worker.template로 시작하는 설정은 모든 워커에 공통으로 적용되는 속성입니다. worker.server11에서 server11이 worker의 이름이며 이 이름은 JBoss EAP 6의 instance-id로 설정한 이름과 같아야 합니다.

$ sudo vim /APACHE/jboss-ews-2.0/httpd/conf.d/workers.properties
worker.list=lb,jkstatus

# Templates
worker.template.type=ajp13
worker.template.maintain=60
worker.template.lbfactor=1
worker.template.ping_mode=A
worker.template.ping_timeout=2000
worker.template.prepost_timeout=2000
worker.template.socket_timeout=60
worker.template.socket_connect_timeout=2000
worker.template.socket_keepalive=true
worker.template.connection_pool_timeout=60
worker.template.connect_timeout=10000
worker.template.recovery_options=7

worker.server11.reference=worker.template
worker.server11.host=192.168.0.101
worker.server11.port=8109

worker.server12.reference=worker.template
worker.server12.host=192.168.0.101
worker.server12.port=8209

worker.server21.reference=worker.template
worker.server21.host=192.168.0.102
worker.server21.port=8109

worker.server22.reference=worker.template
worker.server22.host=192.168.0.102
worker.server22.port=8209

worker.lb.type=lb
worker.lb.balance_workers=server11,server21,server12,server22
worker.lb.method=Session
worker.lb.sticky_session=True

worker.jkstatus.type=status

 

가상호스트를 사용하는 경우에는 다음과 같이 설정합니다. 가상호스트 내에서도 JKMount를 사용하여 포워딩 URL을 지정합니다.

$ sudo vim /APACHE/jboss-ews-2.0/httpd/conf.d/vhosts.conf

NameVirtualHost *:80

<VirtualHost *:80>
	DocumentRoot	"/WebApp/www"
    
    ServerName test.app.com
    ErrorLog	"/APACHE/LOG/app.com-error_log"
    CustomLog	"/APACHE/LOG/app.com-access_log" common
    DirectoryIndex	index.html index.jsp
    
    JkMount	/*.jsp lb
    JkMount	/*.do lb
    JkMount	/*.mvc lb
    JkMount	/jkstatus* jkstatus
</VirtualHost>

 

 

(5) JBoss EWS 2 시작 확인

웹 서버 sbin 디렉터리로 이동하여 웹 서버를 구동합니다.

$ cd /APACHE/jboss-ews-2.0/httpd/sbin
$ ./apachectl start

 

웹 브라우저로 다음 URL에 접속하여 mod_jk 상태를 확인합니다.

http://192.168.0.201/jkstatus

 

JBoss 인스턴스에 배포된 애플리케이션을 호출합니다.

http://192.168.0.201/session/index.jsp

 

 

 

(6) JBoss EWS 2 운영 방법

먼저 JBoss EWS 2가 설치된 디렉터리로 이동합니다.

$ cd /APACHE/jboss-ews-2.0/httpd/sbin

 

JBoss EWS 2는 80번 포트를 사용하기 때문에 root 계정으로 관리해야 합니다. JBoss EWS 2는 다음과 같이 운영할 수 있습니다.

운영 방법 설명
$./apachectl start 웹 서버 시작
$./apachectl  stop 웹 서버 종료
$./apachectl  restart
웹 서버 재시작
$./apachectl status
웹 서버 수행 중인지 체크
$ ps -ef | grep httpd ps 명령으로 웹 서버 프로세스가 있는지 체크
http://192.168.0.201/jkstatus mod_jk 연결상태 확인

 

 

 

참고 서적 : 거침없이 배우는 JBoss 

반응형

댓글