Centos7 / Apache - Tomcat - JK Connector Load Balancing
Updated:
Load Balancing 에 대한 개념을 모르신다면 Load Balancing 포스트를 보시면 됩니다.
환경 구성은 아래 포스트에서 잡은 환경을 바탕으로 진행하겠습니다.
Version
사용한 버전은 아래와 같습니다.
- Vagrant : 2.2.6
- Java : openjdk-1.8.0
- Apache Tomcat : 9.0.34
- Apache httpd : 2.4.43
- Tomcat Connectors : 1.2.48
Setting Tomcat Multi Instances
하나의 VM 에서 여러개의 Tomcat 을 올려야 하기 때문에 Tomcat 에 있는 파일을 복사해 각각 instance1, instance2 를 만들어주겠습니다.
$ cd /opt/
$ ls
$ mkdir instance1
$ mkdir instance2
$ ls
instance1 instance2 tomcat
$ cp -r tomcat/ instance1
$ cp -r tomcat/ instance2
계층 구조를 보면 아래와 같습니다. 보통 모든 파일이 필요하지는 않지만 빠르게 구현하기 위해 통채로 복사했습니다.
$ tree . -L 2
.
├── instance1
│ └── tomcat
├── instance2
│ └── tomcat
└── tomcat
├── BUILDING.txt
├── CONTRIBUTING.md
├── LICENSE
├── NOTICE
├── README.md
├── RELEASE-NOTES
├── RUNNING.txt
├── bin
├── conf
├── lib
├── logs
├── temp
├── webapps
└── work
포트는 아래와 같이 지정해주겠습니다.
- Tomcat
- Server shutdown Port : 8005
- HTTP Port : 8080
- redirectPort : 8443
- AJP Port : 8009
- instance1
- Server shutdown Port : 18005
- HTTP Port : 18080
- redirectPort : 18443
- AJP Port : 18009
- instance2
- Server shutdown Port : 28005
- HTTP Port : 28080
- redirectPort : 28443
- AJP Port : 28009
그리고 각 파일에 server.xml 과 index.jsp 를 아래와 같이 수정해줍니다.
instance 1
$ vi /opt/instance1/tomcat/conf/server.xml
<Server port="18005" shutdown="SHUTDOWN">
<Connector port="18080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="18443" />
<Connector protocol="AJP/1.3"
address="::1"
port="18009"
redirectPort="18443"
secretRequired="false"/>
$ vi /opt/instance1/tomcat/webapps/ROOT/index.jsp
<html>
<head>
</head>
<body>
<h1> Instance 1 Apache Tomcat </h1>
</body>
</html>
instance 2
$ vi /opt/instance2/tomcat/conf/server.xml
<Server port="28005" shutdown="SHUTDOWN">
<Connector port="28080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="28443" />
<Connector protocol="AJP/1.3"
address="::1"
port="28009"
redirectPort="28443"
secretRequired="false"/>
$ vi /opt/instance2/tomcat/webapps/ROOT/index.jsp
<html>
<head>
</head>
<body>
<h1> Instance 2 Apache Tomcat </h1>
</body>
</html>
앞전과 마찬가지로 Tomcat 에 접속해야하는 18080 과 28080 포트를 열어줍니다.
$ firewall-cmd --permanent --zone=public --add-port=18080/tcp
success
$ firewall-cmd --permanent --zone=public --add-port=28080/tcp
success
$ firewall-cmd --reload
그리고 각각의 Tomcat 인스턴스를 시작시켜주고 종료시켜줄 Shell 파일을 만들어줍니다.
startup.sh
$ vi /opt/instance1/tomcat/startup.sh
#!/bin/sh
export CATALINA_BASE=/opt/instance1/tomcat/
export TOMCAT_HOME=/opt/tomcat/
cd $TOMCAT_HOME/bin
./startup.sh
$ chmod +x starup.sh
shutdown.sh
$ vi /opt/instance1/tomcat/shutdown.sh
#!/bin/sh
export CATALINA_BASE=/opt/instance1/tomcat/
export TOMCAT_HOME=/opt/tomcat/
cd $TOMCAT_HOME/bin
./shutdown.sh
$ chmod +x shutdown.sh
여기까지 설정이 완료되면 모든 Tomcat 인스턴스를 시작시켜서 8080, 18080, 28080 포트로 접속해서 정상적으로 작동하는지 확인해보겠습니다.
10.30.30.2:8080
10.30.30.2:18080
10.30.30.2:28080
각각의 주소에서 위와같이 화면이 보이면 정상적으로 설정이 완료된겁니다. 이제 Tomcat 과 Apache 를 모두 종료시킨 다음 Load Balancing 을 셋팅해보겠습니다.
Setting JK Connector Load Balancing
먼저 httpd.conf 파일에 들어가서 아래와 같이 설정을 바꿔줍니다.
$ vi /usr/local/apache24/conf/httpd.conf
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkShmFile logs/mod_jk.shm
JkMount /* load_balancer
workers.properties 로 들어가서 아래와 같이 내용을 등록해줍니다.
$ vi /usr/local/apache24/conf/workers.properties
worker.list=load_balancer
worker.load_balancer.type=lb
worker.load_balancer.balance_workers=tomcat1,instance1,instance2
worker.tomcat1.port=8009
worker.tomcat1.host=localhost
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor=1
worker.instance1.port=18009
worker.instance1.host=localhost
worker.instance1.type=ajp13
worker.instance1.lbfactor=1
worker.instance2.port=28009
worker.instance2.host=localhost
worker.instance2.type=ajp13
worker.instance2.lbfactor=1
위 파일을 보면 각각 load_balancer
의 노드로 tomcat1
, instance1
, instance2
설정을 해놨고 AJP 프로토콜을 이용하여 미리 지정한 8009, 18009, 28009 포트로 접속하게 설정했습니다.
worker.load_balancer.type=lb
는 이 load_balancer
를 Load Balancing 하겠다는 의미입니다.
lbfactor
는 전부 1 로 설정해놨는데 Load Balancing 를 1 : 1 : 1 로 하겠다는 의미입니다.
이제 다시 재시작을해서 10.30.30.2 로 접속해보겠습니다.
10.30.30.2
정상적으로 작동하는것을 확인할 수 있습니다.
만약 서버 접속이 안된다면 httpd.conf 접근 권한을 확인하면 됩니다.
<Directory /DOCUMENT_ROOT>
Order allow,deny
Allow from all
</Directory>
JK Status Manager
마지막으로 JK Status Manager 설정까지 알아보고 마무리하겠습니다. 설정은 아래와 같이 하면 됩니다.
현재 Web Server / WAS 의 상태를 알아볼 수 있습니다.
$ vi /usr/local/apache24/conf/httpd.conf
JkMount /jkmanager/* jkstatus
<Location /jkmanager/>
JkMount jkstatus
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>
workers.properties 에서 맨 아래에 내용을 추가해줍니다.
$ vi /usr/local/apache24/conf/workers.properties
worker.list=jkstatus
worker.jkstatus.type=status
만약 AH01797: client denied by server configuration:
오류가 발생하면, 접근 권한이 막혀있을 수 있기 때문에 httpd.conf 파일에 아래 내용을 추가해주면 됩니다.
<Location /jkmanager/>
JkMount jkstatus
Require all granted
</Location>
10.30.30.2/jkmanager/ 로 접속하면 됩니다.
다음 포스트로는 Tomcat Session Clustering 을 해보겠습니다.
Leave a comment