본문 바로가기

리눅스

[draft] NGINX와 Tomcat 두 개의 인스턴스를 사용하여 세션 클러스터링을 구성하는 방법

728x90

NGINX와 Tomcat 두 개의 인스턴스를 사용하여 세션 클러스터링을 구성하는 방법

JDK, NGINX, Tomcat 설치

더보기

---

JDK, NGINX, Tomcat 설치 스크립트 작성

vim setup.sh
#!/bin/bash

# JDK 설치
sudo mkdir -p /app/java
sudo wget -q https://download.oracle.com/java/17/archive/jdk-17.0.10_linux-aarch64_bin.tar.gz -O /app/jdk-17.0.10_linux-aarch64_bin.tar.gz
sudo tar -xzf /app/jdk-17.0.10_linux-aarch64_bin.tar.gz -C /app/java --strip-components=1

# JDK 환경 변수 설정
# JDK 환경 변수 설정
if [ ! -f /etc/profile.d/jdk.sh ] || ! grep -q 'export JAVA_HOME=/app/java' /etc/profile.d/jdk.sh; then
    echo 'export JAVA_HOME=/app/java' | sudo tee /etc/profile.d/jdk.sh
    echo 'export PATH=$PATH:$JAVA_HOME/bin' | sudo tee -a /etc/profile.d/jdk.sh
    source /etc/profile.d/jdk.sh
fi

# NGINX 설치
sudo apt-get update
sudo apt-get install -y curl gnupg2 ca-certificates lsb-release ubuntu-keyring apt-transport-https
curl -s https://nginx.org/keys/nginx_signing.key | gpg --dearmor --yes -o /usr/share/keyrings/nginx-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu $(lsb_release -cs) nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
sudo apt-get update
sudo apt-get install -y nginx
sudo systemctl --now enable nginx

# Tomcat 설치 및 설정
sudo groupadd tomcat
sudo useradd -s /bin/false -g tomcat -d /app/tomcat tomcat
sudo mkdir -p /app/tomcat/{tomcat1,tomcat2}
sudo wget -q https://downloads.apache.org/tomcat/tomcat-9/v9.0.89/bin/apache-tomcat-9.0.89.tar.gz -O /app/apache-tomcat-9.0.89.tar.gz
sudo tar -xzf /app/apache-tomcat-9.0.89.tar.gz -C /app/tomcat/tomcat1 --strip-components=1
sudo tar -xzf /app/apache-tomcat-9.0.89.tar.gz -C /app/tomcat/tomcat2 --strip-components=1

# 인스턴스의 server.xml 파일 수정
TOMCAT_HOME="/app/tomcat"
INSTANCE1_NAME="tomcat1"
INSTANCE2_NAME="tomcat2"

INSTANCE1_SHUTDOWN_PORT="8001"
INSTANCE1_CONNECTOR_PORT="8081"
INSTANCE1_REDIRECT_PORT="8541"
INSTANCE2_SHUTDOWN_PORT="8002"
INSTANCE2_CONNECTOR_PORT="8082"
INSTANCE2_REDIRECT_PORT="8542"
# 인스턴스 1의 server.xml 파일 수정
sed -i "s/port=\"8005\"/port=\"$INSTANCE1_SHUTDOWN_PORT\"/g; \
        s/port=\"8080\"/port=\"$INSTANCE1_CONNECTOR_PORT\"/g; \
        s/redirectPort=\"8443\"/redirectPort=\"$INSTANCE1_REDIRECT_PORT\"/g" "$TOMCAT_HOME/$INSTANCE1_NAME/conf/server.xml"
# 인스턴스 2의 server.xml 파일 수정
sed -i "s/port=\"8005\"/port=\"$INSTANCE2_SHUTDOWN_PORT\"/g; \
        s/port=\"8080\"/port=\"$INSTANCE2_CONNECTOR_PORT\"/g; \
        s/redirectPort=\"8443\"/redirectPort=\"$INSTANCE2_REDIRECT_PORT\"/g" "$TOMCAT_HOME/$INSTANCE2_NAME/conf/server.xml"

sudo chown -R tomcat:tomcat /app/tomcat

# Tomcat 서비스 파일 작성
for instance in tomcat1 tomcat2; do
    cat <<EOF | sudo tee "/etc/systemd/system/$instance.service" >/dev/null
[Unit]
Description=Tomcat Instance $instance
After=network.target

[Service]
Type=forking
User=tomcat
Group=tomcat
Environment=CATALINA_PID=/app/tomcat/$instance/temp/tomcat.pid
Environment=CATALINA_HOME=/app/tomcat/$instance
Environment=CATALINA_BASE=/app/tomcat/$instance
Environment=JAVA_HOME=/app/java
ExecStart=/app/tomcat/$instance/bin/startup.sh
ExecStop=/app/tomcat/$instance/bin/shutdown.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF
done

# Tomcat 서비스 시작 및 자동 시작 설정
sudo systemctl daemon-reload
for instance in tomcat1 tomcat2; do
    sudo systemctl --now enable $instance
done
chmod +x setup.sh
./setup.sh

---

nginx 구성 파일

vim /etc/nginx/conf.d/default.conf
upstream tomcat_servers {
    server localhost:8081;  # 첫 번째 Tomcat 인스턴스
    server localhost:8082;  # 두 번째 Tomcat 인스턴스
}

server {
    listen 80;
    
    server_name localhost;

    access_log /var/log/nginx/host.access.log main;

    location / {
        proxy_pass http://tomcat_servers;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
sudo systemctl restart nginx

Tomcat 두 개의 인스턴스 구성

  • 각 Tomcat 인스턴스의 server.xml 파일을 편집합니다.
  • 각 인스턴스에 대해 고유한 jvmRoute 값을 설정해야 합니다.
vim /app/tomcat/tomcat1/conf/server.xml
<!-- 첫 번째 Tomcat 인스턴스의 server.xml -->
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
    ...
</Engine>
vim /app/tomcat/tomcat2/conf/server.xml
<!-- 두 번째 Tomcat 인스턴스의 server.xml -->
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
    ...
</Engine>

Tomcat 재시작

sudo systemctl restart tomcat1
sudo systemctl restart tomcat2

Tomcat의 세션 클러스터링이 동작하는지 확인할 수 있는 간단한 JSP 페이지

vim /app/tomcat/tomcat1/webapps/ROOT/session_test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Session Test</title>
</head>
<body>
<%
    // 세션에서 값을 읽어옴
    String sessionValue = (String) session.getAttribute("sessionValue");
    if (sessionValue == null) {
        // 세션에 값이 없으면 생성하여 저장
        sessionValue = "Hello, World!";
        session.setAttribute("sessionValue", sessionValue);
    }
%>
<h1>Session Test</h1>
<p>Instance Name: <%= java.net.InetAddress.getLocalHost().getHostName() %></p>
<p>Instance IP Address: <%= request.getLocalAddr() %></p>
<p>Instance Webapps Path: <%= application.getRealPath("/") %></p>
<p>Session ID: <%= session.getId() %></p>
<p>Session Value: <%= sessionValue %></p>
<p><a href="update_session.jsp">Update Session</a></p>
</body>
</html>
vim /app/tomcat/tomcat1/webapps/ROOT/update_session.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    // 새로운 세션 값을 설정하고 저장
    String newSessionValue = "Updated Session Value";
    session.setAttribute("sessionValue", newSessionValue);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Update Session</title>
</head>
<body>
<h1>Session Updated</h1>
<p>New Session Value: <%= newSessionValue %></p>
<p><a href="session_test.jsp">Go Back</a></p>
</body>
</html>
cp /app/tomcat/tomcat1/webapps/ROOT/session_test.jsp /app/tomcat/tomcat2/webapps/ROOT/session_test.jsp
cp /app/tomcat/tomcat1/webapps/ROOT/update_session.jsp /app/tomcat/tomcat2/webapps/ROOT/update_session.jsp

 

이제 이 두 개의 JSP 파일을 Tomcat의 웹 애플리케이션 디렉토리에 배치하고 브라우저에서 session_test.jsp에 접속하면 세션 클러스터링이 동작하는지 확인할 수 있습니다. 페이지를 새로 고침하거나 다시 접속하여 세션 값이 유지되는지 확인하세요. 만약 NGINX를 사용하여 Tomcat에 접근하는 경우 NGINX 구성이 정확한지 확인하고 NGINX를 통해 두 개의 Tomcat 인스턴스에 요청이 분산되는지 확인해야 합니다.

 

정력 /app/tomcat/tomcat2/conf/server.xml
 
728x90