구성환경
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가 동일하다면 성공 ~^^
https://fliedcat.tistory.com/126
'NGINX' 카테고리의 다른 글
NGINX 세션클러스터링 참고 (1) | 2021.06.21 |
---|---|
[Nginx] Load Balancer 설정하기 (0) | 2021.06.10 |
Nginx HTTPS 설정 (2) | 2021.06.02 |
[실습 성공] NGINX 서브도메인 - 무료 SSL 인증서 & HTTPS 구성 (0) | 2021.05.31 |
[실습 성공] 무료 SSL 인증서 & HTTPS 구성 (0) | 2021.05.31 |
댓글