본문 바로가기
WEB&WAS/Apache Tomcat

WAS) Tomcat Multi Instance (2) - 멀티 인스턴스 구성

by LILO 2022. 11. 13.
반응형

INTRO

Tomcat Multi Instance를 구성하는 과정에 대한 내용을 공유드립니다.

Apache Tomcat Multi Instance에 대한 자세한 내용은 아래의 글을 참고하기 바랍니다.

 

WAS) Tomcat Multi Instance (1) - 구조 및 장단점

Apache Tomcat(WAS) Multi Instance WAS를 설치하다 보면 "하나의 서버에 하나의 엔진만 설치할 수 있나?"라는 생각이 문득 들기도 합니다. 그 부분에 대해 알아보기 전에 Apache Tomcat의 구조부터 간단하게 알

lilo.tistory.com

 

이 글에서 소개드릴 설치 과정은 예시로 Instance1, Instance2, Instance3으로 구성하였지만 실제로는 사용할 JVM의 용도에 따라 네이밍을 하기도 합니다. (mail, edu, employ-test 등)

 

 

Apache Tomcat(WAS) Multi Instance 구성

 

Tomcat Multi Instance를 구성하는 과정에 대한 내용을 공유드립니다.

아래의 설치 과정은 예시로 Instance1, Instance2, Instance3으로 구성하였지만 실제로는 사용할 JVM의 용도에 따라 네이밍을 하기도 합니다. (mail, edu 등)

 

Tomcat을 실행하기 위해 필요한 OpenJDK(JAVA)를 다운로드합니다.

# dnf install -y java-1.8.0-openjdk.x86_64

 

Tomcat을 다운로드합니다.

# wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.68/bin/apache-tomcat-9.0.68.tar.gz --no-check-certificate -P /tmp

 

Tomcat 압축 파일을 해제하고 Tomcat 엔진(CATALINA_HOME)으로 사용할 디렉토리에 위치시킵니다.

<Tomcat 압축 파일 해제>
# tar xvzf /tmp/apache-tomcat-9.0.68.tar.gz

<Tomcat Engine 디렉토리 생성>
# mkdir -pv /app/tomcat9/engine

<Tomcat Engine 위치 이동>
# mv /tmp/apache-tomcat-9.0.68/* /app/tomcat9/engine

 

Tomcat Instance에 사용할 디렉토리를 생성합니다.

(실제 사용하실 서버에서는 instance1와 같은 네이밍보다는 용도에 맞춰서 이름을 지정하는 것이 관리하기 편합니다.)

# mkdir -pv /app/tomcat9/instance1
# mkdir -pv /app/tomcat9/instance2
# mkdir -pv /app/tomcat9/instance3

 

Tomcat Instance에 필요한 디렉토리를 복사합니다.

# cp -rfp /app/tomcat9/engine/{conf,logs,temp,webapps,work}  /app/tomcat9/instance1/
# cp -rfp /app/tomcat9/engine/{conf,logs,temp,webapps,work}  /app/tomcat9/instance2/
# cp -rfp /app/tomcat9/engine/{conf,logs,temp,webapps,work}  /app/tomcat9/instance3/

 

Tomcat Instance를 시작 및 종료하는 스크립트가 위치할 디렉토리를 생성합니다.

# mkdir -pv /app/tomcat9/instance1/bin
# mkdir -pv /app/tomcat9/instance2/bin
# mkdir -pv /app/tomcat9/instance3/bin

 

Tomcat Instance 시작 스크립트를 작성합니다.

Instance1에서 수정한 것 처럼 instance2, instance3도 같이 수정하고 CATALINA_BASE는 Instance 경로로 지정하고 CATALINA_HOME는 Tomcat Engine 경로로 지정합니다.

<start 스크립트 생성>
# vi /app/tomcat9/instance1/bin/start.sh

#!/bin/sh

export CATALINA_HOME=/app/tomcat9/engine
export CATALINA_BASE=/app/tomcat9/instance1

$CATALINA_HOME/bin/startup.sh

 

Tomcat Instance 종료 스크립트를 작성합니다.

Instance1에서 수정한 것 처럼 instance2, instance3도 같이 수정하고 CATALINA_BASE는 Instance 경로로 지정하고 CATALINA_HOME는 Tomcat Engine 경로로 지정합니다.

<shutdown 스크립트 생성>
# vi /app/tomcat9/instance1/bin/shutdown.sh

#!/bin/sh

export CATALINA_HOME=/app/tomcat9/engine
export CATALINA_BASE=/app/tomcat9/instance1

$CATALINA_HOME/bin/shutdown.sh

 

Tomcat Instance가 사용할 Port를 변경하기 위해 server.xml를 수정합니다.

Instance1에서 수정한 것 처럼 instance2, instance3도 같이 수정하고 Port가 겹치지 않게 수정합니다.

(저는 보통 8N05, 8N43, 8N80, 8N09와 같이 100 단위로 규칙을 지정하여 겹치지 않게 설정합니다.)

# vim /app/tomcat9/instance1/conf/server.xml
<!-- Note:  A "Server" is not itself a "Container", so you may not
     define subcomponents such as "Valves" at this level.
     Documentation at /docs/config/server.html
 -->
<Server port="8105" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <!-- Security listener. Documentation at /docs/config/listeners.html
  <Listener className="org.apache.catalina.security.SecurityListener" />
....

    <!-- A "Connector" represents an endpoint by which requests are received
         and responses are returned. Documentation at :
         Java HTTP Connector: /docs/config/http.html
         Java AJP  Connector: /docs/config/ajp.html
         APR (HTTP/AJP) Connector: /docs/apr.html
         Define a non-SSL/TLS HTTP/1.1 Connector on port 8180
    -->
    <Connector port="8180" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8143" />
....

    <!-- Define an AJP 1.3 Connector on port 8109 -->
    <Connector protocol="AJP/1.3"
               address="::1"
               port="8109"
               redirectPort="8143" />
....
- Shutdown Port(8105): Tomcat 종료 Port 
- Connector Port(8180): Tomcat 접속 Port
- Redirect Port(8143): SSL을 사용하는 요청이 들어오면 해당 Port로 Redirect 함
- AJP Port(8109): AJP 관련 Port (Apache 연동 용도)

 

Tomcat Instance가 사용할 ENV 파일인 setenv.sh 파일을 작성합니다.

사용할 Instance 디렉토리는 CATALINA_BASE를 수정합니다.

Instance1에서 수정한 것 처럼 instance2, instance3도 같이 수정합니다.

(EX. /app/tomcat9/instance1, /app/tomcat9/instance2, /app/tomcat9/instance3)

# vi /app/tomcat9/instance1/bin/setenv.sh
#!/bin/sh

#===========================================================
#Tomcat  Setting
#===========================================================
CATALINA_HOME=/app/tomcat9/engine
CATALINA_BASE=/app/tomcat9/instance1
JAVA_HOME=$(echo $(readlink -f /etc/alternatives/java) |  sed -e 's/\/bin\/java//g')
PATH=$PATH:$JAVA_HOME/bin:/bin:/sbin
LOG_DIR=$CATALINA_BASE/logs
export JAVA_HOME PATH CATALINA_HOME CATALINA_BASE LOG_DIR


#===========================================================
#JVM Memory Setting
#===========================================================
CATALINA_OPTS="-server"
CATALINA_OPTS="${CATALINA_OPTS} -Xms256m"
CATALINA_OPTS="${CATALINA_OPTS} -Xmx256m"
CATALINA_OPTS="${CATALINA_OPTS} -XX:MetaspaceSize=128m"
CATALINA_OPTS="${CATALINA_OPTS} -XX:MaxMetaspaceSize=128m"


#===========================================================
#GC, Heapdump Setting
#===========================================================
CATALINA_OPTS="${CATALINA_OPTS} -XX:+UseG1GC"
CATALINA_OPTS="${CATALINA_OPTS} -verbose:gc"
CATALINA_OPTS="${CATALINA_OPTS} -Xloggc:${LOG_DIR}/gc.log_$(date +%Y%m%d%H%M%S)"
CATALINA_OPTS="${CATALINA_OPTS} -XX:+PrintGCDetails"
CATALINA_OPTS="${CATALINA_OPTS} -XX:+PrintGCTimeStamps"
CATALINA_OPTS="${CATALINA_OPTS} -XX:+PrintGCDateStamps"
CATALINA_OPTS="${CATALINA_OPTS} -XX:+HeapDumpOnOutOfMemoryError"
CATALINA_OPTS="${CATALINA_OPTS} -XX:HeapDumpPath=${LOG_DIR}/java_pid.hprof"
CATALINA_OPTS="${CATALINA_OPTS} -XX:+PrintAdaptiveSizePolicy"

 

Tomcat Instance 기동을 시작합니다.

# /app/tomcat9/instance1/bin/start.sh
# /app/tomcat9/instance2/bin/start.sh
# /app/tomcat9/instance3/bin/start.sh

 

Tomcat Instance별 포트가 LISTEN 상태인지 확인합니다.

# ss -atnlp |grep java
LISTEN 0      100                     *:8380            *:*    users:(("java",pid=21162,fd=59))
LISTEN 0      1      [::ffff:127.0.0.1]:8105            *:*    users:(("java",pid=21022,fd=69))
LISTEN 0      1      [::ffff:127.0.0.1]:8205            *:*    users:(("java",pid=21114,fd=69))
LISTEN 0      100                 [::1]:8109         [::]:*    users:(("java",pid=21022,fd=62))
LISTEN 0      1      [::ffff:127.0.0.1]:8305            *:*    users:(("java",pid=21162,fd=69))
LISTEN 0      100                 [::1]:8209         [::]:*    users:(("java",pid=21114,fd=62))
LISTEN 0      100                     *:8180            *:*    users:(("java",pid=21022,fd=59))
LISTEN 0      100                 [::1]:8309         [::]:*    users:(("java",pid=21162,fd=62))
LISTEN 0      100                     *:8280            *:*    users:(("java",pid=21114,fd=59))

 

Tomcat Instance 정상 기동을 확인하기 위해 curl 명령어로 확인합니다.

[root@localhost ~]# curl --HEAD localhost:8180
HTTP/1.1 200
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Date: Sat, 29 Oct 2022 23:55:37 GMT

[root@localhost ~]# curl --HEAD localhost:8280
HTTP/1.1 200
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Date: Sat, 29 Oct 2022 23:55:39 GMT

[root@localhost ~]# curl --HEAD localhost:8380
HTTP/1.1 200
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Date: Sat, 29 Oct 2022 23:55:43 GMT

 

Windows 환경에서 접속할 수 있다면 브라우저로 접속하여 확인해봅니다.

 

반응형