INTRO
Tomcat Multi Instance를 구성하는 과정에 대한 내용을 공유드립니다.
Apache Tomcat Multi Instance에 대한 자세한 내용은 아래의 글을 참고하기 바랍니다.
이 글에서 소개드릴 설치 과정은 예시로 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 환경에서 접속할 수 있다면 브라우저로 접속하여 확인해봅니다.
'WEB&WAS > Apache Tomcat' 카테고리의 다른 글
WAS) Tomcat에서 JNDI 사용하여 DBCP 설정하기 (0) | 2023.07.14 |
---|---|
WAS) Tomcat과 Scouter APM 연동하기 (0) | 2022.11.06 |
WAS) Tomcat Session clustering (2) - 구성 (0) | 2022.11.05 |
WAS) Tomcat Session clustering (1) - 개념 및 필요 사항 (0) | 2022.11.05 |
WAS) Tomcat Multi Instance 설치 스크립트 (0) | 2022.10.30 |