멀티 톰캣 인스턴스로 실행하기 (Multiple Tomcat Instances)

Facebook Server Side Architecture Group #SSAG
https://www.facebook.com/groups/serverside/
1. 필요성

.실무 프로젝트의 deploy 환경은  3가지(“개발“, “스테이징“, “상용“)로 구분 됩니다.
물론 프로젝트의 상황과 환경에 따라서 다소 차이는 있지만 대부분 위에 언급한
단계로 개발을 진행 합니다.

개발 단계“는 말그대로 “개발을 할수 있는 최소 환경” 입니다. 대부분 이단계에서
개발자들은 많은 시간을 보내고, 테스트도 제일 많이 합니다.

스테이징 단계“는 “기능 및 성능을 테스트 하기 위한 환경” 입니다. 실제로 서비스만
하지 않을뿐 “상용 단계“와 거의 동일 환경으로 구성되어 있습니다.
외부 연동 서버, 성능 테스트를 진행하며 “상용단계“를 위한 최종 검증의 환경이라고 할수 있습니다.

상용 단계” 는 실제로 서비스하고,  고객이 접속하는 환경을 말합니다.

이렇게 개발 환경이 다르기 때문에 당연히 서버 구축 요구 사항도 틀립니다.
예를 들면 “개발 환경” 같은 경우에는  “One Server, One Instance, Multiple Context“를
주로 사용합니다.

하지만 “스테이징 단계” 이상 부터는 아래의 요구 사항을 수용해야 합니다.

  • 하나의 서버에서 2개이상 WAS 버전이 구동 될수 있다.
  • 상위 버전 업그레이드가 용이해야 하며, 기존 서비스 변경은 최소화 해야 한다.
  • 서비스별 튜닝 설정 (WAS, JNDI, Http Connection)이 별도로 구성되어야 한다.
  • 하나의 인스턴스를 Shutdown 해도 다른 서비스에 영향이 없어야 한다.
  • 운영 관리 및 장애 대응에 신속하게 처리 해야 한다.

2. Big Picture

dfdTomcat 디렉토리는 아래의 그림과 같습니다.

  • lib : Tomcat Engine이 사용하는 외부 라이브러리 (.jar) 디렉토리
  • bin : Tomcat를 런하는 명령 스크립트 디렉토리
  • conf : Tomcat Web 서비스를 위한 설정 파일 디렉토리
  • logs : 로그 파일 디렉토리
  • temp : Tomcat Engine에서 사용하는 임시 파일 디렉토리
  • webapps : 웹 어플리케이션 deploy 디렉토리
  • work : JSP 파일이 서블릿으로 컴파일(.class)된 디렉토리

여기서 재미난 유추를 할수 있습니다. “자바 서버군 오픈소스” (특히 Apache Project)의
디렉토리 구조는 Tomcat과 매우 유사한 structure로 되어 있습니다.
대표적인 것이 “하둡” 입니다.
그외에 “Cassandra“, “Flume“, “ActiveMQ“등도 매우 유사 합니다.

Anyway, 사실 Tomcat Engine은  “lib“, “bin” 디렉토리만 사용 합니다.
반면, 실제 서비스를 담당하는 인스턴스들은
conf“, “logs“, “temp“, “webapps“, “work” 디렉토리를 사용 합니다.
여기서 잠시 용어를 정리 하자면 인스턴스라 함은 하나의
jvm“을 말합니다.

그렇기 때문에 아래와 같이 물리적으로 디렉토리를 분리함으로써 “멀티 인스턴스
환경을 구성을 할수 있습니다.

$CATALINA_HOME/bin/startup.sh” 실행하면 실제로 “catalina.sh“이 실행 됩니다.
catalina.sh“은 “CATALINA_HOME” 환경 변수를 통해서 “Tomcat Engine” 디렉토리를
찾고 기동을 위한 준비 합니다. 그리고  “CATALINA_BASE” 환경변수에 있는 디렉토리를
찾아서 해당 인스턴스를 기동 합니다.

그렇기 때문에 2개의 환경변수 설정, 톰캣 디렉토리의 분리,
인스턴스별 기동/중지 스크립트 작성 및
server.xml 수정을 하면,
어렵지 않게 구현 하실수 있습니다.

여기서 잠시 Tomcat이 사용하는 “환경 변수“에 대해서 간략하게 설명 하겠습니다.

  • CATALINA_HOME : Tomcat Engine 디렉토리
  • CATALINA_BASE : 인스턴스 홈 디렉토리
  • CATALINA_TMPDIR : 인스턴스가 사용하는 임시 디렉토리
  • JAVA_HOME : 자바 홈 디렉토리
  • CLASSPATH : 클래스 패스 설정 정보

3. 설치 환경

.OS : CentOS 5.8 ※OS는 크게 차이가 없습니다.
JDK : 1.6.23
Tomcat : 7.x
Tomcat Home Directory : /home/beyondj2ee/was/tomcat7
Instance1 Directory : /home/beyondj2ee/was/apps/instance1
Instance2 Directory : /home/beyondj2ee/was/apps/instance2
JDK 설치 경로 : /home/beyondj2ee/java
사용자 계정 : beyondj2ee

4. 설치 하기

.(1) Tomcat 및 Java 홈 디렉토리 설정

※ 참고로 Tomcat 과 Java 설치는 생략 했습니다. 이와 관련된 부분은 다른 자료를 참고 하시기
바랍니다.

OS 홈 디렉토리에 있는 “.bash_profile“를 열어서 아래와 같이 환경 변수를 설정 합니다.

export JAVA_HOME=~/java
export CATALINA_HOME=~/was/tomcat7

(2) 인스턴스별 루트 디렉토리 생성

각 인스턴스별 디렉토리를 생성 합니다. 여기서는 2개만 생성하도록 하겠습니다.

# mkdir -p /home/beyondj2ee/was/apps/instance1
# mkdir -p /home/beyondj2ee/was/apps/instance2

(3) 인스턴스별 필수 디렉토리 복사

Tomcat Home” 디렉토리로 이동해서 각 인스턴스에게 필요한 디렉토리들을 복사 합니다.

# cd $CATALINA_HOME
# cp -R * /home/beyondj2ee/was/apps/instance1
# cp -R * /home/beyondj2ee/was/apps/instance2

필요 없는 디렉토리들을 삭제 합니다.

# cd /home/beyondj2ee/was/apps/instance1
# rm -rf LICENSE;rm -rf NOTICE;rm -rf RELEASE-NOTES;rm -rf RUNNING.txt;rm -rf ./bin;rm -rf ./lib
# cd /home/beyondj2ee/was/apps/instance2
# rm -rf LICENSE;rm -rf NOTICE;rm -rf RELEASE-NOTES;rm -rf RUNNING.txt;rm -rf ./bin;rm -rf ./lib

(4) 인스턴스별 server.xml 수정하기

각 인스턴스별로 server.xml를 수정합니다. 여기서 중요한 것은 “하나의 머신”에서
멀티로 인스턴스를 기동하기 때문에 Port가 충돌이 날수 있습니다.

그렇기 때문에 Port설정에 제일 유념해야 합니다.
실무에서는 반드시 각 인스턴스별 Port를 정책적으로 관리 해야 합니다.


Instance1의 sever.xml

# vi /home/beyondj2ee/was/apps/instance1/conf/server.xml
--- server.xml -----------------------------------------------
<server port="8005" shutdown="SHUTDOWN">
	.....
	<connector
		connectiontimeout="20000"port="8080"
		protocol="org.apache.coyote.http11.Http11NioProtocol"
		redirectport="8443" />
	<connector port="8009" protocol="AJP/1.3" redirectport="8443" />
</server>

Instance2의 sever.xml

# vi /home/beyondj2ee/was/apps/instance1/conf/server.xml
--- server.xml -----------------------------------------------
<server port="8105" shutdown="SHUTDOWN">
	.....
	<connector
		connectiontimeout="20000" port="8181"
		protocol="org.apache.coyote.http11.Http11NioProtocol"
		redirectport="81443" />
	<connector port="8109" protocol="AJP/1.3" redirectport="81443" />
</server>
  •  반드시 server 엘리먼트에 shutdown=”SHUTDOWN”이라고 선언 해야 합니다. 실제로 “shutdown”
    명령을 실행하면 위에 선언된 속성의 인스턴스를 찾아서 중지를 하기 때문입니다.
  • server port, http port, ajp port, redirectport 이렇게 4개의 포트를 충돌 없이 선언이 되어야 합니다.

(5) 인스턴스별 기동/중지 쉘 만들기

Instance1의 startup-instance1.sh

# vi /home/beyondj2ee/was/apps/instance1/startup-instance1.sh
--- startup-instance1.sh -----------------------------------------------
#!/usr/bin/env bash
export CATALINA_BASE=/home/beyondj2ee/was/apps/instance1
export JAVA_OPTS="-Djava.awt.headless=true -server -Xms512m -Xmx1024m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:+DisableExplicitGC"
export CATALINA_OPTS="-Denv=product -Denv.servername=instance1"
cd $CATALINA_HOME/bin
./startup.sh
  • “CATALINA_BASE”  환경 변수에 인스턴스1의 홈 디렉토리 경로를 설정 합니다.
  • “JAVA_OPS”, “CATALINA_OPTS” 환경 변수를 서비스 요건에 맞게 설정을 합니다.
  • “Tomat Home” 디렉토리의 “bin” 디렉토리로 이동후 “startup.sh”를 실행 합니다.

Instance1의 shutdown-instance1.sh

# vi /home/beyondj2ee/was/apps/instance1/shutdown-instance1.sh
--- shutdown-instance1.sh -----------------------------------------------
#!/usr/bin/env bash
export CATALINA_BASE=/home/beyondj2ee/was/apps/instance1
cd $CATALINA_HOME/bin
./shutdown.sh
  • “CATALINA_BASE”  환경 변수에 인스턴스1의 홈 디렉토리 경로를 설정 합니다.
  • “Tomat Home” 디렉토리의 “bin” 디렉토리로 이동후 “shutdown.sh”를 실행 합니다.

Instance2의 startup-instance2.sh

# vi /home/beyondj2ee/was/apps/instance2/startup-instance2.sh
--- startup-instance2.sh -----------------------------------------------
#!/usr/bin/env bash
export CATALINA_BASE=/home/beyondj2ee/was/apps/instance2
export JAVA_OPTS="-Djava.awt.headless=true -server -Xms512m -Xmx1024m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:+DisableExplicitGC"
export CATALINA_OPTS="-Denv=product -Denv.servername=instance2"
cd $CATALINA_HOME/bin
./startup.sh

Instance2의 shutdown-instance2.sh

# vi /home/beyondj2ee/was/apps/instance2/shutdown-instance2.sh
--- shutdown-instance2.sh -----------------------------------------------
#!/usr/bin/env bash
export CATALINA_BASE=/home/beyondj2ee/was/apps/instance2
cd $CATALINA_HOME/bin
./shutdown.sh

5. 서버 기동 및 확인

설치 및 설정이 끝났습니다.  확인을 위해서 각 인스턴스별 서버를 “startup“해 보겠습니다.
아래와 같이 각 인스턴스별 “” 스크립트를 실행 합니다.

두개의 브라우져를 열고, 각 인스턴스가 서비스 하는 “port”로 접속 합니다.

5. Conclusion

Tomcat Server는 오늘 날  세계적으로 Java WAS로서 제일 많은 사용하고 있습니다. 특히,
Tomcat7“이 출시 되면서 성능, 안정성, 다양한 기능들에 대해서 많은 변화가 있었습니다.

Multiple Tomcat 기동 방법“은 실제로 real 환경에서 종종 사용하는 팁입니다.
하지만 위에서 언급했듯이 “관리 정책“이 없으면, 오히려 더욱 시스템이 복잡해 질수 있습니다.
이점 유념하시면서 유용하게 사용 하셨으면 합니다.

※참고 자료

.
Multiple Instances of Tomcat with Apache
Multiple Tomcat Instances on Single Machine
Setting up multiple instances of Tomcat

One thought on “멀티 톰캣 인스턴스로 실행하기 (Multiple Tomcat Instances)”

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중