본문 바로가기

IT/frameworks

window Apache2.4 Tomcat7 연동 및 로드 밸런싱

 Windows 7 Apache와 Tomcat 연동 - 로드 밸런싱

환경 설정

Tomcat 7

Apache 2.4.29

OS windows 7 Win64


많은 블러그 정보를 통해 설치를 하고 실패를 겪으면서 설치에 성공하였습니다.

어떤 작업을 할지 부터 파악하고 그에 맞게 설정을 해줘야 하는데, 무조건 블러그 정보만 따라하면 안된다는 알게되었습니다.


로드 밸런싱 : 하나의 웹 어플리케이션을 여러대의 Tomcat으로 구동하는 방식입니다.


Apache 설치

https://www.apachelounge.com/download/

Apache 2.4.29 Win64 용 httpd를 다운받습니다.

이때 mod_jk 파일 mod_jk-1.2.42-win64-VC15.zip도 같이 받으셔야 합니다.

Apache 버전과 Mod_jk 버전이 일치하지 않은경우 

Apache 설치후 구동이 되지 않을수 있습니다.

꼭 호환이 되는 Apache ,Mod_jk 파일을 다운 받으셔야 합니다.

원하는 경로에 Apache 압축을 풀어줍니다.

mod_jk 역시 압축을 풀어줍니다.

mod_jk.so 파일을 

Apache24\moudle 경로에

복사 / 붙여넣기합니다.


시스템 속성 -> 환경변수 설정

Apache 폴더가 존재하는 경로를 입력해줍니다.

C:\Apache24\bin

환경설정 이후

CMD Dos모드로 들어가 

Apache 설치 : httpd -k install

Apache 버전확인 : httpd -v

명령어를 통해 확인합니다.


Apache 설정모드

Apache24\conf 경로 이동후

httpd.conf 파일을 편집합니다.

Editplus 또는 메모장 활용

ServerRoot 수정

Apache 설치경로

ServerName 수정

window -> 서비스 -> Apache24 구동 후 확인

구동이 도지 않으면 Apache24 및 mod_jk를 확인해야 합니다.


Tomcat 로드 밸런싱 설정

저는 Tomcat을 2개 사용할것 입니다.

설치 된 Tomcat 경로로 이동합니다.

Tomcat 설치 경로 이동 후 

was1 / was2 라는 빈 폴더를 생성합니다.

Conf / logs / webapps / work 폴더를 복사합니다.

was1 / was2 를 따로 따로 구동하기 위해 필요한 폴더입니다.

기존에 있던 폴더를 복사 하시면 됩니다.

저는 그냥 모든 폴더/파일을 복사 붙여넣기 하였습니다.

물론 Server쪽 환경 설정할때는

Conf / logs / webapps / work 폴더만 붙여넣기 하였습니다.

was1\conf\

Server.xml파일을 편집합니다.

 

<?xml version='1.0' encoding='utf-8'?>

<Server port="8005" shutdown="SHUTDOWN">

  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />

  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />

  <Listener className="org.apache.catalina.core.JasperListener" />

  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />

  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />

  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />


  <GlobalNamingResources>

    <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory"

              pathname="conf/tomcat-users.xml" />

  </GlobalNamingResources>


  <Service name="Catalina">

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/>


<Connector port="7591" maxHttpHeaderSize="8192" maxKeepAliveRequests="-1" maxThreads="1000" minSpareThreads="500" maxSpareThreads="500" enableLoopups="false" redirectPort="8443" acceptCount="500"

compression="on" compressionMinSize="2048" noCompressionUserAgents="gozilla.graviata" compressableMimeType="text/html,text/xml,text/plain,text/javascript,text/css"

connectionTimeout="600000" disabledUploadTimeout="true" Server="" protocol="AJP/1.3"  />

<Engine jvmRoute="tomcat1" name="Catalina" defaultHost="localhost">

<Realm className="org.apache.catalina.realm.LockOutRealm">

<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>

</Realm>


<Host name="localhost"  appBase="C:\Users\User\Downloads\apache-tomcat-7.0.81-windows-x64\apache-tomcat-7.0.81\webapps" unpackWARs="true" autoDeploy="true">

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="was1" suffix=".txt"  pattern="%h %l %u %t &quot;%r&quot; %s %b" />

<Context crossContext="true" path="" docBase="/KorailBim" reloadable="true"></Context>

</Host>


<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">

<Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true" />

<Channel className="org.apache.catalina.tribes.group.GroupChannel">

<Membership className="org.apache.catalina.tribes.membership.McastService" address="228.0.0.4" port="45564" frequency="500" dropTime="3000" />

<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="auto" port="4000" autoBind="100" selectorTimeout="5000" maxThreads="6" />

<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">

<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender" />

</Sender>

<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector" />

<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor" />

</Channel>


<Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter="" />

<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve" />

<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/" watchDir="/tmp/war-listen/" watchEnabled="false" />

<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener" />

</Cluster>

</Engine>

 </Service>

</Server>

-----------------------------------------------------------------------------

웹 어플리케이션이 구동될 Webapps\ROOT으로 이동합니다.

이 경로는 Tomcat -> Server.xml -> appBase 에 설정된 경로의 Root을 사용하면 됩니다.

Web.xml 편집모드로 들어가

<distributable/>

추가해줍니다.


Was2\conf

Server.xml

역시 위와 동일하게 처리해줍니다.

<?xml version='1.0' encoding='utf-8'?>

<Server port="8006" shutdown="SHUTDOWN">

  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />

  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />

  <Listener className="org.apache.catalina.core.JasperListener" />

  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />

  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />

  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

  <GlobalNamingResources>


    <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase"  description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory"

              pathname="conf/tomcat-users.xml" />

  </GlobalNamingResources>

  <Service name="Catalina">

        <Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/>

<Connector port="8090" maxHttpHeaderSize="8192" maxKeepAliveRequests="-1" maxThreads="1000" minSpareThreads="500" maxSpareThreads="500" enableLoopups="false" redirectPort="8443" acceptCount="500"

compression="on" compressionMinSize="2048" noCompressionUserAgents="gozilla.graviata" compressableMimeType="text/html,text/xml,text/plain,text/javascript,text/css"

connectionTimeout="600000" disabledUploadTimeout="true" Server="" protocol="AJP/1.3"  />

<Engine jvmRoute="tomcat2" name="Catalina" defaultHost="localhost">

<Realm className="org.apache.catalina.realm.LockOutRealm">

<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>

</Realm>


<Host name="localhost"  appBase="C:\Users\User\Downloads\apache-tomcat-7.0.81-windows-x64\apache-tomcat-7.0.81\webapps" unpackWARs="true" autoDeploy="true">

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"

               prefix="was2" suffix=".txt"

               pattern="%h %l %u %t &quot;%r&quot; %s %b" />


<Context crossContext="true" path="" docBase="/KorailBim" reloadable="true"></Context>

</Host>


<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">

<Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true" />

<Channel className="org.apache.catalina.tribes.group.GroupChannel">

<Membership className="org.apache.catalina.tribes.membership.McastService" address="228.0.0.4" port="45564" frequency="500" dropTime="3000" />

<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="auto" port="4000" autoBind="100" selectorTimeout="5000" maxThreads="6" />

<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">

<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender" />

</Sender>

<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector" />

<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor" />

</Channel>

<Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter="" />

<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve" />

<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/" watchDir="/tmp/war-listen/" watchEnabled="false" />

<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener" />

</Cluster>


</Engine>

 </Service>

</Server>

----------------------------------------------
Server Port / Connector Port / Cluster Port는

was1\Server.xml Port와 중복되지 않게 설정합니다.

appBase는 웹 어플리케이션의 위치이기 때문에 
Was1/Was2로 따로 설정해도 무방하지만
배포 처리를 각각해줘야 하기 때문에 
저는 메인 Tomcat 위치로 설정했습니다.

다시 Apache24\httpd.conf 파일을 편집하여

Directory경로를 수정해 줍니다.

Apache가 처리할 소스 경로로 Tomcat의 웹 어플리케이션이 존재하는 최상위 폴더를 지정했습니다.

DocumentRoot "C:\Users\User\Downloads\apache-tomcat-7.0.81-windows-x64\apache-tomcat-7.0.81\webapps"

<Directory "C:\Users\User\Downloads\apache-tomcat-7.0.81-windows-x64\apache-tomcat-7.0.81\webapps">

    Require all granted <- 추가

    Options Indexes FollowSymLinks

    AllowOverride None

    Require all granted

</Directory>

Apache24 와 Tomcat의 로드 밸런싱을 위한 설정을 해줘야합니다.

LoadModule jk_module modules/mod_jk.so

JkWorkersFile conf/workers.properties

JkLogFile logs/mod_jk.log

JkLogLevel info

JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "

JkRequestLogFormat "%w %V %T"

JkMount /  loadbalancer

JkMount /* loadbalancer

AddDefaultCharset UTF-8

conf/workers.properties

파일은 사용자가 직접 빈 파일을 생성해야 합니다.

빈 파일 생성후 편집모드로 작성합니다.

worker.list=loadbalancer, status

worker.tomcat1.port=7591
worker.tomcat1.host=localhost 
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor=100

worker.tomcat2.port=8090
worker.tomcat2.host=localhost
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=100

worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=tomcat1, tomcat2
worker.loadbalancer.method=B           
# B(Busyness), R(Requests), T(Traffic)

worker.status.type=status

Tomcat\Server.xml에 정의한 
AJP/13  Connector의  jvmRoute의 명칭가 일치시켜 주면 됩니다.

was1/Server.xml -> jvmRoute=tomcat1
was1/Server.xml -> port=7591

was2/Server.xml -> jvmRoute=tomcat2
was2/Server.xml -> port=8090


이제 마지막으로 was1/was2 실행을 위한 Startup 작업을 해줘야 합니다.

기존에 있던 

startup.bat / shutdown.bat

복사 / 붙여넣기를 통해 명칭을 변경합니다.

startup_was1.bat/shutdown_was1.bat

모두편집 모드로 들어가 

set "CATALINA_HOMDE=C:\Users\User\Downloads\apache-tomcat-7.0.81-windows-x64\apache-tomcat-7.0.81"

set "CATALINA_BASE=C:\Users\User\Downloads\apache-tomcat-7.0.81-windows-x64\apache-tomcat-7.0.81\was1"

set "SERVER_NAME=was1"

set "JAVA_HOME=C:\Program Files\Java\jdk1.8.0_91"

추가해줍니다.

Apache 설치 및 Was1/was2 구동을 위한 경로

JDK 경로를 설정해줍니다.

-------------------------------------

tartup_was2.bat/shutdown_was2.bat

모두편집 모드로 들어가 

set "CATALINA_HOMDE=C:\Users\User\Downloads\apache-tomcat-7.0.81-windows-x64\apache-tomcat-7.0.81"

set "CATALINA_BASE=C:\Users\User\Downloads\apache-tomcat-7.0.81-windows-x64\apache-tomcat-7.0.81\was2"

set "SERVER_NAME=was2"

set "JAVA_HOME=C:\Program Files\Java\jdk1.8.0_91"

추가해줍니다.

Apache 설치 및 Was1/was2 구동을 위한 경로

JDK 경로를 설정해줍니다.

Window의 서비스 모드에서

설치된 Apache24를 구동합니다.

마지막으로 Tomcat을 구동하고

localhost:80 포틀 접속하시면 끝이납니다.


한쪽 서버 부하로 인하여 서버가 중단 될경우

다른 한쪽 서버로 웹 어플리케이션이 연동되어 

서비스를 운영하는 모드입니다.


테스트 절차는 was1/was2 구동

localhost:80 접속 

was로그를 통해 구분 후 접속된 Was 내림

몇초 지난 후 

localhost:80 기능 그대로 사용

다른 서버에 붙어서 접속 허용


지금까지

Window Apache Tomcat 로드 밸런싱 연동 과정이었습니다.