본문으로 건너뛰기

21.3 JBoss EAP 6 인스턴스 구성

JBoss EAP 6 설치

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

$ sudo mkdir -p /svc/test/was/domains

$ sudo mkdir -p /logs/was/server11

$ sudo mkdir -p /logs/was/server12

$ sudo mkdir -p /svc/test/was/domains/applications

JBoss EAP 6.2을 /svc/test/was 디렉터리에 설치한다.

$ cp jboss-eap-6.2.0.zip /svc/test/was

$ cd /svc/test/was

$ unzip jboss-eap-6.2.0.zip

/svc/test/was 디렉터리를 jboss 사용자가 사용할 수 있도록 권한을 준다.

$ sudo chown -R jboss.jboss /svc/test/was

$ sudo chown -R jboss.jboss /logs/was

네이티브 모듈 설치

네이티브 모듈은 아파치 웹 서버의 통신 모듈을 라이브러리로 만든 APR(Apache Portable Runtime)을 사용하여 HTTP, AJP 통신을 하는 모듈이다. 이 모듈을 설치하면 통신 성능이 향상된다. 자세한 내용은 ’20장. JBoss EAP 6 튜닝’의 4. 웹 서브시스템 절을 참조하라.

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

$ cp jboss-eap-native-6.2.0-RHEL6-x86_64.zip /svc/test/was

$ cd /svc/test/was

$ 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로 설정하여야 한다. 3.3절에서 인스턴스를 구성할 때 다음과 같이 설정하게 된다.

$ vi configuration/standalone-ha.xml

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

인스턴스 구성

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

인스턴스 복사

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

$ cd /svc/test/was/jboss-eap-6.2

$ cp -R standalone /svc/test/was/domains/server11

$ cp -R standalone /svc/test/was/domains/server12

스크립트 복사

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

$ cd git/jboss-eap-6-scripts/standalone1

$ cp *.sh /svc/test/was/domains/server11

$ cp *.properties /svc/test/was/domains/server11

$ cp *.sh /svc/test/was/domains/server12

$ cp *.properties /svc/test/was/domains/server12

*. sh 파일에 실행 권한을 준다.

$ chmod u+x /svc/test/was/domains/server11/*.sh

$ chmod u+x /svc/test/was/domains/server12/*.sh

env.sh 파일 수정

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

… 생략…

##### JBOSS Directory Setup #####
export JBOSS_HOME=/svc/test/was/jboss-eap-6.2
export DOMAIN_BASE=/svc/test/was/domains
export SERVER_NAME=server11
export JBOSS_LOG_DIR=/logs/was/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=/logs/was/server12
export PORT_OFFSET=200

… 생략…

관리자 추가

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

$ cd /svc/test/was/domains/server11

$ ./add-user.sh

$ cd /svc/test/was/domains/server12

$ ./add-user.sh

웹 서브시스템 설정

웹 서브시스템에 몇 가지 설정이 필요하다. 먼저 ‘16장. JBoss EAP 6클러스터링’에서 설명한 것과 같이 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 모듈 사용하여 처리하는 네이티브 모듈을 설치하였기 때문에 nativetrue로 설정한다.

$ cd /svc/test/was/domains/server11

$ vi configuration/standalone-ha.xml

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

스레드 풀 설정

스레드 풀의 설정에 대해서는 ‘20장. JBoss EAP 6 튜닝’에서 자세히 설명하고 있다.

HTTP/AJP 연결에 대한 스레드 풀의 최댓값을 충분한 값으로 설정해 주어야 한다.

http-thread-pool을 최대 250개 사용할 수 있도록 설정한다.

<subsystem xmlns="urn: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" socketbinding="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:/svc/test/was/domains/applications}" scan-interval="5000" auto-deploy-exploded="false"/>
</subsystem>

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

$ cd /svc/test/was/domains/server11/configuration

$ cp standalone-ha.xml ../../server11/configuration/

모듈 설정

JBoss EAP 6의 근간이 되는 기술이 바로 모듈이다. 모듈에 대해서는 이 책의 전반에 걸쳐 설명하고 있다. ‘6장. 모듈 아키텍처’에서 모듈에 대해서 자세히 설명하고 있으니 참고하라.

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

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

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

그래서, 다음과 같이 사용자의 모듈을 등록할 별도의 디렉터리를 구성하여 이 디렉터리에만 추가하는 것이 관리하기 편하다. 다음에서 사용자 모듈 디렉터리를 설정하는 방법을 알아보자.

사용자 모듈 디렉터리 설정

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

$ cd /svc/test/was/jboss-eap-6.2/modules

$ vi layers.conf

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

layers=ext

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

$ mkdir -p /svc/test/was/jboss-eap-6.2/modules/system/layers/ext

데이터베이스 드라이버를 모듈화할 때도 ext 디렉터리에 저장하면 된다. 데이터베이스 드라이버를 모듈로 만드는 방법은 ‘9장. 데이터소스 서브시스템’을 참고하라.

글로벌 모듈

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

이때 사용하는 방법이 글로벌 모듈이다.

예를 들어 abc.jar 파일과 def.jar 이 JBoss 인스턴스 전체에서 사용되어야 하는 클래스라면, 먼저 아래 디렉터리에 Jar파일을 복사한다.

$ cp abc.jar /svc/test/was/jboss-eap-6.2/modules/system/layers/ext/com/opennaru/main

$ cp def.jar /svc/test/was/jboss-eap-6.2/modules/system/layers/ext/com/opennaru/main

jboss-eap-6.2/modules/system/layers/ext/com/opennaru/main 디렉터리에 module.xml 파일을 다음과 같이 작성한다. com.opennaru 라는 이름의 모듈에 abc.jardef.jar파일을 등록하였다.

  • module.xml 파일

    <?xml version="1.0" encoding="UTF-8"?>
    <module xmlns="urn:jboss:module:1.1" name="*com.opennaru*">
    <resources>
    <resource-root path="abc.jar"/>
    <resource-root path="def.jar"/>
    </resources>
    <dependencies>
    </dependencies>
    </module>

    com.opennaru 모듈을 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.opennaru" slot="main"/>
    </global-modules>
    </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>

인코딩 설정

웹 서브시스템의 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

alias 설정

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

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

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

  • 머신1 의 alias설정

    alias s1='cd /svc/test/was/domains/server11'

    alias s2='cd /svc/test/was/domains/server12'
  • 머신2의 alias 설정

    alias s1='cd /svc/test/was/domains/server21'

    alias s2='cd /svc/test/was/domains/server22'

Exploded 애플리케이션 배포

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

$ git clone https://github.com/nameislocus/session.git

$ cd /svc/test/was/domains/applications

$ mkdir session.war

$ cd session.war

$ jar xvf ~jboss/git/session/session.war

deplolyment 마커 파일을 만든다.

$ touch session.war.dodeploy

서버 시작

이제 서버를 시작할 준비가 되었다.

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=/svc/test/was/jboss-eap-6.2
DOMAIN_BASE=/svc/test/was/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"}

JBoss 운영 방법

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

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

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

표 6. JBoss 인스턴스 운영 방법