Recent Posts
Recent Comments
Link
11-25 15:27
Today
Total
관리 메뉴

삶 가운데 남긴 기록 AACII.TISTORY.COM

하나의 tomcat으로 여러 인스턴스를 구동하는 방법 feat. CentOS 본문

DEV&OPS/Linux & Cloud

하나의 tomcat으로 여러 인스턴스를 구동하는 방법 feat. CentOS

ALEPH.GEM 2023. 4. 9. 14:52

CATALINA_HOME과 CATALINA_BASE를 분리

Tomcat 하나에서 여러 web application 을 context root를 분리해서 구동시킬 수 있습니다.

그런데 $CATALINA_HOME과 $CATALINA_BASE를 분리해서 하나의 Tomcat으로 여러개의 인스턴스를 각각 다른 포트 번호로 구동할 수도 있습니다.
여러 인스턴스로 구동하게 되면 각각의 구동 환경을 분리해서 webapp을 구동시킬 수 있습니다. 
이렇게 하면 tomcat을 업데이트 할 때 인스턴스는 그대로 두고 tomcat만 교체하면 되기 때문에 편리합니다.
server.xml 파일 하나에 여러 호스트 정보를 등록해서 관리 할 수도 있는데 이런 경우 Tomcat 재구동시 모든 서비스들이 재시작되므로 추천하지 않습니다.

 

 

Tomcat Engine과 Tomcat Instance

Tomcat Engine은 CATALINA_HOME(tomcat 설치 경로)의 bin, lib 디렉토리를 말합니다.
Tomcat Instance는 웹앱의 구도엥 필요한 환경, 로그, 웹앱구동에 관련된  conf(설정), logs(로그), webapps(웹어플리케이션), work(jsp구동용), temp(임시) 디렉토리를 말합니다.
그래서 톰캣 인스턴스를 여러개 구동시키려면 위 디렉토리들을 복사한 뒤 각각 startup/shutdown 스크립트를 따로 만들어 두면 됩니다.

 

 

멀티 인스턴스 구성 절차 요약

여기서는 tomcat의 다운로드 및 압축해제는 생략합니다.

tomcat 엔진($CATALINA_HOME)의 경로는 /home/testuser/apache-tomcat-9.0.45 이라고 가정합니다.

또한 각각 구동시킬 인스턴스들의 생성 규칙을 포트 번호에 따라 tom8080, tom8180, tom8280 이렇게 3개를 구동시킨다고 가정합니다.

 

톰캣 인스턴스를 여러개 구동하려면 아래 절차에 따라 구성해주면 됩니다.

1. 인스턴스용 디렉토리를 생성합니다.
2. $CATALINA_HOME에 있는 conf, logs, webapps, work, temp 디렉토리를 $CATALINA_BASE(인스턴스들의 디렉토리)로 사용할 디렉토리로 복사합니다.
3. 각 인스턴스 별로 conf 디렉토리가 복사되었으므로, 각각의 conf/server.xml에서 port등 환경을 설정합니다.
4. 각 인스턴스의 start/shutdown 스크립트를 만듭니다.
5. 방화벽에서 server.xml에 등록한 포트들을 추가시켜줍니다.

 

 

1. 인스턴스 디렉토리 생성

우선 인스턴스들이 저장될 디렉토리 생성합니다.

여기서는 /app/tomcat/의 하위 디렉토리에 각각 인스턴스들을 복사한다고 가정합니다.

mkdir -p /app/tomcat


여기서는 tomcat을 관리하는 계정을 testuser로 가정합니다.
위에서 만든 디렉토리에 testuser에게 소유권 부여를 합니다. (sudo)

chown -R testuser:testuser /app/tomcat

 

 

2. CATALINA_BASE 구성

우선 첫번 째 인스턴스인 tom8080라고 명명 할 인스턴스용 로그 디렉토리 생성합니다.

cd /app/tomcat
mkdir -p tom8080/logs

이렇게 나머지  tom8180, tom8280로 명명할 인스턴스들도 각각 로그용 디렉토리를 만들어 줍니다.
이 디렉토리에는 각각 인스턴스 별로 catalina.out 파일이 저장 될 것입니다. 

다음으로 $CATALINA_HOME의 conf와 webapps 디렉토리를 각각의 $CATALINA_BASE로 복사합니다.

cp -a /home/testuser/apache-tomcat-9.0.45/conf tom8080
cp -a /home/testuser/apache-tomcat-9.0.45/webapps tom8080

이렇게 $CATALINA_BASE로 분리해서 구동시킬 웹 어플리케이션들의 파일을 각각 인스턴스 tom8080, tom8180, tom8280 에 복사합니다.

 

 

3. 인스턴스 환경 설정

2.에서 각각 인스턴스에 conf 디렉토리가 복사되었기 때문에 conf 안에 있던 server.xml 파일이 각각의 인스턴스 별로 같이 복사되었을 겁니다.
이 각각의 인스턴스별로 복사된 server.xml을 열어서 각각의 인스턴스들이 사용할 포트를 설정해줍니다.

vi ./tom8080/conf/server.xml
<Server port="8005" shutdown="SHUTDOWN">
  <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8043" />

    
각각의 인스턴스별로 포트가 겹치면 안되므로
8005, 8105, 8205
8080, 8180, 8280
8043, 8143, 8243    
이런 식으로 서로 안 겹치게 설정합니다.

 

 

4. startup.sh / shutdown.sh 생성

각각 인스턴스 별로 startup 스크립트를 생성합니다.
아래에 나오는 wasenv는 was에서 사용할 환경 설정을 export하는 파일이라고 가정합니다. 

vi tom8080/startup.sh
export CATALINA_HOME=/home/testuser/apache-tomcat-9.0.45
export CATALINA_BASE=/app/tomcat/8080
source $CATALINA_BASE/wasenv
export CATALINA_PID=$CATALINA_BASE/conf/8080.pid

PID_CNT=`ps -ef | grep 8080 | grep tomcat | grep -v grep | wc -l`

if [ ${PID_CNT} -eq 0 ]; then
   cd $CATALINA_HOME/bin
   ./startup.sh 
   exit
else
   echo '8080 WAS aleady running...'
   exit
fi


예를 들어, tom8180 인스턴스의 경우 아래처럼 변경하면 되겠죠.

vi tom8180/startup.sh
export CATALINA_HOME=/home/testuser/apache-tomcat-9.0.45
export CATALINA_BASE=/app/tomcat/8180
source $CATALINA_BASE/wasenv
export CATALINA_PID=$CATALINA_BASE/conf/8180.pid

PID_CNT=`ps -ef | grep 8180 | grep tomcat | grep -v grep | wc -l`

if [ ${PID_CNT} -eq 0 ]; then
   cd $CATALINA_HOME/bin
   ./startup.sh 
   exit
else
   echo '8180 WAS aleady running...'
   exit
fi


혹시 $CATALINA_HOME/bin/catalina.sh 안에 CATALINA_PID 환경 변수를 등록했다면 주석으로 막아둬야 합니다.
왜냐하면 위 스크립트는 톰캣 엔진($CATALINA_HOME/bin)의 startup.sh를 실행하는데 이 스크립트 또한 내부에서 catalina.sh를 실행하기 때문입니다.
8080.pid는 인스턴스 구동시 PID가 저장되는 파일이며 shutdown시 자동 삭제되는 파일입니다.
톰캣 엔진은 1개를 공유해서 사용하기 때문에 각각 인스턴스들의 PID를 CATALINA_PID 변수로 따로 관리해주면 됩니다.
이런식으로 tom8180, tom8280도 각각 startup.sh 스크립트를 만들어줍니다.

이번엔 shutdown.sh 스크립트도 만들어봅니다.

vi tom8080/shutdown.sh
export CATALINA_HOME=/home/testuser/apache-tomcat-9.0.45
export CATALINA_BASE=/app/tomcat/8080
export CATALINA_PID=$CATALINA_BASE/conf/8080.pid
$CATALINA_HOME/bin/shutdown.sh

그리고 나서 위 스크립트들의 실행 권한을 부여합니다.(sudo)

chmod u+x startup.sh
chomd u+x shutdown.sh

 

 

5. 방화벽 설정

마지막으로 방화벽에 포트를 추가시켜줍니다.

firewall-cmd --permanent --zone=public --add-port=8080/tcp
firewall-cmd --permanent --zone=public --add-port=8180/tcp
firewall-cmd --permanent --zone=public --add-port=8280/tcp

그리고나서 방화벽을 새로고침 합니다.

firewall-cmd --reload


각각 startup.sh 스크립트를 실행시켜 브라우저에서 테스트 해봅니다.
http://서버IP:8080
http://서버IP:8180
http://서버IP:8280

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90