1. 사전 준비 사항
- 모든 서버의 시간 동기화 (ntpdate 등 활용, 타임존 확인 필수)
- 방화벽 비활성화 또는 필요한 포트(nginx 80, memcached 11211, tomcat 8080 등) 오픈
- 필요 소프트웨어: nginx, memcached, tomcat 8, Java 8 이상
2. Nginx 및 Memcached 설치 및 구성
Nginx와 Memcached는 패키지 매니저(yum/apt)로 간단히 설치할 수 있습니다.
yum install nginx memcached -y
systemctl start nginx memcached
systemctl enable nginx memcached
Nginx 설정 파일 예시:
user nginx;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
gzip on;
upstream tomcat-web {
server 192.168.0.14:8080;
server 192.168.0.15:8080;
}
server {
listen 80;
server_name www.tomcat.com;
location / {
root html;
index index.html index.htm index.jsp;
}
location ~* \.(jsp|do)$ {
proxy_pass http://tomcat-web;
proxy_redirect off;
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_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
}
location /nginx_status {
stub_status on;
access_log off;
allow 192.168.0.0/24;
deny all;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
3. Tomcat 8 구성 및 Memcached 연동
3.1 필수 JAR 파일 다운로드
다음 JAR 파일들을 각 Tomcat 서버의 TOMCAT_HOME/lib 디렉토리에 복사합니다:
memcached-session-manager-*.jarmemcached-session-manager-tc8-*.jarjavolution-*.jarkryo-*.jar(선택, 성능 향상에 도움)reflectasm-*.jar(kryo 사용 시 필요)asm-*.jar(kryo 사용 시 필요)minlog-*.jar(kryo 사용 시 필요)
3.2 Tomcat server.xml 설정
각 Tomcat 서버의 conf/server.xml에서 사용할 Host(예: localhost) 내에 Context를 추가합니다.
Tomcat 서버 1 설정
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context path="/test" docBase="/usr/local/tomcat/webapps/test" reloadable="true">
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.0.12:11211,n2:192.168.0.13:11211"
failoverNodes="n1"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" />
</Context>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
Tomcat 서버 2 설정 (동일하게 memcachedNodes는 같고, failoverNodes를 n2로 지정해 각 서버의 로컬 memcached가 우선 사용)
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context path="/test" docBase="/usr/local/tomcat/webapps/test" reloadable="true">
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.0.12:11211,n2:192.168.0.13:11211"
failoverNodes="n2"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" />
</Context>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
3.3 테스트 JSP 페이지 생성
각 Tomcat 서버에 테스트 디렉토리와 JSP 파일을 생성합니다.
Tomcat 서버 1 (192.168.0.14)
mkdir -pv /usr/local/tomcat/webapps/test/WEB-INF/{classes,lib}
cat > /usr/local/tomcat/webapps/test/index.jsp << 'EOF'
<%@ page language="java" %>
<html>
<head><title>TomcatA</title></head>
<body>
<h1><font color="red">TomcatA</font></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("tomcat","tomcat"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>
EOF
Tomcat 서버 2 (192.168.0.15)
mkdir -pv /usr/local/tomcat/webapps/test/WEB-INF/{classes,lib}
cat > /usr/local/tomcat/webapps/test/index.jsp << 'EOF'
<%@ page language="java" %>
<html>
<head><title>TomcatB</title></head>
<body>
<h1><font color="blue">TomcatB</font></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("tomcat","tomcat"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>
EOF
3.4 Tomcat 재시작 및 테스트
systemctl restart tomcat # 또는 startup.sh / shutdown.sh 스크립트 사용
웹 브라우저에서 http://www.tomcat.com/test/index.jsp로 접근합니다. 여러 번 새로고침해도 동일한 세션 ID가 유지되는지 확인합니다. (nginx가 로드밸런싱하더라도 세션이 유지됩니다.)
4. 확인 포인트
- 세션 ID가 변경되지 않고 지속되는지 확인
- 한쪽 Tomcat 서버를 중지해도 세션이 다른 서버에서 계속 사용되는지 테스트
- Memcached에 세션 데이터가 저장되었는지 확인 가능 (
memcached-stat명령 또는 텔넷으로 확인)