로컬PC(Windows)에서 Apache load balancer 를 이용해 SpringBoot 어플리케이션 이중화를 구성해 본다.
1. 아파치 웹서버 다운로드
https://www.apachelounge.com/download/
(본인의 os에 맞게 설정, 위에 do not run 등이 표기되어있음)
(간혹 vcruntime140.dll(이)가 없어 프로그램을 시작할 수 없습니다. 오류가 발생하는 경우, 아래 사이트에서 Visual Studio 2015용 Visual C++ 재배포 가능 패키지를 다운받아 설치하면 해결 된다.)
https://www.microsoft.com/ko-kr/download/details.aspx?id=48145
2. 바이너리 다운로드 후 c:\에 압축 해제
(path를 변경하고 싶은 경우, ./Apache24/conf/httpd.conf 파일에서 기본패스가 C:\Apache24 로 되어있는데 이것을 모두 원하는 경로로 바꾸어 주면 된다.)
필요하면 환경변수 등록을 한다.
3. 테스트 가동
/Apache24/bin/httpd.exe
실행 후
접속해서 It`s work 가 나오면다면 일단 성공
여기까지 기타 필요한 문서는 아래를 참고
https://httpd.apache.org/docs/2.4/ko/platform/windows.html#inst
4. 톰캣 커넥터 다운로드
아래 사이트에서 개인 환경에 맞는 tomcat connector 를 다운 받는다.
https://archive.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/windows/
(포스트 기준 tomcat-connectors-1.2.40-windows-x86_64-httpd-2.4.x.zip)
압축을 풀면 mod_jk.so 파일이 나오는데 이것을 /Apache24/modules 로 옮긴다.
5. 커넥터 설정
/Apache24/conf/httpd.conf 파일에 커넥터 환경설정을 한다.
Listen {본인ip}:{port}
LoadModule jk_module modules/mod_jk.so
#JK워커 프로퍼티
JkWorkersFile "conf/workers.properties"
#로그설정
JkLogFile "logs/mod_jk.log"
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
JkRequestLogFormat "%w %V %T"
#마운트 설정, context 추가도 가능함
JkMount /* loadbalancer
#JkMount /context/* loadbalancer
위에서 설정한 JK워커파일을 생성 /Apache24/conf/workers.properties 및 설정
worker.list=worker1,loadbalancer
worker.worker1.port=8009
worker.worker1.host=localhost
worker.worker1.type=ajp13
worker.worker1.lbfactor=100
# worker.worker2.port=18009
# worker.worker2.host=localhost
# worker.worker2.type=ajp13
# worker.worker2.lbfactor=100
worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=worker1
worker.loadbalancer.sticky_session=1
아파치 웹서버의 로드밸런서와 톰캣의 연동은 ajp 포트를 이용 한다.
따라서 워커인 스프링부트 어플리케이션에 ajp 관련 설정이 추가되어야 한다.
6. SpringBoot 어플리케이션에 ajp 커넥터 추가
SpringBoot가 업데이트 되면서 EmbeddedServletContainerCustomizer 클래스가 기존에 있던 라이브러리에 존재하지 않는다.
따라서 다음과 같이 configuration 클래스를 작성해야 한다.
import org.apache.catalina.connector.Connector;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ContainerConfig {
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
tomcat.addAdditionalTomcatConnectors(createAjpConnector());
return tomcat;
}
private Connector createAjpConnector() {
Connector ajpConnector = new Connector("AJP/1.3");
ajpConnector.setPort(8010);
ajpConnector.setSecure(false);
ajpConnector.setAllowTrace(false);
ajpConnector.setScheme("http");
return ajpConnector;
}
}
-- 출처
해당 클래스를 추가하면 SpringBoot 어플리케이션에서 ajp 포트가 정상적으로 동작함을 확인할 수 있다.
7. 로드밸런싱 테스트
Apache Web Server 의 JkMount context로 접속을 해보면, 정상적으로 load balancing 이 동작하는 것을 확인할 수 있다.
'Dev' 카테고리의 다른 글
[intellij] 자주 사용하지 않는 단축키 저장용 (0) | 2019.02.26 |
---|---|
[junit5] WARNING: TestEngine with ID 'junit-jupiter' failed to execute tests 에러가 발생하는 경우 (0) | 2019.02.20 |
[Git] Branch Model (0) | 2018.05.18 |
[SSL] java.security.cert.CertificateException: No subject alternative names matching IP address 인증서 오류가 나는 경우 (0) | 2018.05.15 |
[도서 리뷰] 강화학습 첫걸음 (0) | 2018.03.11 |