- 아파치 톰캣이란?
클라이언트 요청이 왔을때만 응답하는 정적 웹페이지를 만드는데 사용하는 아파치(웹 서버)와 동적인 웹을 만들기 위한 웹 컨테이너, 서블릿 컨테이너 역할을 하는 톰캣(웹 애플리케이션 서버, WAS))을 합쳐서 부르는 말입니다.
- 세션 클러스터링이란?
세션 클러스터링은 아파치 톰캣이 2대 이상 운영되는 환경에서 세션을 동일하게 관리하는 것을 의미합니다. 예를 들어 결제 시스템을 사용하는, 로드밸런서를 이용해 WAS)가 이중화 되어있는 환경에서 접속해있던 한 서버가 갑자기 다운되어 다른 서버로 넘어가는 경우 세션이 동일하게 유지되어야 하기 때문에 세션 클러스터링 설정이 필요합니다.
* 아파치, 톰캣, 커넥터 모두 설치 되었다는 가정하에 설정 부분만 정리했습니다.
- apache-tomcat 연동
httpd.conf 파일을 열어 다음과 같은 설정이 되어있는지 확인 후 없으면 추가해줍니다.
LoadModule jk_module modules/mod_jk.so <IfModule mod_jk.c> JkWorkersFile conf/workers.properties JkLogFile logs/mod_jk.log JkShmFile logs/mod_jk.shm JkMount /*.jsp tomcat_lb </IfModule> * tomcat_lb는 workers.properties에서 설정한 worker.list 인스턴스 리스트를 기재한 것 입니다. (원하는 이름으로 써도됨) |
- workers.properties 설정
worker.list=tomcat_lb // 사용할 tomcat 인스턴스 리스트 worker.tomcat1.type=ajp13 // tomcat1 인스턴스의 타입, ajp13 커넥터를 이용하여 통신 worker.tomcat1.host=10.4.0.10 // was1서버 IP worker.tomcat1.port=8009 // ajp13 커넥터 포트 worker.tomcat1.lbfactor=100 // 로드밸런싱 비율(url - 현재 설정의 경우 100:100 = 1:1) worker.tomcat2.type=ajp13 worker.tomcat2.host=10.4.0.14 worker.tomcat2.port=8019 worker.tomcat2.lbfactor=100 worker.tomcat_lb.type=lb // tomcat_lb 인스턴스의 타입 , lb = 로드밸런서 worker.tomcat_lb.balanced_workers=tomcat1,tomcat2 // tomcat_lb의 리스트 |
- tomcat의 server.xml 설정
저는 포트를 따로 변경해서 설정하였습니다. 설치 방법에 따라 ajp13 Connector 포트 설정 부분이 주석처리 되어있을 수 있으며, 그럴 경우 주석을 제거해주면 됩니다. 설정 후 톰캣 구동포트에 맞게 shutdown port(ex. 8005) 를 제외한 나머지 포트(ex. 8009, 8080)를 방화벽에 추가해줍니다. 또한 톰캣을 공식 홈페이지에서 다운로드 받았을 경우 ajp13 Connector 포트 설정 부분의 address 부분을 "::1" 에서 "::" 또는 "0.0.0.0"로 변경하며, tomcat 7.0.100, tomcat 8.5.51, tomcat 9.0.31 이상 버전부터는 secretRequired="false"를 추가해줍니다. * address : address=”::1” 로 설정시 localhost 만 접근 가능, “::” 로 설정하여야 외부에서 접근 가능 * secretRequired : secret key 통신 여부를 묻는 설정 (기본값 true, 상황에 맞게 설정하면 됨) |
만약 secret key 사용한다면 다음과 같이 설정하면 됩니다. Tomcat 7.0.100, tomcat 8.5.51, tomcat 9.0.31 하위 버전 ㄴ address=[Tomcat 서버 IP] requiredSecret=[원하는 키 값] Tomcat 7.0.100, tomcat 8.5.51, tomcat 9.0.31 이상 버전 아파치 톰캣이 연동된 환경에선 아파치의 Workers File 에 아래 내용도 추가해줘야 합니다. worker.[인스턴스명].secret=[Tomcat에 설정한 키 값] |
- 세션 확인 테스트 페이지 만들기
tomcat 웹 다큐먼트 루트에 테스트 파일 생성 (index.jsp) |
<% session.setAttribute(url - "a","a"); %> <html> <head> <title>Session Clustering Test</title> </head> <body> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr bgcolor="#CCCCCC"> <td width="13%">Tomcat1</td> <td width="87%"> </td> </tr> <tr> <td>Session ID :</td> <td><%=session.getId(url - )%></td> </tr> </table> <div>Im Tomcat1</div> </body> </html> * 빨간 부분은 was서버 마다 다르게 설정합니다. 파일 생성 후 들어가면 세션 값이 다르게 나옵니다. 이제 세션 클러스터링을 설정을 해보겠습니다. |
- 세션 클러스터링
apache와 tomcat 연동 및 로드밸런싱 설정 후 세션 클러스터링 설정을 진행합니다. 설정 방법은 거의 동일하며 톰캣 버전이 올라감에 따라 클래스 명이 변경된 부분 등만 수정해주면 됩니다.
설정은 server.xml 파일 및 web.xml 파일에서 진행하며, 설치 방법에 따라 설정 파일 위치는 다를 수 있습니다.
server.xml |
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> 클러스터 관련 설정의 주석을 제거해준 뒤 아래 내용을 추가해줍니다. <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> // 주석 제거 <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8"> <Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/> <Channel className="org.apache.catalina.tribes.group.GroupChannel"> <Membership className="org.apache.catalina.tribes.membership.McastService" address="224.0.0.4" // 멀티 캐스트 IP port="45564" // 기본 포트 frequency="500" // 해당 초 마다 UDP packet 을 날려 hearbeat 확인 dropTime="3000"/> // 해당 초 동안 hearbeat 없을 경우 장애로 판단 <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="10.4.0.23" // WAS IP에 맞게 수정 port="4000" // 해당 포트를 통해 replication message listening autoBind="100" selectorTimeout="5000" maxThreads="6"/> <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> </Sender> <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/> </Channel> <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/> <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/> <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> </Cluster> |
server.xml 설정을 한 뒤 web.xml 파일을 수정해줍니다. tomcat 설정파일 하단의 web.xml 파일 및 webapps/ROOT/WEB-INF 디렉토리 하단의 web.xml 파일 모두 수정해주면 됩니다.
* 톰캣 8, 9버전의 경우 위 설정에서 주황색으로 표시된 MessageDispatch15Interceptor 부분 MessageDispatchInterceptor 로 수정해주면 동일하게 동작합니다. 수정하지 않을 경우 catalina.out 로그에 java.lang.ClassNotFoundException 에러가 발생합니다.
web.xml |
...(생략) <distributable/> </web-app> web.xml 파일의 마지막 라인인 </web-app> 상단에 추가해줬습니다. 만약 추가하지 않을 경우 catalina.out 로그에 Context manager does not exist 라는 warning 메시지가 발생하며 세션 클러스터링 설정이 적용되지 않습니다 |
* 설정 후 멀티캐스트 Port인 45564 의 경우 TCP 와 UDP 모두 허용해줘야하며, listening 을 위한 Port 인 4000~4100번 포트의 경우 TCP 에 대해 허용해줍니다.
설정 완료 되었으며 tomcat 재실행 후 세션 테스트 페이지를 확인해 보면 됩니다.
확인 방법은 WAS) 1번과 WAS) 2번이 구동되어있는 상태에서 WAS) 1번 서버를 종료했을 때 세션 ID 가 유지되는지 테스트
해봅니다.
'linux > tomcat' 카테고리의 다른 글
tomcat 8005 포트 빠르게 올리기 (0) | 2021.05.25 |
---|---|
apache-tomcat(8.0.53), httpd, MySQL(5.7) 연동 (apm yum설치) (0) | 2021.05.25 |