JBOSS EAP 6 Standalone 환경 구성하기
JBOSS EAP 6 설치를 끝내고 나면 Standalone 이나 Domain 모드로 운영하기 위한 환경 구성을 해야 한다. JBOSS EAP 6 Standalone 환경 구성은 설치한 JBOSS 에서 Standalone 디렉토리를 복사해서 구성하게 된다.
JBOSS 를 설치는 JBOSS_HOME 을 설치하는 것이다. 이것 자체로 서버를 운영할수 있지만 이것을 GLOBAL 로 하고 각각의 운영위한 서버는 JBOSS_HOME 에 Standalone, Domain 디렉토리를 복사하고 Localize 해서 만들어진다. 이는 마치 Tomcat 의 Multi Instance 구성하기와 유사하다.
기본환경
먼저 기본적인 환경을 체크하고 넘어가자. 다음과 같다.
- Linux: CentOS 6, 7
- JAVA_HOME: /opt/jdk1.8.0_91
- JBOSS_HOME: /opt/EAP-6.4.0
기본적으로 위와 같은 환경이 기본으로 갖추고 있어야 한다. 이를 기반으로 서비스를 위한 Local 서버를 구성할 수 있게 된다.
Command Line Parameter
JBOSS EAP 6 는 독자적인 서비스 노드를 구성하기위해서 Command Line Parameter 를 제공한다. 이를 이용하면 JBOSS EAP 6 에게 값을 전달할 수 있고 JBOSS EAP 6 행동을 제어할 수 있게 된다. 유용한 Command Line Parameter 는 다음과 같다.
Standalone
속성 이름 | 사용법 | 기본값 |
---|---|---|
java.ext.dirs | JDK 확장 디렉토리 경로 | null |
jboss.home.dir | JBOSS EAP 6 설치된 ROOT 디렉토리 | $JBOSS_HOME 환경변수로 standalone.sh 파일에 지정되 있음 |
jboss.server.base.dir | 서버 컨텐츠를 위한 기본 디렉토리 | jboss.home.dir/standalone |
jboss.server.config.dir | 기본 설정 디렉토리 | jboss.server.base.dir/configuration |
jboss.server.data.dir | persistent 데이터 파일 스토리지를 위해 사용되는 디렉토리 | jboss.server.base.dir/data |
jboss.server.log.dir | server.log 파일을 가지는 디렉토리 | jboss.server.base.dir/log |
jboss.server.temp.dir | 임시파일 스토리지를 위한 디렉토리 | jboss.server.base.dir/tmp |
jboss.server.deploy.dir | 배포된 컨텐츠를 저장하하는데 사용되는 디렉토리 | jboss.server.base.dir/deployments |
위 파라메터는 standanlone.sh 스크립트를 시작할때에 명령행 인자로 줄수 있다. 다시 바꿔 말하면 쉘 환경변수로 저장해 놓고 사용할 수 있다는 걸 의미한다.
이제 본격적으로 독자적인 서비스 노드를 구성해 보자.
독자적인 서비스 노드 구성
독자적인 서비스 노드를 구성하기 위해서 시스템 계정을 하나 만들고 JBOSS_BASE_DIR 로 쓰일 nodes 디렉토리를 생성한다.
1 2 3 4 5 |
]# useradd jboss ]# su - ]$ pwd /home/jboss ]$ mkdir nodes |
그리고 JBOSS_HOME 디렉토리에 standalone 디렉토리를 /home/jboss/nodes/node1 으로 복사한다.
1 2 |
]# cp -a /opt/EAP-6.4.0/standalone /home/jboss/nodes/node1 ]# chown jboss: -R /home/jboss/nodes |
WAS 서비스를 위해서 JBOSS_HOME 을 이용하는게 아니라 node1 을 이용하게 하는게 목적이다. 모든 서비스는 node1 을 통해서 이루어진다. WAS 의 설정, 컨텐츠 배포, 또 다른 WAS 와 연동등도 모두 node1 을 통해서 이루어지게 된다. 결국에는 JBOSS_HOME 은 일종의 라이브러리와 같은 역활을 담당하게 된다.
그렇다면 node1 을 구동시키기 위한 스크립트가 필요하다. 그리고 이러한 스크립트는 앞에서 설명한 Command Line Parameter 를 이용해서 구동환경을 조성하게 된다.
구동 스크립트
구동스크립트를 만들때에는 다음과 같은 세가지 영역을 포함한다.
- JBOSS 를 위한 변수
- JVM 옵션 변수
- 시작 스크립트
각각의 영역은 파일로 작성되어지고 시작스크립트에서 호출되어서 사용되어지게 될 것이다. 앞으로 작성하게될 파일들의 목록은 다음과 같다.
- jboss-env.conf
- jboss-env.sh
- jboss.properties
- jvm-env.conf
- jboss-run.sh
- jboss-cli.sh
한가지 덧붙이자면, 꼭 이렇게 파일들을 조각낼 필요는 없다. 조각난 파일들로 인해서 오히려 효율이 떨어지고 실수가능성이 높아지는 경우도 많다. 하나의 파일에서 모두 다 처리해도 상관이 없다.
jboss-env.conf
이 파일은 JBOSS EAP 6 를 위한 환경 변수들을 정의한다. 그 내용은 다음과 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
JBOSS_NODE_NAME=node01 JBOSS_PORT_OFFSET=100 JBOSS_USER=jboss JBOSS_HOME=/opt/EAP-6.4.0 JBOSS_NODE_BASE_DIR=/home/jboss/nodes JBOSS_PIDFILE=${JBOSS_NODE_BASE_DIR}/${JBOSS_NODE_NAME}/run/jboss-eap-${JBOSS_NODE_NAME}.pid JBOSS_CONFIG=standalone.xml JBOSS_BASE_LOG_DIR=${JBOSS_NODE_BASE_DIR}/${JBOSS_NODE_NAME}/log JBOSS_CONSOLE_LOG=${JBOSS_BASE_LOG_DIR}/${JBOSS_NODE_NAME}-console.log JBOSS_GC_LOG=${JBOSS_BASE_LOG_DIR}/${JBOSS_NODE_NAME}-gc.log FILE_ENCODING='UTF-8' SUN_JNU_ENCODING='UTF-8' JBOSS_BIND_ADDR=0.0.0.0 JBOSS_MANAGEMENT_ADDR=127.0.0.1 JBOSS_CONTROLLER_IP=${JBOSS_MANAGEMENT_ADDR} JBOSS_MULTICAST_ADDR=230.0.0.4 JBOSS_JMS_MULTICAST_ADDR=231.7.0.1 JBOSS_MODCLUSTER_MULTICAST_ADDR=224.0.1.105 LAUNCH_JBOSS_IN_BACKGROUND=true STARTUP_WAIT=30 SHUTDOWN_WAIT=30 |
이 파일은 시스템 환경변수를 지정하는데 있다. 이러한 시스템 환경변수는 나머지 환경파일이나 실행스크립트에서 활용하게 된다.
내용을 간단하게 보면 JBOSS_HOME 과 JBOSS_NODE_BASE_DIR 를 정의해주고 있다. 그리고 JBOSS EAP 6에서 이용할 각종 포트와 주소들도 함께 정의해주고 있다.
jboss-env.sh
이 파일은 실제 JBOSS EAP 6 에 명령행 파라메터를 작성한다. 내용은 다음과 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
#!/bin/sh DATE=`date +%Y%m%d%H%M%S` BASE_DIR=$(dirname $0) export JBOSS_CONF=$BASE_DIR/jboss-env.conf [ -r "$JBOSS_CONF" ] && . "${JBOSS_CONF}" let JBOSS_CONTROLLER_PORT=9999+${JBOSS_PORT_OFFSET} export JBOSS_CONTROLLER_PORT ########## JBoss System module and User module directory ########## export JBOSS_MODULEPATH=$JBOSS_HOME/modules:$JBOSS_HOME/modules/ext # JVM Options : Server export JAVA_OPTS="-server $JAVA_OPTS" # 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" export JAVA_OPTS=" $JAVA_OPTS -Djava.awt.headless=true" export JAVA_OPTS=" $JAVA_OPTS -Dfile.encoding=${FILE_ENCODING}" export JAVA_OPTS=" $JAVA_OPTS -Dsun.jnu.encoding=${SUN_JNU_ENCODING}" export JAVA_OPTS=" $JAVA_OPTS -Djboss.home.dir=${JBOSS_HOME}" export JAVA_OPTS=" $JAVA_OPTS -Djboss.server.base.dir=${JBOSS_NODE_BASE_DIR}/${JBOSS_NODE_NAME}" export JAVA_OPTS=" $JAVA_OPTS -Djboss.server.log.dir=${JBOSS_BASE_LOG_DIR}" export JAVA_OPTS=" $JAVA_OPTS -Djboss.socket.binding.port-offset=${JBOSS_PORT_OFFSET}" export JAVA_OPTS=" $JAVA_OPTS -Djboss.node.name=${JBOSS_NODE_NAME}" export JAVA_OPTS=" $JAVA_OPTS -Djboss.bind.address.management=${JBOSS_MANAGEMENT_ADDR}" export JAVA_OPTS=" $JAVA_OPTS -Djboss.bind.address=${JBOSS_BIND_ADDR}" #export JAVA_OPTS=" $JAVA_OPTS -Djboss.bind_addr=$JBOSS_MULTICAST_ADDR" #export JAVA_OPTS=" $JAVA_OPTS -Djboss.default.jgroups.stack=tcp" export JAVA_OPTS=" $JAVA_OPTS -Djboss.default.multicast.address=$JBOSS_MULTICAST_ADDR" export JAVA_OPTS=" $JAVA_OPTS -Djboss.messaging.group.address=$JBOSS_JMS_MULTICAST_ADDR" export JAVA_OPTS=" $JAVA_OPTS -Djboss.modcluster.multicast.address=$JBOSS_MODCLUSTER_MULTICAST_ADDR" export JAVA_OPTS=" $JAVA_OPTS -Dorg.jboss.as.logging.per-deployment=true" export JAVA_OPTS=" $JAVA_OPTS -Dserver.mode=local" #JBOSS_OPTS="$JBOSS_OPTS -Djboss.jvmRoute=jvm1" #JBOSS_OPTS="$JBOSS_OPTS -Djboss.mod_cluster.jvmRoute=node1" #JBOSS_OPTS=" $JBOSS_OPTS -Dexternal.deployment.dir=$DOMAIN_BASE/$SERVER_NAME/biz" #export JAVA_OPTS=" $JAVA_OPTS -Djboss.server.config.dir=${JBOSS_NODE_BASE_DIR}/${JBOSS_NODE_NAME}/configuration" #export JAVA_OPTS=" $JAVA_OPTS -Djboss.domain.config.user.dir=${JBOSS_NODE_BASE_DIR}/${JBOSS_NODE_NAME}/configuration" export LD_LIBRARY_PATH=$LD_LIBRARY_PATH echo "==================================================================" echo "JAVA_HOME=$JAVA_HOME" echo "JBOSS_HOME=$JBOSS_HOME" echo "JBOSS_NODE_NAME=$JBOSS_NODE_NAME" echo "JBOSS_NODE_BASE_DIR=$JBOSS_NODE_BASE_DIR" echo "JBOSS_CONFIG=$JBOSS_CONFIG" echo "JBOSS_BIND_ADDR=$JBOSS_BIND_ADDR" echo "JBOSS_PORT_OFFSET=$JBOSS_PORT_OFFSET" echo "JBOSS_PIDFILE=$JBOSS_PIDFILE" echo "JBOSS_CONSOLE_LOG=$JBOSS_CONSOLE_LOG" echo "JBOSS_GC_LOG=$JBOSS_GC_LOG" echo "==================================================================" |
jboss-env.conf 파일에서 정의한 환경변수들을 사용하고 있다.
jvm-env.conf
이름에도 알수 있듯이 jvm 설정을 위한 내용을 담고 있다. 내용은 다음과 같다.
1 2 3 4 5 6 7 8 9 10 11 |
#!/bin/sh # JVM Options : Memory export JVM_OPTS=" $JVM_OPTS -Xms1024m -Xmx1024m -XX:MaxPermSize=256m" export JVM_OPTS=" $JVM_OPTS -XX:+PrintGCTimeStamps " export JVM_OPTS=" $JVM_OPTS -XX:+PrintGCDetails " export JVM_OPTS=" $JVM_OPTS -Xloggc:${JBOSS_GC_LOG}" #export JVM_OPTS=" $JVM_OPTS -XX:+UseParallelGC " export JVM_OPTS=" $JVM_OPTS -XX:+UseConcMarkSweepGC " export JVM_OPTS=" $JVM_OPTS -XX:+ExplicitGCInvokesConcurrent " export JVM_OPTS=" $JVM_OPTS -XX:-HeapDumpOnOutOfMemoryError " |
JVM 이 사용할 메모리양과 GC 종류를 정의해주고 있다.
jboss-run.sh
이 파일은 독자적인 서비스 노드인 node1 을 시작하고 중지시키기위한 스크립트이다. 위에서 설명한 모든 파일들을 Source 해 사용하고 JBOSS EAP 6 가 제공하는 레드햇 계열의 init 스크립트를 활용한다. JBOSS EAP 6 를 설치를 하고 나면 JBOSS_HOME/bin/init.d 디렉토리에 레드햇 계열 리눅스를 위한 서비스 시작, 중지 스크립트가 있다. jboss-run.sh 는 위에서 기술한 모든 환경변수 세팅 파일들을 읽어서 최종적으로 JBOSS EAP 6 의 init 스크립트를 실행시키게 된다. 내용은 다음과 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#!/bin/sh BASE_DIR=$(dirname $0) # jvm setting export JBOSS_JVM=$BASE_DIR/jvm-env.conf [ -r "$JBOSS_JVM" ] && . "${JBOSS_JVM}" . ${BASE_DIR}/jboss-env.sh export JAVA_OPTS=" $JAVA_OPTS $JVM_OPTS" if [ "x$1" == "xstart" ]; then if [ -e $JBOSS_CONSOLE_LOG ]; then mv $JBOSS_CONSOLE_LOG ${JBOSS_CONSOLE_LOG}.${DATE} fi if [ -e $JBOSS_GC_LOG ]; then mv $JBOSS_GC_LOG ${JBOSS_GC_LOG}.${DATE} fi fi ${JBOSS_HOME}/bin/init.d/jboss-as-standalone.sh $1 |
맨 마지막이 바로 JBOSS EAP 6 에서 제공하는 init 스크립트를 호출하는 부분이다. $1 인자값은 start, stop 등으로 시작과 중지를 시킬수 있도록 했다.
jboss.properties
이 파일은 key=value 형태로 값을 지정하고 JBOSS EAP 6 실행시 값을 반영할 수 있게 해준다. 이는 명령행 인자 전달과 동일한 효과를 내지만 오로지 JBOS EAP 6 속성만을 지정해야 한다. 명령해 인자 파라메터는 정확하게 JBOSS EAP 6 에 전달하는것이 아니라 JVM 으로 전달해 JBOSS EAP 6 이 그것을 읽는 방식일 취한다.
어쨌든, jboss.properties 의 내용은 다음과 같다.
1 2 3 4 5 |
org.apache.catalina.connector.URI_ENCODING=UTF-8 org.apache.catalina.connector.USE_BODY_ENCODING_FOR_QUERY_STRING=true org.apache.coyote.http11.Http11Protocol.MAX_HEADER_SIZE=8192 org.apache.coyote.ajp.DEFAULT_CONNECTION_TIMEOUT=60000 org.apache.coyote.http11.DEFAULT_CONNECTION_TIMEOUT=60000 |
jboss-cli.sh
JBOSS EAP 6 로 넘어오면서 많은 변화가 있었지만 그중에 하나가 바로 명령행 콘솔에서 JBOSS EAP 6 을 제어할 수 있다는데 있다. 이것은 JBOSS_HOME/bin/jboss-cli.sh 파일을 통해서 실행되는데, 여기서 jboss-cli.sh 파일을 별도로 만드는 이유는 node1 에 맞추기 위해서다. 내용을 보면 이해가 될 것이다.
1 2 3 4 5 6 7 8 9 |
#!/bin/sh BASE_DIR=$(dirname $0) . $BASE_DIR/jboss-env.sh export JAVA_OPTS=" -Djava.awt.headless=false $JAVA_OPTS" $JBOSS_HOME/bin/jboss-cli.sh --controller=$JBOSS_CONTROLLER_IP:$JBOSS_CONTROLLER_PORT --connect $@ |
node1 을 위한 jboss-env.sh 를 소스하고 있다. 이렇게 함으로써 node1 을 위한 환경변수들을 사용해 node1 을 위한 명령행 콘솔로 진입하게 된다.
정리
지금까지 기술한 것을 정리하면 다음과 같다.
- /opt/EAP-6.4.0/standalone 디렉토리를 /home/jboss/nodes/node1 으로 복사
- node1 안에 위에서 기술한 파일들을 작성
시작, 중지
이제 모든 파일을 다 만들었다면, node1 서비스를 시작, 중지 시켜보자. 시작과 중지는 다음과 같이 한다. 참고로 이 스크립트의 실행은 반드시 슈퍼유저인 root 로 해야한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
]# ./jboss-run.sh start ================================================================== JAVA_HOME=/opt/java JBOSS_HOME=/opt/EAP-6.4.0 JBOSS_NODE_NAME=node01 JBOSS_NODE_BASE_DIR=/home/jboss/nodes JBOSS_CONFIG=standalone.xml JBOSS_BIND_ADDR=0.0.0.0 JBOSS_PORT_OFFSET=100 JBOSS_PIDFILE=/home/jboss/nodes/node01/run/jboss-eap-node01.pid JBOSS_CONSOLE_LOG=/home/jboss/nodes/node01/log/node01-console.log JBOSS_GC_LOG=/home/jboss/nodes/node01/log/node01-gc.log ================================================================== Starting jboss-as: [ OK ] |
init 스크립트를 이용하기 때문에 자동으로 백그라운드로 전환되고 화면에는 아무것도 나오지 않는다. 구동시에 화면에 뿌려지는 내용은 로그로 기록된다.
중지는 다음과 같이 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
]# ./jboss-run.sh stop ================================================================== JAVA_HOME=/opt/java JBOSS_HOME=/opt/EAP-6.4.0 JBOSS_NODE_NAME=node01 JBOSS_NODE_BASE_DIR=/home/jboss/nodes JBOSS_CONFIG=standalone.xml JBOSS_BIND_ADDR=0.0.0.0 JBOSS_PORT_OFFSET=100 JBOSS_PIDFILE=/home/jboss/nodes/node01/run/jboss-eap-node01.pid JBOSS_CONSOLE_LOG=/home/jboss/nodes/node01/log/node01-console.log JBOSS_GC_LOG=/home/jboss/nodes/node01/log/node01-gc.log ================================================================== Stopping jboss-as: [ OK ] |
정상적으로 종료 되는 것을 볼 수 있으며 보다 자세한 내용은 로그를 보면 된다.