Dev

[apache] 윈도우 아파치 load balancer 설치

Ryan Woo 2018. 5. 30. 21:21

로컬PC(Windows)에서 Apache load balancer 를 이용해 SpringBoot 어플리케이션 이중화를 구성해 본다.

(본문에서는 세션 클러스터링은 다루지 않고 단순히 load balancing 만을 구성함)

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

실행 후

http://127.0.0.1

접속해서 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;

}

}

-- 출처 

http://blog.naver.com/PostView.nhn?blogId=cutesboy3&logNo=221235755800&categoryNo=22&parentCategoryNo=0&viewDate=&currentPage=1&postListTopCurrentPage=1&from=postViewhttp://blog.naver.com/PostView.nhn?blogId=cutesboy3&logNo=221235755800&categoryNo=22&parentCategoryNo=0&viewDate=&currentPage=1&postListTopCurrentPage=1&from=postView

해당 클래스를 추가하면 SpringBoot 어플리케이션에서 ajp 포트가 정상적으로 동작함을 확인할 수 있다.


7. 로드밸런싱 테스트

Apache Web Server 의 JkMount context로 접속을 해보면, 정상적으로 load balancing 이 동작하는 것을 확인할 수 있다.