본문 바로가기

WEB & WAS/Tomcat

nginx + tomcat 클러스터링 구성

반응형

개요

 

구성환경

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