Tomcat 멀티 인스턴스 환경에서 Java 스프링 환경변수 설정하기

개요

고객사의 Tomcat/Spring 환경의 서버 3대를 1대로 통합하는 과정에서 Tomcat 멀티 인스턴스의 전환과 Spring 환경변수 전달을 위한 설정방법을 기록하고자 한다.

멀티 인스턴스

Tomcat 멀티 인스턴스는 핵심 라이브러리는 하나이지만, 다수의 인스턴스를 독립적으로 구동하는 것을 의미한다.

여기에는 2 부분으로 나누어지게 된다.

  • Tomcat 핵심: bin, lib
  • Tomcat 인스턴스: conf, logs, temp, work, webapps

멀티 인스턴스를 위한 기초공사

기초 공사는 Tomcat 핵심을 설치하는 것이다. jdk의 경우 편의에 따라 openjdk 또는 oraclejdk를 설치하면 된다. 이 포스트에서는 oraclejdk 바이너리 및 tomcat 바이너리를 다운받아 설치한 것으로 가정한다.

cd /usr/local/src
tar zxf jdk-8u251-linux-x64.tar.gz
tar zxf apache-tomcat-9.0.34.tar.gz

mv jdk1.8.0_251 ../
mv apache-tomcat-9.0.34 ../

cd ..
ln -s jdk1.8.0_251 jdk
ln -s apache-tomcat-9.0.34 tomcat

vi /root/.bash_profile
JAVA_HOME=/usr/local/jdk
export JAVA_HOME

source /root/.bash_profile
echo $JAVA_HOME

cd /home
mkdir instance01
mkdir instance02
chmod 755 ./instance*

cd /usr/local/tomcat
cp -arp conf /home/insrance01
cp -arp conf /home/insrance02
mkdir /home/insrance01/logs
mkdir /home/insrance01/temp
mkdir /home/insrance01/work
mkdir /home/insrance01/webapps
mkdir /home/insrance02/logs
mkdir /home/insrance02/temp
mkdir /home/insrance02/work
mkdir /home/insrance02/webapps

여기까지는 멀티 인스턴스를 위한 최소한의 멀티 인스턴스르 위한 파일 구성을 완료한 것이다.

server.xml 설정

멀티 인스턴스는 동일한 포트로 띄우는 것이 아닌, 다른 포트로 각각 띄우는 것이기 때문에, server.xml을 오픈해서 몇가지 포트 정보를 변경해야 한다.

<!-- instance01 server.xml -->
<Server port="8015" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
....
<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8143" />
....
<Connector port="8109" protocol="AJP/1.3" redirectPort="8143" />

<!-- instance02 server.xml -->
<Server port="8025" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
....
<Connector port="8090" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8243" />
....
<Connector port="8209" protocol="AJP/1.3" redirectPort="8243" />

실행과 중지 스크립트의 작성

실행과 중지 스크립트를 작성해야한다. 이를 통해 각각의 인스턴스를 띄우고, 중지할 수 있다.

#!/usr/bin/env bash
export INSTANCE_OWNER=instance01
export CATALINA_HOME=/usr/local/tomcat
export CATALINA_BASE=/home/$INSTANCE_OWNER
export CATALINA_PID=/home/$INSTANCE_OWNER/conf/$INSTANCE_OWNER.pid

export CATALINA_OPTS="-Denv=prod -Denv.servername=instance01"

cd $CATALINA_HOME/bin
./startup.sh
#!/usr/bin/env bash
export INSTANCE_OWNER=instance01
export CATALINA_HOME=/usr/local/tomcat
export CATALINA_BASE=/home/$INSTANCE_OWNER
export CATALINA_PID=/home/$INSTANCE_OWNER/conf/$INSTANCE_OWNER.pid

export CATALINA_OPTS="-Denv=prod -Denv.servername=instance01"

cd $CATALINA_HOME/bin
./shutdown.sh

spring 환경에서의 환경 옵션 추가

spring의 경우 dev, home, prod 로 환경을 구분할 수 있다. 이에 실제 환경 배포시에는 실행시 환경 정보를 전달해서 적절한 환경으로 실행되도록 하는 것이 맞다.

실행과 중지 스크립트에서 다음을 추가한다.

...
export CATALINA_OPTS="-Denv=prod -Dspring.profiles.active=prod -Denv.servername=instance01"
...

이후 스크립트로 인스턴스를 중지 및 시작하면 인스턴스가 정상적으로 실행이 되는 것을 확인할 수 있다.