개요
구성환경
nginx-1.17.7 / tomcat-9 / CentOS 7.6
테스트 환경
nginx 서버 : 192.168.0.167 / tomcat 1 서버 : 192.168.0.130 / tomcat 2 서버 : 192.168.0.140
1. nginx 구성
nginx.conf
http { upstream tomcat_group_1 { ip_hash ; server 192.168.0.130:8080 weight=1 max_fails=6 fail_timeout=10s; server 192.168.0.140:8080; } server { listen 80; server_name localhost; location /examples { proxy_pass http://tomcat_group_1; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for # proxy_set_header X-Real-IP $remote_addr; proxy_set_header HOST $http_host; proxy_set_header X-NginX-Proxy true; } |
* upstream : 서버 그룹의 이름 지정
* 로드 발란싱 방법 : ip_hash, least_conn, hash, random
- ip_hash : 클라이언트 IP에 기반한 로드 발란싱, 동일 IP 클라이언트 접속에 대해서는 동일 서버로 연결(단 서버가 유효한 경우만), ipv4의 경우 앞 3옥텟 주소 , ipv6는 전체 주소가 hashing key가 된다.
- least_conn : 평균응답시간과 활성화 접속수가 가장 적은 서버로 연결
* server : 서버 접속 정보 , ip:port 형태로 설정
* server parameter
- weight : 가중치, default 1,
- max_fails : default 1,
- fail_timeout : 단위로 s,m 사용가능, default 10s
- backup : 모든 primary 서버가 unusable시 활성화됨, primary 서버중 1대이상 usable 상태가 되면 대기 상태로 변경됨( hash, ip_hash, random 로드 발란싱과 함께 사용할 수 없음)
- down : 서버를 영구적으로 down 상태로 만듦
* proxy_pass : upstream(proxyed server)에서 설정한 서버 그룹 지정
* sticky : 이 옵션은 nginx plus 제품에서 사용 가능
2. tomcat 구성
2.1 각각 server.xml 에 Cluster 구성
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1"> <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="228.0.0.4" port="45564" frequency="500" dropTime="3000"/> <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="auto" port="4000" autoBind="100" selectorTimeout="5000" maxThreads="6"/> <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> 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.MessageDispatchInterceptor"/> </Channel> <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/> <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/> <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/" watchDir="/tmp/war-listen/" watchEnabled="false"/> <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> </Cluster> |
2.2 어플리케이션 세션 공유 설정( 예, webapps/examples/WEB-INF/web.xml)
- 각노드의 톰캣끼리 세션 공유를 하기 위해 <distributable/> 을 넣어준다
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns=" http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ..... 중략 ..... <distributable/> </web-app> |
3. 테스트
http://192.168.0.167/examples/servlets/ 에서 Sessions 을 예로 진행
- jvmRoute 값이 tomcat1이므로 1번 tomcat 서버를 통해 처리됨을 알수 있다.
- 1번 tomcat 서버 Shutdown 후 동일한 세션을 가져 오는지 확인
jvmRoute 값만 변경되고 session ID가 동일하다면 성공 ~^^
'WEB & WAS > Tomcat' 카테고리의 다른 글
nginx tomcat 연동 (0) | 2020.01.17 |
---|---|
[Tomcat] Context간 세션 공유 (0) | 2019.09.29 |
[Tomcat] Clustering(클러스터링) (0) | 2019.08.27 |
[Tomcat] WAR 파일 배포 (0) | 2019.08.25 |
[Tomcat] Context 추가 (0) | 2019.08.23 |