본문 바로가기

리눅스

우분투에서 다중 Tomcat 인스턴스를 설정하는 방법(Multiple Tomcat Instances)

728x90

우분투에서 다중 Tomcat 인스턴스를 설정하는 방법(Multiple Tomcat Instances)

Ubuntu에서 Multiple Tomcat Instances를 설정하려면 아래와 같은 단계를 따를 수 있습니다. 각 Tomcat 인스턴스는 서로 다른 포트를 사용하여 실행됩니다.

테스트 환경

$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 22.04.1 LTS
Release:	22.04
Codename:	jammy
  • 시스템 구성
호스트명 아이피 엔진(인스턴스명) 포트 비고
kube-node1 192.168.0.61 nginx 80  
kube-node2 192.168.0.62 tomcat(instance1) 8082, 8005  
kube-node2 192.168.0.62 tomcat(instance2) 8083, 8006  
kube-node3 192.168.0.63 tomcat(instance1) 8082, 8005  
kube-node3 192.168.0.63 tomcat(instance2) 8083, 8006  

JDK(java) 설치

작업 디렉토리 생성

mkdir -pv /apps
$ mkdir -pv /apps
mkdir: created directory '/apps'

jdk(java) 17 다운로드 및 설치

j1

cd /apps
wget -q https://cdn.azul.com/zulu/bin/zulu17.38.21-ca-jdk17.0.5-linux_x64.tar.gz
tar xfz zulu17.38.21-ca-jdk17.0.5-linux_x64.tar.gz
ln -s zulu17.38.21-ca-jdk17.0.5-linux_x64 java

환경 변수 설정

vim /etc/profile
export JAVA_HOME=/apps/java
export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile

java 버전 확인

java -version
$ java -version
openjdk version "17.0.5" 2022-10-18 LTS
OpenJDK Runtime Environment Zulu17.38+21-CA (build 17.0.5+8-LTS)
OpenJDK 64-Bit Server VM Zulu17.38+21-CA (build 17.0.5+8-LTS, mixed mode, sharing)

Tomcat 10 다운로드 및 설치

tomcat 그룹 및 계정 생성

groupadd tomcat
useradd -c "Tomcat Service" -m -d /apps/tomcat -s /usr/sbin/nologin -g tomcat tomcat

작업 디렉토리로 이동

cd /apps/tomcat

apache-tomcat 파일 다운로드

wget -q https://downloads.apache.org/tomcat/tomcat-10/v10.1.2/bin/apache-tomcat-10.1.2.tar.gz

Tomcat 인스턴스 디렉토리 생성

mkdir instance{1,2}

Tomcat 인스턴스 디렉토리 복사

tar xfz apache-tomcat-10.1.2.tar.gz -C /apps/tomcat/instance1 --strip-components=1
tar xfz apache-tomcat-10.1.2.tar.gz -C /apps/tomcat/instance2 --strip-components=1

Tomcat 인스턴스 소유권 설정

chown -R tomcat: /apps/tomcat/instance{1,2}
chmod +x /apps/tomcat/instance{1,2}/bin/*.sh

Tomcat 버전 정보 확인

  • Tomcat 인스턴스1
/apps/tomcat/instance1/bin/version.sh
$ /apps/tomcat/instance1/bin/version.sh
Using CATALINA_BASE:   /apps/tomcat/instance1
Using CATALINA_HOME:   /apps/tomcat/instance1
Using CATALINA_TMPDIR: /apps/tomcat/instance1/temp
Using JRE_HOME:        /apps/java
Using CLASSPATH:       /apps/tomcat/instance1/bin/bootstrap.jar:/apps/tomcat/instance1/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Server version: Apache Tomcat/10.1.2
Server built:   Nov 9 2022 15:47:04 UTC
Server number:  10.1.2.0
OS Name:        Linux
OS Version:     5.15.0-56-generic
Architecture:   amd64
JVM Version:    17.0.5+8-LTS
JVM Vendor:     Azul Systems, Inc.
  • Tomcat 인스턴스2
/apps/tomcat/instance2/bin/version.sh
$ /apps/tomcat/instance2/bin/version.sh
Using CATALINA_BASE:   /apps/tomcat/instance2
Using CATALINA_HOME:   /apps/tomcat/instance2
Using CATALINA_TMPDIR: /apps/tomcat/instance2/temp
Using JRE_HOME:        /apps/java
Using CLASSPATH:       /apps/tomcat/instance2/bin/bootstrap.jar:/apps/tomcat/instance2/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Server version: Apache Tomcat/10.1.2
Server built:   Nov 9 2022 15:47:04 UTC
Server number:  10.1.2.0
OS Name:        Linux
OS Version:     5.15.0-56-generic
Architecture:   amd64
JVM Version:    17.0.5+8-LTS
JVM Vendor:     Azul Systems, Inc.

Tomcat 인스턴스의 서버 포트와 관리 포트를 설정합니다.

포트 및 AJP 연결 설정을 변경합니다.

  • server.xml 편집
    • Server port="8005"
    • Connector port="8080"
    • Connector port="8009"
vim /apps/tomcat/instance1/conf/server.xml
vim /apps/tomcat/instance2/conf/server.xml
...
 -->
<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <!-- Security listener. Documentation at /docs/config/listeners.html
  <Listener className="org.apache.catalina.security.SecurityListener" />
  -->
...
    -->
    <Connector port="8082" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <!-- A "Connector" using the shared thread pool-->
...
728x90

Tomcat 인스턴스 시작

Tomcat 인스턴스1

su - tomcat -s /bin/bash /apps/tomcat/instance1/bin/startup.sh
$ su - tomcat -s /bin/bash /apps/tomcat/instance1/bin/startup.sh
Using CATALINA_BASE:   /apps/tomcat/instance1
Using CATALINA_HOME:   /apps/tomcat/instance1
Using CATALINA_TMPDIR: /apps/tomcat/instance1/temp
Using JRE_HOME:        /apps/java
Using CLASSPATH:       /apps/tomcat/instance1/bin/bootstrap.jar:/apps/tomcat/instance1/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.

Tomcat 인스턴스2

su - tomcat -s /bin/bash /apps/tomcat/instance2/bin/startup.sh
$ su - tomcat -s /bin/bash /apps/tomcat/instance2/bin/startup.sh
Using CATALINA_BASE:   /apps/tomcat/instance2
Using CATALINA_HOME:   /apps/tomcat/instance2
Using CATALINA_TMPDIR: /apps/tomcat/instance2/temp
Using JRE_HOME:        /apps/java
Using CLASSPATH:       /apps/tomcat/instance2/bin/bootstrap.jar:/apps/tomcat/instance2/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.

Tomcat 인스턴스 프로세스 확인

$ ps -ef | grep -v grep | grep "tomcat/instance"
tomcat     31429       1  1 22:29 pts/1    00:00:03 /apps/java/bin/java -Djava.util.logging.config.file=/apps/tomcat/instance1/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED -classpath /apps/tomcat/instance1/bin/bootstrap.jar:/apps/tomcat/instance1/bin/tomcat-juli.jar -Dcatalina.base=/apps/tomcat/instance1 -Dcatalina.home=/apps/tomcat/instance1 -Djava.io.tmpdir=/apps/tomcat/instance1/temp org.apache.catalina.startup.Bootstrap start
tomcat     32492       1 13 22:33 pts/1    00:00:03 /apps/java/bin/java -Djava.util.logging.config.file=/apps/tomcat/instance2/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED -classpath /apps/tomcat/instance2/bin/bootstrap.jar:/apps/tomcat/instance2/bin/tomcat-juli.jar -Dcatalina.base=/apps/tomcat/instance2 -Dcatalina.home=/apps/tomcat/instance2 -Djava.io.tmpdir=/apps/tomcat/instance2/temp org.apache.catalina.startup.Bootstrap start

Tomcat 인스턴스 LISTEN 포트 확인

$ netstat -nlpt | grep java
tcp6       0      0 :::8082                 :::*                    LISTEN      16102/java
tcp6       0      0 :::8083                 :::*                    LISTEN      16283/java
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      16102/java
tcp6       0      0 127.0.0.1:8006          :::*                    LISTEN      16283/java

브라우저 Apache Tomcat 페이지 확인

  • http://192.168.0.62:8082
  • http://192.168.0.62:8083
  • http://192.168.0.63:8082
  • http://192.168.0.63:8083

t1

Tomcat 인스턴스 start/stop alias 등록(.bashrc 또는 /etc/profile)

vim ~/.bashrc
### tomcat start/stop alias
alias tomcat1_start="su - tomcat -s /bin/bash /apps/tomcat/instance1/bin/startup.sh"
alias tomcat1_stop="su - tomcat -s /bin/bash /apps/tomcat/instance1/bin/shutdown.sh -force"
alias tomcat1_log="su - tomcat -s /usr/bin/tail -f /apps/tomcat/instance1/logs/catalina.out"

alias tomcat2_start="su - tomcat -s /bin/bash /apps/tomcat/instance2/bin/startup.sh"
alias tomcat2_stop="su - tomcat -s /bin/bash /apps/tomcat/instance2/bin/shutdown.sh -force"
alias tomcat2_log="su - tomcat -s /usr/bin/tail -f /apps/tomcat/instance2/logs/catalina.out"

alias all_start="tomcat1_start && tomcat2_start"
alias all_stop="tomcat1_stop && tomcat2_stop"
alias all_log="tomcat1_log && tomcat2_log"
source ~/.bashrc
$ tomcat2_log
04-Dec-2022 22:33:14.757 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/apps/tomcat/instance2/webapps/ROOT]

Nginx 서버 설정

default.conf 설정

vim /etc/nginx/conf.d/default.conf
upstream backend_tomcat {
        ip_hash;
        server 192.168.0.62:8082;
        server 192.168.0.62:8083;
        server 192.168.0.63:8082;
        server 192.168.0.63:8083;
        #keepalive 100;
    }
 
 server {
    listen 80;
    server_name localhost;
    index index.jsp;
...
   charset utf-8;

    location / {
        proxy_pass http://backend_tomcat;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
    }
...
}

Tomcat 인스턴스 index.jsp 생성

vim /apps/tomcat/instance1/webapps/ROOT/index.jsp
<%@ page
    language="java"
    contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"
%><?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head><title>TOMCAT devsp3(Instance1) - TOMCAT TEST</title></head>
<body><pre>
서버아이피: <%=request.getLocalAddr()%>
서버포트: <%=request.getLocalPort()%>

운영체제: <%=System.getProperty("os.arch")%>
데이터모델: <%=System.getProperty("sun.arch.data.model")%>
클래스경로: <%=System.getProperty("java.class.path",".")%>
라이브러리경로: <%=System.getProperty("java.library.path", ".")%>
파라메터: <%=request.getParameter("param")%> ('한글'이라고 표기되어야 함)

파일인코딩: <%=System.getProperty("file.encoding")%>
시스템캐릭터셋: <%=java.nio.charset.Charset.defaultCharset().name()%>
페이지캐릭터셋: <%=response.getCharacterEncoding()%>

서블릿 경로: <%=application.getRealPath("")%>
</pre></body>
</html>

t2

이제 Ubuntu에서 Multiple Tomcat Instances를 설정하고 Nginx를 사용하여 트래픽을 분산시킬 수 있어야 합니다. 클러스터 구성 및 설정에 따라 세부 구성이 달라질 수 있으므로 필요에 따라 Tomcat의 클러스터링 기능을 사용할 수도 있습니다.

 

참고URL

- nginx + tomcat(멀티 인스턴스) 설치 : https://scbyun.com/617

- 우분투에서 다중 Tomcat 인스턴스를 설정하는 방법(Multiple Tomcat Instances) : https://scbyun.com/363

- HTTP requst 정보 (클라이언트 IP, 헤더, URL 등) 총 정리 : https://junspapa-itdev.tistory.com/34

- Beyondj2ee's Blog : 멀티 톰캣 인스턴스로 실행하기 (Multiple Tomcat Instances)

 

728x90