본문 바로가기
개발

세션 클러스터링을 통한 Apache와 Tomcat의 고가용성 웹 애플리케이션 구축 방법

by 닉네임 입니다 2024. 11. 13.
728x90

Apache와 Tomcat을 활용한 세션 클러스터링 설정

안녕하세요! 웹 개발에 관심이 많은 여러분, 오늘은 Apache와 Tomcat을 활용하여 세션 클러스터링을 설정하는 방법에 대해 알아보겠습니다. 세션 클러스터링은 여러 서버에서 동일한 세션 정보를 공유할 수 있도록 해 주며, 이는 특히 고가용성과 확장성이 중요한 웹 애플리케이션에서 필수적인 기술입니다.

들어가며

웹 애플리케이션이 사용자 수가 증가함에 따라, 단일 서버에서 처리하는 것에는 한계가 있습니다. 이때 여러 대의 서버를 운영하여 사용자 요청을 분산 처리하는 로드 밸런싱을 도입할 수 있습니다. 그 과정에서 세션 클러스터링은 각 서버 간의 세션 상태를 공유하여 사용자가 원활하게 서비스를 이용할 수 있도록 도와줍니다.

로드밸런싱 설정

먼저, Apache와 Tomcat 간의 로드밸런싱 설정을 위해 mod_jk를 다운로드하여 설치합니다. 이후 Apache 설정 파일에서 로드밸런서에 대한 설정을 추가합니다.

Apache 설정

  1. mod_jk 다운로드: mod_jk를 다운로드하고 Apache의 modules 폴더에 이동시킵니다.
  2. workers.properties 파일 생성: Apache 설정 파일이 있는 폴더에 workers.properties 파일을 작성합니다.
worker.list=loadbalancer
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=was1,was2
worker.was1.type=ajp13
worker.was1.host=localhost
worker.was1.port=8009
worker.was1.lbfactor=1
worker.was2.type=ajp13
worker.was2.host=localhost
worker.was2.port=8099
worker.was2.lbfactor=1
  1. httpd.conf 설정 추가: Apache의 httpd.conf 파일에 다음 설정을 추가합니다.
LoadModule jk_module modules/mod_jk.so
<IfModule jk_module>
    JkWorkersFile conf/workers.properties 
    JkLogFile "|bin/rotatelogs.exe -l logs/mod_jk_%Y%m%d.log 86400"
    JkLogLevel Info 
    JkMount /* loadbalancer
</IfModule>

이렇게 설정하면 Apache가 요청을 was1was2 두 대의 Tomcat 서버로 분산시킬 수 있게 됩니다.

Tomcat 설정

각 Tomcat의 server.xml 파일에 AJP 포트를 설정해 줍니다. 기본 AJP 포트는 8009이지만, 두 대의 Tomcat을 운영하기 때문에 포트 충돌을 방지하기 위해 was2는 8099로 설정합니다.

Tomcat AJP 포트 설정

<Connector protocol="AJP/1.3" port="8009" redirectPort="8443" secretRequired="false"/>
<Connector protocol="AJP/1.3" port="8099" redirectPort="8443" secretRequired="false"/>

세션 클러스터링 구현

이제 세션 정보가 여러 TOMCAT 서버에 클러스터링되도록 설정합니다. 이를 통해 사용자는 동일한 세션 아이디를 유지하며 서비스를 이용할 수 있습니다.

Spring Boot 설정

Spring Boot 애플리케이션에서 세션 클러스터링을 설정하기 위해, ServletWebServerFactory 클래스를 등록합니다.

@SpringBootApplication
public class WasTestApplication {

    public static void main(String[] args) {
        SpringApplication.run(WasTestApplication.class, args);
    }

    @Bean
    public ServletWebServerFactory tomcatFactory() {
        return new TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                // 세션 클러스터링을 위한 설정 추가
                context.setDistributable(true);
            }
        };
    }
}

이 설정을 통해 Tomcat에서 세션이 클러스터링되도록 하며, 다음 각 Tomcat의 server.xml에 jvmRoute 설정을 추가합니다.

<Engine name="Catalina" defaultHost="localhost" jvmRoute="was1">
<Engine name="Catalina" defaultHost="localhost" jvmRoute="was2">

또한, <Cluster> 태그를 활성화해야 합니다.

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
    <Manager className="org.apache.catalina.ha.session.DeltaManager"/>
    <Channel className="org.apache.catalina.tribes.group.GroupChannel">
        <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"/>
    </Channel>
</Cluster>

마무리

위의 과정을 통해 Apache와 Tomcat 환경에서 세션 클러스터링을 성공적으로 설정할 수 있습니다. 이를 통해 사용자는 서버 이동 시에도 세션 정보가 지속적으로 유지되어 원활한 서비스 사용이 가능합니다. 여러분의 실무 프로젝트에 이 설정이 큰 도움이 되기를 바라며, 더 많은 질문이나 궁금한 점이 있다면 언제든지 댓글로 남겨주세요!

기술의 발전을 함께 즐기며, 다음 포스트에서 더 유용한 정보로 찾아뵙겠습니다. 감사합니다!

728x90