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
'리눅스' 카테고리의 다른 글
[draft] Laravel 애플리케이션의 요청에 대한 로그를 파일에 기록하는 방법 (0) | 2024.05.20 |
---|---|
[draft] Redis를 통한 세션 클러스터링을 구현하는 방법 (0) | 2024.05.19 |
[draft] 우분투에 NGINX와 Tomcat 멀티 인스턴스를 설치하고 설정하는 방법 (0) | 2024.05.18 |
[draft] Vim에서 한글 깨짐 문제를 해결하는 방법 (0) | 2024.05.17 |
[draft] 우분투에 최신 버전의 파이썬를 설치하는 방법 (0) | 2024.05.14 |