허원철의 개발 블로그

Spring Boot - Apache proxy를 이용한 로드밸런싱 본문

web

Spring Boot - Apache proxy를 이용한 로드밸런싱

허원철 2017. 1. 17. 19:13

이번 글은 Apache 설치와 로드밸런싱을 하여 Spring Boot를 올려 보도록 하겠습니다.


Apache 를 선택한 이유

- 요즘은 apache가 지는 태양이라고 한다면 nginx라는게 뜨는 태양이라고 할 수 있습니다. 서버 동작 차이라고하는데.. 아직은 nginx를 알지도 못하고 Apache가 친숙하지 않기 때문에 Apache를 선택했습니다. (추후에 nginx도 공부하는 걸로...)



로드밸런싱을 하게된 이유

- WAS를 KT 클라우드에 올리게 되어 8 core X 8 G 사양을 선택하게 되었습니다. 과부하를 줄이기 위해 튜닝쪽 구글링을 하다가 로드밸런싱을 하는 것이 좋을 것 같다고 판단되어 Apache에서 모듈을 이용해 로드밸런싱을 해보려고 합니다.


- 톰캣 인스턴스당 2~3GB 정도의 Heap Szie만을 갖길 권장합니다. 왜냐하면 JAVA에서는 메모리가 자동적으로 내려가는 GC가 발생하는데, GC가 발생하는 동안 응답이 지연되는 현상이 일어납니다. Heap Size가 클수록 GC를 해야할 범위가 늘어나 Heap Size를 작게 하는 것이 좋다고 합니다. 또한 Heap Size를 높게 잡아도 실질적으로는 2~3G 정도 밖에 사용하지 못한다고 합니다.



Apache 설치


OS : Centos 6.5

Apache Version : v2.2.15


- v2.4.+ 버전이 나와있는 시점인데도 불구하고 v2.2 버전을 설치하는 이유는.. OpenSSL Update와 v2.4에서는 별도의 유틸이 필요하다보니 구성이 너무 어렵다고 판단하여(몇일 삽질... 했습니다.) yum으로 빠르게 설치할 수 있는 v2.2 를 선택했습니다.


1) httpd 설치 확인

- 최소 설치를 한 경우에는 httpd가 설치 안되어 있으므로, 일단 확인해 봅니다. (Available Packages 라고 나와있으면 미설치)


1
2
rpm -qa httpd
yum list httpd
cs


2) Apache 설치


1
yum install httpd
cs


3) 방화벽 해제


① iptables 편집

1
vi /etc/sysconfig/iptables
cs


② 80포트를 Open

[ iptables ]

1
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
cs


③ iptables 재실행

1
service iptables restart
cs


4) Apache 실행


1
service httpd start
cs


<기본 테스트 페이지>



※ OpenSSL version is too old 에러가 나는 경우에는 Version Update 를 해달라는 메시지입니다.


 - ftp://ftp.openssl.org/source/ 에서 새로운 버전 설치 (1.1.0 이후 버전은 다른 작업이 필요한 듯 합니다. 일단은 1.0.2+ 설치 합니다.)


1) 압축 풀기


1
2
cd /usr/local/src
tar -xzvf openssl-1.0.2j.tar.gz
cs


2) 실행


1
2
3
4
cd ./openssl-1.0.2j
./config
make
mak install
cs


3) 버전 및 기존 위치 확인

대부분 /usr/bin/openssl 에 위치


1
2
openssl version
which openssl
cs


4) openssl 백업


1
mv /usr/bin/openssl /root/
cs


5) 설치한 openssl 적용


1
ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
cs



※ C / C++ Compiler 필요할 경우


1
yum groupinstall 'Development Tools'
cs




mod_jk를 이용한 tomcat 연동


1) tomcat-connectors 설치


1
2
cd /usr/local/src
wget http://www.apache.org/dist/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.42-src.tar.gz
cs


2) native 디렉토리로 이동


1
cd  tomcat-connectors-1.2.42-src/native
cs


3) 실행


1
2
3
./configure --with-apxs={apxs path}
make
make install
cs


※ apxs path 확인


① 경로를 모르는 경우

1
find / -name apxs
cs


② 없는 경우

1
yum install httpd-devel
cs


4) httpd.conf 수정


1
2
cd /etc/httpd/conf
vi httpd.conf
cs


[ httpd.conf ]

- 맨 아래 추가

1
2
3
4
... 
LoadModule jk_module modules/mod_jk.so
include conf/mod_jk.conf
include conf/http_vhost.conf
cs


5) mod_jk.conf 추가


1
vi mod_jk.conf
cs


[ mod_jk.conf ]

1
2
3
4
5
<IfModule mod_jk.c>
 JkWorkersFile conf/workers.properties
 JkLogFile     logs/mod_jk.log
 JkLogLevel    info
</IfModule>
cs


6) workers.properties 추가


1
vi workers.properties
cs


[ workers.properties ]


1
2
3
4
5
6
worker.list=worker1
 
worker.worker1.port=18009
worker.worker1.host=127.0.0.1
worker.worker1.type=ajp13
worker.worker1.lbfactor=1
cs


6) http_vhost.conf 추가


1
vi http_vhost.conf
cs


[ http_vhost.conf ]

1
2
3
4
5
6
7
<VirtualHost *:80>
 SerberAdmin webmaster@localhost
 ServerName  localhost
 ServerAlias localhost
 
 JkMount /* worker1
</VirtualHost>
cs



mod_jk를 이용한 로드 밸런싱


1) worker.properties 수정


1
vi workers.properties
cs


[ worker.properties ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
worker.list=worker1,worker2,load_balance
 
worker.worker1.port=18009
worker.worker1.host=127.0.0.1
worker.worker1.type=ajp13
worker.worker1.lbfactor=1
 
worker.worker2.port=28009
worker.worker2.host=127.0.0.1
worker.worker2.type=ajp13
worker.worker2.lbfactor=1
 
worker.load_balance.type=lb
worker.load_balance.balanced_workers=worker1,worker2
cs

2) http_vhost.conf 수정

1
vi http_vhost.conf
cs


[ http_vhost.conf ]

1
2
3
4
5
6
7
<VirtualHost *:80>
 SerberAdmin webmaster@localhost
 ServerName  localhost
 ServerAlias localhost
 
 JkMount /* load_balance
</VirtualHost>
cs




mod_proxy를 이용한 톰캣 연동


1) httpd.conf 수정


1
2
cd /etc/httpd/conf
vi httpd.conf
cs


[ httpd.conf ]

1
2
3
4
5
6
...
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_http_module modules/mod_proxy_http.so
...
include conf/mod_proxy.conf
cs


5) mod_proxy.conf 추가


1
vi mod_proxy.conf
cs

[ mod_proxy.conf ]
1
2
3
4
5
6
7
8
9
ProxyPass / http://127.0.0.1:8080/
ProxyPassPassReverse / http://127.0.0.1:8080/
 
ProxyRequests On
 
<Proxy *>
  Order deny, allow
  Allow from all
</Proxy>
cs


※ ProxyPass, ProxyPassReverse 에 / ...../ 꼭 넣어줘야 합니다. (삽질의 원인...)



mod_proxy를 이용한 로드 밸런싱


1) mod_proxy.conf 수정


1
vi mod_proxy.conf

cs


[ mod_proxy.conf ]

1
2
3
4
5
6
7
8
9
10
ProxyRequests On
ProxyPreserveHost On
 
<Proxy balancer://mycluster>
  BalancerMember http://127.0.0.1:8080
  BalancerMember http://127.0.0.1:8081
</Proxy>
 
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
cs


※ ProxyPass, ProxyPassReverse 에 / ...../ 꼭 넣어줘야 합니다. (삽질의 원인...)



Spring Boot 실행


1
2
java -server -Dserver.port=8080 -jar test.jar
java -server -Dserver.port=8081 -jar test2.jar
cs


'web' 카테고리의 다른 글

Spring Boot - QueryDSL  (410) 2017.01.25
Spring Boot - jar로 Deploy(배포)하기  (405) 2017.01.19
Spring Boot - RabbitMQ  (395) 2017.01.10
메시지 큐(Message Queue) 훑어보기  (441) 2017.01.08
Spring Boot - Exception Handler  (405) 2017.01.03
Comments