본문 바로가기

Linux

Apache tomcat 서버 구축 (3)

이제 앞서 설치한 아파치와 톰캣을 연동할 것 입니다. 간단하게 설명을 하자면현재 하나의 ip주소와 두개의 80, 8080포트가 있는데 ip주소만 입력하게 되면 80포트인 아파치 웹 서버가 열리게 됩니다. 하지만 대부분의 사이트에서는 정적인 웹 서버만 사용하지 않고 동적인 WAS서버를 같이 사용하기 때문에 8080으로 이동을 해야합니다. 여러대의 톰캣을 사용해도 되지만 이 글에서는 하나의 아파치, 하나의 톰캣엔지, 두개의 톰캣 인스턴스를 사용하여 multiinstance방식을 사용합니다.

Multi instance에 대해 간단하게 설명을 하자면 설치한 tomcat폴더 안에는 여러개의 폴더들이 존재하는데 그 안에 bin, lib폴더가 톰캣 엔진에 해당하고 나머지 폴더들이 톰캣 인스턴스가 해당이 된다. 그러므로 webapp, conf 등의 폴더들이 2개 이상 있어야 멀티 인스턴스가 되는 것이다. 이번 글은 조금 길어질 것 같다.


먼저 준비해야할 것은 아파치와 톰캣을 연결하기 위해서 사용되는 tomcat-connectors가 필요하다.

cd /usr/local

wget https://dlcdn.apache.org/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.48-src.tar.gz

tar zxvf tomcat-connectors-1.2.48-src.tar.gz

mv tomcat-connectors-1.2.48-src /usr/local/tomcat/

설치할 폴더로 이동한 뒤 wget으로 설치하고 tar xvfz로 압축을 풀고 우리가 설치한 tomcat폴더 안으로 이동을 시켰다.

이제 수정해야 할 순서는

1. mod_jk.so 설치

2. httpd.conf 수정

3. vhosts.conf 작성

4. workers.properties 작성

5. uriworkermap.properties 작성

이렇게가 아파치에서 할 수정이고

1. tomcat instance 나누기

2. tomcat 시작 스크립트 작성

3. server.xml 파일 수정 (인스턴스 갯수만큼)

4. web.xml 파일 수정 (인스턴스 갯수만큼)

 

이렇게 하면 연동이 끝난다.


1. mod_jk.so 설치

cd /usr/local/tomcat/tomcat-connectors-1.2.48-src/native

./configure --with-apxs=/usr/local/apache2/bin/apxs

make && make install

설치가 잘 됐는지 확인해보려면  find / -name mod_jk.so 명령어를 입력하여 설치된 폴더를 확인해보자.


2. httpd.conf 수정

vim /usr/local/apache2/conf/httpd.conf

Include conf/vhosts.conf
<ifModule jk_module>
        JkWorkersFile conf/workers.properties
        JkMountFile conf/uriworkermap.properties
        JkLogFile logs/mod_jk.log
        JkLogLevel info
        JKMount /* tomcat_lb
        <Location /jkmanager/>
                JkMount jkstatus
                Order deny,allow
                Deny from all
                Allow from 127.0.0.1
                Allow from {해당 ip}
        </Location>
</ifModule>

맨 아래에 추가 ip만 맞게 넣어주면 된다.

 

3. vhosts.conf 작성

vi /usr/local/apache2/conf/vhosts.conf

LoadModule jk_module modules/mod_jk.so
<VirtualHost *:80> 
ServerName localhost
JkUnmount /*.html tomcat_lb
JkMount /* tomcat_lb
</VirtualHost>

4. workers.properties 작성

vim /usr/local/apache2/conf/workers.properties

worker.list=tomcat_lb                 
worker.tomcat_lb.type=lb               
worker.tomcat_lb.balance_workers=tomcat01,tomcat02  

worker.tomcat01.port=8013             
worker.tomcat01.host=localhost         
worker.tomcat01.type=ajp13
worker.tomcat01.lbfactor=1 

worker.tomcat02.port=8014
worker.tomcat02.host=localhost        
worker.tomcat02.type=ajp13              
worker.tomcat02.lbfactor=1

worker.list=jkstatus
worker.jkstatus.type=status

여기서 봐야할 것은 뒤에 만들 server.xml에서 설정할 ajp 포트 번호와 이름이다.

 

5. uriworkermap.properties 작성

vim /usr/local/apache2/conf/uriworkermap.properties

/*.jsp = balancer
/*.do = balancer
/*.json = balancer
/*.js = balancer
/*.css = balancer

아파치 설정은 모두 끝났다.


톰캣 설정

 

1. Tomcat instance 나누기

mkdir /usr/local/tomcat/tomcat_instance01 && mkdir /usr/local/tomcat/tomcat_instance02

인스터스를 2개를 만들기 위해 tomcat안에 instance 폴더를 2개 만들었다.

mv /usr/local/tomcat/conf /usr/local/tomcat/tomcat_instance01/ && mv /usr/local/tomcat/logs /usr/local/tomcat/tomcat_instance01/ && mv /usr/local/tomcat/temp /usr/local/tomcat/tomcat_instance01/
mv /usr/local/tomcat/work /usr/local/tomcat/tomcat_instance01/ && mv /usr/local/tomcat/webapps /usr/local/tomcat/tomcat_instance01/
cp -aurp /usr/local/tomcat/tomcat_instance01/* /usr/local/tomcat/tomcat_instance02/

기본 tomcat 인스턴스를 1번 인스턴스 폴더에 옮기고 1번 인스턴스에 옮긴 폴더들을 2번 인스터스로 복사

 

2. tomcat 시작 스크립트 작성

cd /usr/local/tomcat/bin
vim start_tomcat01.sh
#!/bin/sh
export  CATALINA_HOME=/usr/local/tomcat
export  CATALINA_BASE=/usr/local/tomcat/tomcat_instance01      #인스턴스별로 달리 넣기
export  CATALINA_OPTS="-Denv=product -Denv.servername=server1"
cd $CATALINA_HOME/bin
./startup.sh

톰캣 시작 파일인데 인스턴스 폴더 위치를 잘 확인하고 작성하자.

2번 톰캣인스턴스도 같은 식으로 작성한다.

vim start_tomcat02.sh

#!/bin/sh
export  CATALINA_HOME=/usr/local/tomcat
export  CATALINA_BASE=/usr/local/tomcat/tomcat_instance02
export  CATALINA_OPTS="-Denv=product -Denv.servername=server1"
cd $CATALINA_HOME/bin
./startup.sh

시작하는 파일을 만들었다면 서버를 멈추는 파일도 만들어보자.

vim shutdown_tomcat01.sh

#!/bin/sh
export  CATALINA_HOME=/usr/local/tomcat
export  CATALINA_BASE=/usr/local/tomcat/tomcat_instance01      #인스턴스별로 달리 넣기
export  CATALINA_OPTS="-Denv=product -Denv.servername=server1"
cd $CATALINA_HOME/bin
./shutdown.sh
vim shutdown_tomcat02.sh

#!/bin/sh
export  CATALINA_HOME=/usr/local/tomcat
export  CATALINA_BASE=/usr/local/tomcat/tomcat_instance02      #인스턴스별로 달리 넣기
export  CATALINA_OPTS="-Denv=product -Denv.servername=server1"
cd $CATALINA_HOME/bin
./shutdown.sh

이렇게 start와 shutdown을 각각 2개씩 만들었다면 해당 파일을 실행할 수 있게 권한을 바꾸보자.

chmod +x /usr/local/tomcat/bin/*.sh

3. server.xml 수정

server.xml 역시 인스턴스 각각의 수정이 필요한데 여기서는 앞서 아파치에서 맞춘 그대로 변경해야한다.

vim /usr/local/tomcat/tomcat_instance01/conf/server.xml

<?xml version="1.0" encoding="UTF-8"?>
<Server port="8007" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <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="8083" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <Connector protocol="AJP/1.3" address="0.0.0.0" port="8013" redirectPort="8443" secretRequired="false" />
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat01">
      <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="해당 ip"
                  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"/>
			<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
</Cluster>
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      </Host>
    </Engine>
  </Service>
</Server>

여기서 맞춰야할 부분은 상단에 SHUT DOWN에 적혀잇는 포트번호와 HTTP/1.1에 잇는 포트번호,  AJP/1.3 포트번호, 해당 서버의 ip라고 적혀놓은 부분, 바로 아래 port번호이다. 나머지는 그대로 적어도 괜찮다. 

간단하게 몇가지만 설명하자면 HTTP/1.1에 포트번호가 나중에 위도우에서 ip뒤에 적을 해당 서버의 ip번호이고 AJP/1.3에 적혀잇는 포트번호가 아파치에 인스턴스에 적혀놓은 번호와 일치해야한다.  AJP/1.3 바로 아래 jvmRoute라는 부분이 보이는데 여기 역시 아파치에서 적어놓은 이름과 동일해야한다. 예시에서는 하나의 server.xml을 적어놧지만 인스턴스 각각의 수정이 필요하다. 이 부분은 위에 적어놓은 부분과 비교해가면서 나머지 하나도 작성해보자.

 

4. web.xml 수정

web.xml도 각 인스턴스에 WEB-INF폴더에 들어가보면 찾을 수 있는데 이부분에서 수정해야할 것은

</description>
<distributable/>  <--이부분 추가 위아래는 원래 코드
</web-app>

이 부분이다. 코드 맨 아래로 내려가보면 1번째 코드와 3번째 코드는 이미 존재할 것이고 그 사이에 2번째 줄 코드를 입력하면 된다. 물론 인스턴스 별로 전부다 넣어주어야 한다. 이 부분은 나중에 하나의 톰캣 엔진으로 작동을 하게 되는데 이렇게 해놓지 않으면 톰캣별로 세션이 따로 놀고 공유가 되지 않아서 하나의 서버로 사용할 수 없다.

 

이제 마지막으로 톰캣에서 8083과 8084 포트를 사용할 것이기 때문에 방화벽만 해당 포트를 넣어주기만 하면 된다.

firewall-cmd --permanent --zone=public --add-port=8083/tcp

firewall-cmd --permanent --zone=public --add-port=8084/tcp

이제 하나의 아파치와 두개의 톰캣 인스턴스를 실행해보자.

cd /usr/local/apache2/bin

./httpd -k start

cd /usr/local/tomcat/bin

./start_tomcat01.sh

./start_tomcat02.sh

포트가 열렸는지 확인코드

netstat -nlpt | grep 80

혹시 80, 8083, 8084가 열리지 않앗다면 스타트 스크립트를 두세번 다시 입력해보고 그래도 열리지 않았다면 방화벽을 재시작 해보자.

systemctl restart firewalld

 

윈도우에서 8083, 8084를 열게 되면 톰캣 화면이 열리게 되는데 아파치와 톰캣이 연동이 되었는지 확인을 해보기 위해서 포트번호를 적지 않거나 80포트로 접속해보면 알 수 있다. 이렇게 되면 이전에 아파치만 설치했을때처럼 It's work라는 문구가 나오는게 아니라 톰캣과 연동이 되어 있기 때문에 8083 또는 8084로 연결이 바로 되어 톰캣 화면이 보여야 제대로 연동이 된것이다. 

 

'Linux' 카테고리의 다른 글

Apache tomcat 서버 구축 (3)  (0) 2023.03.12
Apache tomcat 서버 구축 (2)  (0) 2023.03.12
Apache tomcat 서버 구축 (1)  (0) 2023.03.12