본문 바로가기

리눅스

[draft] Redis를 통한 세션 클러스터링을 구현하는 방법

728x90

Redis를 통한 세션 클러스터링을 구현하는 방법

Redis 설치 및 구성

sudo apt-get update
sudo apt-get install -y redis-server
sudo systemctl --now enable redis-server
redis-cli ping
$ redis-cli ping
PONG

JDK, NGINX, Tomcat 설치 및 구성

curl -fsSL https://raw.githubusercontent.com/anti1346/zz/main/ubuntu/install_jdk_nginx_tomcat.sh | bash

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;
    }
}

Tomcat 설정

server.xml 파일 설정

vim /app/tomcat/tomcat1/conf/server.xml
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
vim /app/tomcat/tomcat2/conf/server.xml
...
    <!-- An Engine represents the entry point (within Catalina) that processes
         every request.  The Engine implementation for Tomcat stand alone
         analyzes the HTTP headers included with the request, and passes them
         on to the appropriate Host (virtual host).
         Documentation at /docs/config/engine.html -->

    <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

      <!-- Use the LockOutRealm to prevent attempts to guess user passwords
           via a brute-force attack -->
...

Redisson 라이브러리를 Tomcat에 추가

Tomcat의 lib 디렉토리에 Redisson 라이브러리를 추가합니다. Redisson은 Redis와 통신하기 위한 Java 라이브러리입니다.

redisson_lib

Redisson 라이브러리 다운로드

wget -q https://repo1.maven.org/maven2/org/redisson/redisson-all/3.30.0/redisson-all-3.30.0.jar
wget -q https://repo1.maven.org/maven2/org/redisson/redisson-tomcat-9/3.30.0/redisson-tomcat-9-3.30.0.jar

Tomcat의 lib 디렉토리에 추가

cp -r redisson-*.jar /app/tomcat/tomcat1/lib/
cp -r redisson-*.jar /app/tomcat/tomcat2/lib/
chown tomcat.tomcat /app/tomcat/tomcat{1,2}/lib/redisson-*.jar

redisson 라이브러리 확인

ls -l /app/tomcat/tomcat1/lib/ | grep redisson
$ ls -l /app/tomcat/tomcat1/lib/ | grep redisson
-rw-r--r-- 1 tomcat tomcat 20816288 May 19 08:02 redisson-all-3.30.0.jar
-rw-r--r-- 1 tomcat tomcat    29912 May 19 08:02 redisson-tomcat-9-3.30.0.jar
728x90

Tomcat 세션 관리 설정

각 Tomcat 인스턴스의 server.xml 파일에서 세션 클러스터링을 설정합니다.

vim /app/tomcat/tomcat1/conf/context.xml
<Context>
    <!-- Default set of monitored resources. If one of these changes, the    -->
    <!-- web application will be reloaded.                                   -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->

    <!-- RedissonSessionManager 추가 -->
    <Manager className="org.redisson.tomcat.RedissonSessionManager"
            configPath="${catalina.base}/conf/redisson.yaml"
            readMode="REDIS"
            updateMode="DEFAULT"/>
</Context>
vim /app/tomcat/tomcat2/conf/context.xml
...
    <!-- RedissonSessionManager 추가 -->
    <Manager className="org.redisson.tomcat.RedissonSessionManager"
            configPath="${catalina.base}/conf/redisson.yaml"
            readMode="REDIS"
            updateMode="DEFAULT"/>
...

redisson.conf 파일 편집

  • Redisson 구성 파일을 작성합니다. 이 파일은 Redis 클러스터에 연결하는 방법을 정의합니다. YAML 또는 JSON 형식으로 작성할 수 있습니다.
vim /app/tomcat/tomcat1/conf/redisson.yaml
singleServerConfig:
  address: "redis://localhost:6379"
  database: 0
cp /app/tomcat/tomcat1/conf/redisson.yaml /app/tomcat/tomcat2/conf/redisson.yaml

테스트

세션 정보를 확인할 수 있는 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>Server, Instance, Session, and Cookie Info</title>
</head>
<body>
    <h1>Server Info:</h1>
    <p>Server Name: <%= request.getServerName() %></p>
    <p>Server Port: <%= request.getServerPort() %></p>
    <p>Server Protocol: <%= request.getProtocol() %></p>
    <p>Server Info: <%= application.getServerInfo() %></p>
    <hr>
    <h1>Instance Info:</h1>
    <p>Classpath: <%= System.getProperty("java.class.path", ".") %></p>
    <hr>
    <h1>Session Info:</h1>
    <p>Session ID: <%= session.getId() %></p>
    <p>Creation Time: <%= new java.util.Date(session.getCreationTime()) %></p>
    <p>Last Accessed Time: <%= new java.util.Date(session.getLastAccessedTime()) %></p>
    <p>Max Inactive Interval (seconds): <%= session.getMaxInactiveInterval() %></p>
    <hr>
    <h1>Cookie Info:</h1>
    <%
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
    %>
    <p><b>Name:</b> <%= cookie.getName() %></p>
    <p><b>Value:</b> <%= cookie.getValue() %></p>
    <p><b>Max Age (seconds):</b> <%= cookie.getMaxAge() %></p>
    <hr>
    <%
            }
        } else {
    %>
    <p>No cookies found.</p>
    <% } %>
</body>
</html>
cp /app/tomcat/tomcat1/webapps/ROOT/session_test.jsp /app/tomcat/tomcat2/webapps/ROOT/session_test.jsp

Redis에서 세션 키 조회

redis-cli -h 127.0.0.1 -p 6379 KEYS "*"
$ redis-cli -h 127.0.0.1 -p 6379 KEYS "*"
1) "redisson:tomcat_session:6A00DFCE67BDA321E5AE0D29F1216473"

브라우저를 통해 세션 및 쿠키 정보 확인

http://localhost/session_test.jsp

session_info

 

728x90