우분투에서 다중 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 다운로드 및 설치
- 다운로드 URL : https://www.azul.com/downloads/?version=java-17-lts&os=ubuntu&architecture=x86-64-bit&package=jdk
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-->
...
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
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>
이제 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)
'리눅스' 카테고리의 다른 글
[draft] 도메인 위임 설정 (0) | 2022.12.06 |
---|---|
useradd 명령어 (0) | 2022.12.04 |
Nginx와 Tomcat 클러스터를 구성하는 방법 (0) | 2022.12.04 |
Ubuntu에서 Nginx, Zulu OpenJDK, Tomcat을 설치하고 연동하는 방법 (0) | 2022.12.03 |
간단한 파일 전송(rz 명령어, sz 명령어) (0) | 2022.12.03 |