반응형
Tomcat - TCP를 통한 세션 공유 설정
기본적으로 Tomcat에서 가이드하고 있는 세션 공유는 방법은 UDP를 통한 공유이지만, UDP 설정이 불가능한 경우 진행할 수 있는 TCP 설정 방법이다. TCP 방식으로 진행할 경우 서버 정보는 고정되어 있어야 한다.
서버 및 포트 정보
서버 | PORT | TCP/UDP | 용도 |
---|---|---|---|
AP1(10.10.10.1) | 4055 | TCP | 세션 정보 수신 |
AP2(10.10.10.2) | 4055 | TCP | 세션 정보 수신 |
설정 파일(server.xml)에 중에서 세션 공유 설정에 대한 AP1, AP2의 전반적인 내용을 아래 추가하였지만 실제 내용은 유사하며, 중요한 것은 세션 정보 수신 서버 정보이다.(한 서버에 여러 Tomcat으로 구성된 경우 포트 수정 필요)
<Interceptor className="org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor">
<Member className="org.apache.catalina.tribes.membership.StaticMember"
host="10.10.10.2" -- 세션 정보 수신 서버 AP1 → AP2
port="4055" -- 세션 정보 수신 포트
uniqueId="{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2}" /> -- 대상 서버 고유 값
</Interceptor>
AP1(10.10.10.1) - server.xml
AP1번 서버에서 AP2번 서버로 세션 공유
<!-- apache jk_mod의 경우 jvmRoute값을 이용하여 사용 was 판단 -->
<Engine name="Catalina" defaultHost="localhost" jvmRoute="was1">
<!-- channelSendOptions 비동기 세션 공유-->
<!--
멀티캐스팅 없이 서버 시작하려면 channelStartOptions = 3 옵션
https://tomcat.apache.org/tomcat-8.5-doc/config/cluster.html
-->
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="8"
channelStartOptions="3">
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<!-- 클러스터 전송 -->
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender" />
</Sender>
<!-- 수신 대상 지정 -->
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto" -- 자신의 IP
port="4055" -- 수신포트
autoBind="0" -- 수신 포트 변경 범위, 수신 대상이 고정이므로 0
selectorTimeout="5000" -- 대기 시간
maxThreads="6"/>
<!-- PING 체크 여부
staticOnly: 고정멤버
-->
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpPingInterceptor" staticOnly="true"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor">
<Member className="org.apache.catalina.tribes.membership.StaticMember"
host="10.10.10.2" -- 세션 정보 수신 서버 AP1 → AP2
port="4055" -- 세션 정보 수신 포트
uniqueId="{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2}" /> -- 대상 서버 고유 값
</Interceptor>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
</Channel>
<!-- 데이터 복제 시기 설정
filter: 필터에 속하는 자원의 경우 세션 변경 여부 공유 불필요
-->
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt" />
<!-- 동일 서버로 요청이 들어오도록 설정 -->
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<!-- 메시지 수신 -->
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
...
</Engine>
AP2(10.10.10.2) - server.xml
AP2번 서버에서 AP1번 서버로 세션 공유
<!-- apache jk_mod의 경우 jvmRoute값을 이용하여 사용 was 판단 -->
<Engine name="Catalina" defaultHost="localhost" jvmRoute="was2">
<!-- channelSendOptions 비동기 세션 공유-->
<!--
멀티캐스팅 없이 서버 시작하려면 channelStartOptions = 3 옵션
https://tomcat.apache.org/tomcat-8.5-doc/config/cluster.html
-->
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="8"
channelStartOptions="3">
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<!-- 클러스터 전송 -->
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender" />
</Sender>
<!-- 수신 설정 -->
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto" -- 자신의 IP
port="4055" -- 수신하기 위한 port
autoBind="0" -- 수신 포트 변경 범위, 수신 대상이 고정이므로 0
selectorTimeout="5000" -- 대기 시간
maxThreads="6"/>
<!-- PING 체크 여부
staticOnly: 고정멤버
-->
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpPingInterceptor" staticOnly="true"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor">
<Member className="org.apache.catalina.tribes.membership.StaticMember"
host="10.10.10.1" -- 세션 정보 수신 서버 AP2 → 1
port="4055" -- 세션 정보 수신 포트
uniqueId="{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1}" /> -- 대상 서버 고유 값
</Interceptor>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
</Channel>
<!-- 데이터 복제 시기 설정
filter: 필터에 속하는 자원의 경우 세션 변경 여부 공유 불필요
-->
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt" />
<!-- 동일 서버로 요청이 들어오도록 설정 -->
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<!-- 메시지 수신 -->
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
...
</Engine>
추가적으로 web.xml 파일에 distributable 옵션이 활성화되어 있어야 한다.
<web-app>
<!-- 세션 공유 활성화-->
<distributable />
</web-app>
참고
#Tomcat #session #세션공유 #cluster
반응형
'FullStack > 41. WEB.WAS' 카테고리의 다른 글
톰켓 MariaDB를 이용한 세션 관리 (0) | 2022.01.21 |
---|---|
톰켓 catalinaout 로그 안 쌓는법 (0) | 2022.01.21 |
Tomcat 8.5 JSP 1.8 문법 오류(Lambda) (0) | 2021.09.16 |
[Tomcat] logs 경로 변경 (0) | 2021.02.09 |
[취약점] Apache, Tomcat 불필요한 웹 메서드 허용 (0) | 2020.12.08 |