가장 유명한 Open 소스진영의 J2EE서버인 JBoss를 Linux에 설치해보겠습니다.
저는 2001년부터 써왔는데 실망시키지 않은 아주 성능 좋고 야무진 녀석입니다.

1. JBoss download
Jboss 공식 홈페이지는 http://www.jboss.org 연결하면 된다. (요즘은 http://labs.jboss.com으로 Redirection 되고 있음)
이페이지 Resources 부분의 Downloads 링크를 선택하면 된다 (이페이지의 유용한 사이트는 Documentation과 Forums인데 Open 소스지만 Documentation이 매우 잘되어 있고, Forums은 웬만한 질문에 대한 답을 다 달려있다고 해도 과언이 아니다. 물론 구글형에게 질문에도 Forums의 질문&답을 대부분 찾아내긴 한다.)

Downloads 링크를 선택하면 여러가지 Products가 있는데 이중 가장 유명한 것이 JBoss Application Server로 불리는 J2EE 서버이다. 이넘을 클릭한다.

현재 JBoss 5.0.0.Beta4 가 출시되어 있는데 (2008-02-10월 기준) Stable 상태인 버전을 다운로드 받는게 좋겠고, EJB 3.0을 사용하고자 한다면 4.2.2 GA를 다운로드 받기를 권한다. 이녀석은 default로 EJB3.0이 지원된다.

링크를 클릭하면 소스와 바이너리등을 골라서 받을 수 있는데 여기서는 jboss-4.2.2.GA.zip을 다운로드 받기로 한다.
이렇게 로컬에 다운로드 받은 Jboss-4.2.2.GA.ZIP 파일을 FTP 혹은 File Sharing(Samba같은 툴을 이용한)을 이용하여 LINUX 머신에 업로드 한다.

2. Unpacked JBoss & make soft link to physical directory
다운로드 받은 Jboss 패키지를 설치할 JBoss 서버 설치 디릭토리를 설정하고 다운로드 받은 패키지의 압축을 풀어 저장한다.

예를 들어 어떤 디렉토리 아리에 j2ee 디렉토리에 버전별로 JBoss를 설치한다고 가정하자.
shell에서 아래의 command를 진행하면 된다.

예) somedir/j2ee/jboss-4.2.2.GA
shell> ls somedir/j2ee <enter>
          jboss-4.2.2.GA.zip
shell> cd somedir/j2ee <enter>
shell> tar xvf jboss-4.2.2.GA.zip <enter>
shell> rm jboss-4.2.2.GA.zip <enter>
shell> ls <enter>
          jboss-4.2.2.GA/

LINUX에서 Jboss 서버와 관련하여 중요한 환경변수가 있는데 JAVA_HOME, JBOSS_HOME이다.
(JAVA_HOME은 Linux 시스템에서 이미 정해져 있는 경우가 대부분이다.)
보통 JBOSS_HOME은 JBoss의 버전에 상관없이 지정하는 경우가 대부분이다. 버전별로 지정하면 귀찮아 지기 때문인데, 예를들어 현재는 jboss-4.2.2.GA 버전이지만 업그레이드 되어 jboss-5.3.0.GA가 나오게 되면 JBOSS_HOME도 함께 변경해주어야 하기 때문이다.
그래서 나는 physical Jboss 버전은 항상 디스크에 저장하고 soft link를 사용하여 정의한다.
아래의 예에서 보듯
    shell>cd somedir/j2ee <enter>
    shell>ls <enter>
            jboss-4.2.2.GA        jboss-5.3.0.GA
    이경우 나는 soft link를 이용하여 어떤 버젼의 Jboss를 사용할 지를 결정하는데 다음과 같다.
    ㄱ. jboss-4.2.2.GA를 사용할 경우
        shell>ln -s jboss-4.2.2.GA jboss
    ㄴ. jboss-5.3.0.GA를 사용할 경우
        shell>ln -s jboss-5.3.0.GA jboss
    그리고 JBOSS_HOME은 somedir/j2ee/jboss로 지정한다. 여기서 jboss는 각각 physical jboss 버전에 대한 링크이다.
     shell>ls <enter>
         jboss@         jboss-4.2.2.GA          jboss-5.3.0.GA
     shell>ls -l jboss <enter>
        jboss -> jboss-4.2.2.GA/

이렇게 설치한 후 향후 업그레이드 할 필요가 있다고 판단하면 새로운 버전의 physical jboss 패키지를
somedir/j2ee 아래에 압축을 푼 다음 jboss의 링크를 삭제하고 새로운 버전의 jboss와 링크를 해주면 된다.
     shell> rm jboss <enter>
     shell> ln -s jboss-x.x.x.GA jboss <enter>

이후에 JBOSS_HOME은 다음과 같이 지정하면 된다.
export JBOSS_HOME=somedir/j2ee/jboss  (여기서 somedir은 /로 시작하는 절대 Path 이다.)
이것으로 JBoss의 기본 설치는 끝났다.

3. 서버의 선정
JBoss를 설치하면 3개 종류 서버가 있다.

JBOSS_HOME 디렉토리 아래에 server 라는 디렉토리가 있는데
shell>cd $JBOSS_HOME/server <enter>
shell>ls <enter>
    all/    default/    minimal/

이중 하나를 선택하여 서버를 실행시기게 되는데 특별한 의도가 없는한 default로 구성한 서버를 실행시키면 된다.

이중 어떤 서버를 실행시킬 것인가는 실행 스크립트에 어떤 configuration으로 구성된 서버를 실행시킬 것인가를 지정해주면 되는데 다음과 같다.
shell>cd $JBOSS_HOME/bin
shell>sh run.sh -c minimal <enter> -> minimal로 configuration으로 구성된 서버 실행
shell>sh run.sh -c all <enter>       -> all configuration으로 구성된 서버 실행
shell>sh run.sh <enter>               -> default configuration으로 구성된 서버 실행

앞으로 모든 설명은 default configuration으로 구성된 서버를 실행하는 것으로 한다.

4. Data Source의 설정
DataSource 설정 파일은 JBOSS_HOME/server/default/deploy 폴더 아래에 Data Source 관련정보를 포함한 XML 파일을 저장하면 끝이다. (다른 J2EE 서버보다 아주 간단하다고 생각한다)
나의 경우는 Data Source 정보를 저장한 파일 이름은 프로젝트코드명-ds.xml로 주로 지정한다.
여기서는 프로젝트 코드명인 sarah를 대입하면 sarah-ds.xml 이 되겠다.

J2EE서버 마다 DataSource설정하는 방법은 모두 다르다.
JBoss를 이용하여 Oracle,Sybase,MSSQL에 대하여 각각 어떻게 Data Source를 설정하는지 알아보자.
sarah-ds.xml을 구성하는 내용인데 comment는 모두 제외하였다.
jndi-name과 connection url ,user-name,password는 각자의 DB 환경에 맞게 수정하여야 한다.

ㄱ. Oracle인 경우
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
  <local-tx-datasource>
    <jndi-name>jdbc/sarah</jndi-name>
    <connection-url>jdbc:oracle:thin:@server:port:sid</connection-url>
    <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
    <user-name>winona</user-name>
    <password>ryder</password>
    <valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker</valid-connection-checker-class-name>
    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
      <metadata>
         <type-mapping>Oracle10g</type-mapping>
      </metadata>
  </local-tx-datasource>
</datasources>

ㄴ. Sybase인 경우
<?xml version="1.0" encoding="euc-kr"?>
<datasources>
  <local-tx-datasource>
    <jndi-name>jdbc/sarah</jndi-name>
    <connection-url>jdbc:sybase:Tds:server:port/db</connection-url>
    <driver-class>com.sybase.jdbc3.jdbc.SybDriver</driver-class>
    <connection-property name="CHARSET">eucksc</connection-property>
    <user-name>winona</user-name>
    <password>ryder</password>
    <min-pool-size>2</min-pool-size>
    <max-pool-size>10</max-pool-size>
    <idle-timeout-minutes>1</idle-timeout-minutes>
    <blocking-timeout-millis>100000</blocking-timeout-millis>
    <new-connection-sql>BEGIN TRAN select 1 COMMIT TRAN</new-connection-sql>
    <check-valid-connection-sql>BEGIN TRAN select 1 COMMIT TRAN</check-valid-connection-sql>
    <set-tx-query-timeout>true</set-tx-query-timeout>
    <query-timeout>600</query-timeout>
    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.SybaseExceptionSorter</exception-sorter-class-name>
    <track-statements>true</track-statements>
    <metadata>
       <type-mapping>Sybase</type-mapping>
    </metadata>
  </local-tx-datasource>
</datasources>

ㄷ. MSSQL인 경우
<?xml version="1.0" encoding="euc-kr"?>
<datasources>
  <local-tx-datasource>
    <jndi-name>jdbc/sarah</jndi-name>
    <connection-url>jdbc:sqlserver://server:port;SelectMethod=cursor</connection-url>
    <driver-class>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver-class>
    <user-name>winona</user-name>
    <password>ryder</password>
    <min-pool-size>2</min-pool-size>
    <max-pool-size>10</max-pool-size>
    <idle-timeout-minutes>1</idle-timeout-minutes>
    <blocking-timeout-millis>10000</blocking-timeout-millis>
    <new-connection-sql>select 1</new-connection-sql>
    <check-valid-connection-sql>select 1</check-valid-connection-sql>
    <set-tx-query-timeout>true</set-tx-query-timeout>
    <query-timeout>60</query-timeout>
    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.SybaseExceptionSorter</exception-sorter-class-name>
    <track-statements>true</track-statements>
    <metadata>
       <type-mapping>MSSQL</type-mapping>
    </metadata>
  </local-tx-datasource>
</datasources>


5. 라이브러리 설치
Data Source를 설치했다고 해서 JBoss 애플리케이션 서버가 DBMS에 SQL을 실행할 수 있는 것은 아니다.
JBoss에게 JDBC를 실행할 수 있는 클래스에 대한 경로 즉, JBoss의 클래스 패스에 JDBC 클래스를 등록해야 한다. JBoss는 시스템 라이버르리, 서버 라이브러리에 등록된 클래스들만 Startup시에 로드시키기 때문이다.
어떤이는 JBoss에게 필요한 클래스를 등록시키기 위해서 JBoss의 시스템 라이브러리,서버 라이브러리에 자신이 개발한 혹은 Third Party에서 만든 클래스를 추가하는 경우가 있는데 이는 절대로 바람직 하지 않다.

이에 대하여 나는 다음과 같은 방법을 사용한다.
ㄱ. JBoss의 시스템 라이브러리에는 절대 손대지 않는다.
     JBoss의 시스템 라이브러리의 경로는 JBOSS_HOME/lib 아래의 모든 파일 및 하위 디렉토리이다.
     절대로 JBOSS_HOME/lib 폴더 혹은 하위 폴더에 *.jar, *.zip 파일을 추가하지도 않고,삭제하지도 않는다.
ㄴ. JBoss의 서버 라이브러리에는 절대 손대지 않는다.
     JBoss의 3가지 configuration 중 default configuration을 사용한다고 가정 했을 때
     JBoss의 서버 라이브러리의 경로는 JBOSS_HOME/server/default/lib 이다.
     절대로 JBOSS_HOME/server/default/lib 아래에 있는 *.jar, *.zip 파일을 추가하지도 않고,삭제하지도 않는다.

ㄷ. JBoss에 클래스 추가하는 경우 ( System Wide하게 적용시키고자 할 때)
    JBoss 서버 라이브러리로 이동 후 필요한 클래스를 저장할 디렉토리를 생성한다.
    shell> cd JBOSS_HOME/server/default/lib <enter>
    shell> mkdir ext <enter>      - 사용자가 추가하는 클래스란 의미로 ext 란 이름의 폴더를 생성한다.
    shell> cd ext <enter>
    shell> mkdir jdom <enter>    - JDOM 관련 클래스를 이 폴더에 저장한다.
    shell> mkdir jdbc <enter>    - JDBC 관련 클래스를 이 폴더에 저장한다.
    shell> mkdir struts <enter>  - struts 관련 클래스를 이 폴더에 저장한다.

    그런다음 JBoss가 start up 할때 ext 디렉토리 아래에 추가한 파일을 JBoss의 클래스 패스에 추가하게 해주면 된다. 이렇게 하기 위해서는 JBoss configuration 파일의 핵심인 jboss-service.xml 파일를 수정하면 된다.
     shell> cd JBOSS_HOME/server/default/conf <enter>
     shell> vi jboss-service.conf <enter>

<?xml version="1.0" encoding="UTF-8"?>
<server>
   <classpath codebase="${jboss.server.lib.url:lib}" archives="*"/>

   <classpath codebase="${jboss.server.lib.url:lib}ext/jdbc" archives="*"/>
   <classpath codebase="${jboss.server.lib.url:lib}ext/jdom" archives="*"/>
   <classpath codebase="${jboss.server.lib.url:lib}ext/struts" archives="*"/>

 위의 3개의 내용을 추가로 입력해주면 된다. 즉, JBoss가 startup 할때 ext 폴더 아래에 있는 jdbc,jdom,struts 폴더에 있는 모든 파일을 클래스 패스에 추가하게 되는 것이다.
이렇게 폴더별로 JBoss 시스템 라이블러리와 사용자 라이브러리를 별도로 관리 하면 JBoss 전체에 적용되는 클래스패스에 어떤 이유로 어떤 용도로 어떤 클래스를 추가했는지 향후에 추적이 가능할 것이다.

6. JBOSS 실행하기
JBoss를 실행하기 위해서는 실행 스크립트가 있는 곳으로 이동한 후 실행 스크립트를 실행하면 된다.

shell>cd $JBOSS_HOME/bin <enter>
shell>sh run.sh <enter>
여기서는 default configuration을 실행하기 때문에 run.sh를 그냥 실행하면 된다.

주로 사용하는 옵션은 -b 옵션이 있는데 bind의 줄임말이다.
shell>sh.run.sh -b10.0.0.1 <enter> -> 호스트의 IP ADDRESS중 10.0.0.1 인터페이스로만 서비스한다.
일반적으로는 컴퓨터에 랜카드가 3개가 있다면 어느 쪽 네트워크로 부터 서비스 요청이 오더라도 서비스 해주는 것이 당연하기 때문에 이를 명확하게 하고자 한다면
shell>sh.run.sh -b0.0.0.0 <enter> -> 모든 랜 인터페이스로 들어온 서비스 요청을 받아들인다.

옵션외에 유용한 configuration parameter는 같은 폴더에 있는 run.conf에 정의되어 있는데
내가 주로 사용하는 옵션은 JBoss가 사용하는 힙 메모리의 크기를 지정한다.
default는 최대가 256M 정도로 충분하지 않기 때문에 이를 늘여야 하며 주로 추천하는 메모리의 크기는
컴퓨터의 물리적 메모리의 2/3 수준을 최대값으로 지정하면 되겠다.

shell>vi run.conf <enter>

if [ "x$JAVA_OPTS" = "x" ]; then
   JAVA_OPTS="-Xms256m -Xmx512m -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000"
fi

-Xms256m -Xms512m의 의미는 Startup 할때 자바 힙메모리를 최소 256M, 최대 512M로 생성하라는 뜻이다.

7. jmx-console의 활용
일단 JBoss가 실행되었다면 JBoss의 환경이 어떤지 확인할 수 있는 콘솔이 있는데
주소는
http://서버/jmx-console 이다. 웹 브라우저에 입력하면 된다.

아무른 보안장치를 해놓지 않았으면 바로 jmx-console의 메뉴들이 보일 것이다.
여기엔 정말 유용한 MBean들이 많이 있으며 , 여러가지 서버에 대한 정보 뿐만아니라 관리 툴들이 많다.
결정적으로 JBoss 서버를 셧다운 시킬 수도 있다.
다른 말로 말하면 현재 JBoss를 사용하는 사이트가 있다면 보안장치를 해놓지 않았다면
인터넷에서 누구나 JBoss를 Shutdown 시킬 수 있다는 것이다.

이에 JMX-Console은 반드시 보안장치를 해두어야 한다.

jmx-console에 대한 보안장치는 다음에 살펴보기로 한다.

Posted by
,