동일한 서버에서 Apache - Tomcat 연동하기


아래 내용은 다음의 상황에서 진행된 내용이다. apache2와 tomcat8, openjdk-8-jre-headless, openjdk-8-jdk 등이 이미 설치되어 있다고 가정한다.

-. Ubuntu 16.04

-. Apache 2.4

-. Tomcat 8.0


서버에 PHP와 JSP 모두를 개발하고 실행할수 있는 환경을 구축하고자 한다. 이 경우 우선적으로 문제가 되는 것은 apache의 경우는 80포트를 기본으로 사용하고 tomcat의 경우는 8080 포트를 기본으로 사용한다.

따라서 동일 서버상에서 80으로 접속해 오는 경우들에 대해서 상황에 맞게 때로는 apache를 통해 php, html 등을 실행시키고 혹은 tomcat을 통해 jsp를 실행하도록 할려면 Apache와 Tomcat을 연동하도록 해야한다.

그 외에 부하를 분산시키는 등의 잇점들이 있을 것이다. 


우선 다음과 같은 시나리오로 진행될 것이다.

 -. joekog.iptime.org에 대한 apache 가상 호스트를 생성해서 해당 도메인에 대한 php에 대한 웹 서비스를 처리하도록 할 것이다

 -. joekog.iptime.org에 대한 tomcat 가상 호스트를 생성해서 해당 도메인에 대한 jsp 웹 서비스를 처리하도록 할 것이다.

 -. joekog.iptime.org에 대한 apache와 tomcat이 처리할 웹 루트 경로는 /home/joekog/www/ROOT/가 될 것이다.

 -. /home/joekog/www/ROOT/ 아래에 .html, .php, .jsp 파일들이 위치해 있을 것이고 웹브라우저에서 http://joekog.iptime.org로 접속할 때 /home/joekog/www/ROOT/ 아래에 있는 .html, .php, .jsp 파일들이 실행될 것이다. 적절히 apache와 tomcat이 알아서 실행하게 될 것이다.

 -. IpTIME의 DDNS 기능을 이용하여 joekog.iptime.org라는 도메인을 생성해서 위의 내용을 테스트 할 것이다.


이상의 내용을 위해 다음의 내용을 사전에 알고 있어야 한다.

 -. apache 가상 호스트(Virtual Host) 생성하는 법 및 IpTIME DDNS 생성하는 법 : 여기를 참조

 -. tomcat 가상 호스트 생성하는 법 : 여기를 참조


우선 Ubuntu 터미널 창에서 root로 로그인 한 후 apache와 tomcat의 연동을 위한 다음 모듈을 설치한다.


# apt-get install libapache2-mod-jk


위의 파일을 설치하면 다음과 같은 경로와 파일이 생성이 된다.


/etc/libapache2-mod-jk/workers.properties


이 파일에서 3가지를 현재의 서버 환경에 맞게 설정해 주면 된다. 나머지는 디폴트 상태로 두면 된다.

 -. tomcat home 디렉토리

 -. java home 디렉토리

 -. 톰캣이 맡아서 처리할 내용을 아파치가 톰캣에게 넘기기 위해 톰캣을 지칭하기 위한 이름


workers.properties를 열어서 아래의 내용을 찾아서 해당하는 환경 정보를 입력해 준다.


workers.tomcat_home=①

workers.java_home=②

worker.list=③


① tomcat 홈 디렉토리를 찾을려면 아래 명령을 실행하면 아래와 같은 정보가 보일 텐데 여기서 CATALINA_HOME의 경로인 /usr/share/tomcat8가 tomcat의 홈 디렉토리 경로가 된다.


# /usr/share/tomcat8/bin/version.sh


Using CATALINA_BASE:   /usr/share/tomcat8

Using CATALINA_HOME:   /usr/share/tomcat8

Using CATALINA_TMPDIR: /usr/share/tomcat8/temp

Using JRE_HOME:        /usr

Using CLASSPATH:       /usr/share/tomcat8/bin/bootstrap.jar:/usr/share/tomcat8/bin/tomcat-juli.jar

Server version: Apache Tomcat/8.0.32 (Ubuntu)

Server built:   Sep 27 2017 21:23:18 UTC

Server number:  8.0.32.0

OS Name:        Linux

OS Version:     4.13.0-43-generic

Architecture:   amd64

JVM Version:    1.8.0_171-8u171-b11-0ubuntu0.16.04.1-b11

JVM Vendor:     Oracle Corporation


② java 홈 디렉토리를 찾기위해서는 다음 명령을 실행하면 


# find / -name '*-openjdk-*'


/usr/share/gdb/auto-load/usr/lib/jvm/java-8-openjdk-amd64

/usr/lib/jvm/java-1.8.0-openjdk-amd64

/usr/lib/jvm/.java-1.8.0-openjdk-amd64.jinfo

/usr/lib/jvm/java-8-openjdk-amd64

/usr/lib/debug/usr/lib/jvm/java-1.8.0-openjdk-amd64


여기서 /usr/lib/jvm/java-8-openjdk-amd64가 java의 홈 디렉토리이다. cd 명령으로  /usr/lib/jvm/ 이 위치로 가서 ls -l을 해 보면 다음과 같은 정보가 보일 것이다. java-8-openjdk-amd64가 디렉토리임을 알수 있다. 따라서 java 홈 디렉토리는 /usr/lib/jvm/java-8-openjdk-amd64가 되는 것이다.


-rw-r--r--   1 root root 2600  4월 28 03:42 .java-1.8.0-openjdk-amd64.jinfo

lrwxrwxrwx   1 root root   20  4월 28 03:42 java-1.8.0-openjdk-amd64 -> java-8-openjdk-amd64/

drwxr-xr-x   7 root root 4096  5월 11 15:56 java-8-openjdk-amd64/


③은 apache 웹 서버가 톰캣에게 실행을 넘길 때 톰캣을 지칭할 이름이다. 이 이름은 임의로 원하는대로 수정을 하면되는데 기본적으로는 ajp13_worker로 되어 있다. 이 이름을 그대로 사용한다면 여기까지가 workers.properties에 대한 설정 작업은 끝났다. 그러면 다음과 같은 형태가 될 것이다.


workers.tomcat_home=/usr/share/tomcat8

workers.java_home=/usr/lib/jvm/java-8-openjdk-amd64

worker.list=ajp13_worker


그런데 만일 ajp13_worker를 임의의 이름으로 변경한다면 workers.properties에서 ajp13_worker라는 이름도 모두 바꾸어 주어야 한다. 예를 들어 아래에서 ajp13_worker를 임의로 변경한 이름과 동일한 이름으로 고쳐주어야 한다.


worker.ajp13_worker.port=8009 

worker.ajp13_worker.host=localhost ⇒ 톰캣이 설치되어 있는 곳의 IP이다.

worker.ajp13_worker.type=ajp13


이제 apache 가상 호스트를 위한 설정을 할 차례이다. 

/etc/apache2/sites-available으로 이동해서 000-default.conf를 여기서 사용하게 될 도메인 이름으로 복사본을 만들고 필요한 환경설정을 한다. 아래와 같이


# cp 000-default.conf  joekog.iptime.org.conf

# vi joekog.iptime.org.conf


위 파일을 열어서 아래의 내용을 찾아 위에서 가정했던 해당 정보대로 입력한다.


      9         ServerName joekog.iptime.org 

     10 

     11         ServerAdmin webmaster@localhost

     12         DocumentRoot /home/joekog/www/ROOT


     20         ErrorLog ${APACHE_LOG_DIR}/joekog.iptime.org-error.log

     21         CustomLog ${APACHE_LOG_DIR}/joekog.iptime.org-access.log combined


그리고 이 파일의 끝 부분 </VirtualHost> 위에 다음 내용을 작성해서 jsp에 대해서는 tomcat(위에서 별칭으로 정한 ajp13_worker)이 처리한다는 것을 명시한다.


         JKMount /* ajp13_worker

</VirtualHost>


여기서 JKMount /* ajp13_worker로 표현한 것은 현재의 웹 root(/home/joekog/www/ROOT/) 아래에 있는 모든 파일을 ajp13_worker(톰캣)이 담당하게 된다는 뜻이다.

그런데 이 웹 root상에 .php가 있다면 이 파일도 톰캣이 담당하게 될텐데 톰캣은 php를 실행할수가 없게 된다. 따라서 php 소스 자체를 웹 브라우저에 출력하게 될 것이다.

그런데 만일 JKMount /*.jsp ajp13_worker로 한다면 .jsp 파일만 톰캣이 맡고 나머지는 아파치가 실행하게 되므로 동일 웹 루트상에 .php가 있더라도 정상적으로 php를 실행한 결과를 보여주게 될 것이다.

그런데 문제는 JKMount /*.jsp ajp13_worker 이렇게 하게되면 .jsp, .php, .html이 정상적으로 실행이 되지만 Java Servlet은 이 상태에서는 실행할수 없게 된다.

따라서 jsp와 php가 같은 경로상에서 실행되어야 할 경우는 없을 것이므로 JKMount /* ajp13_worker로 설정해서 .jsp와 Java Servlet도 정상적으로 실행되게 설정하면 될것이다.

참고로 Java Servlet의 .class 파일이 위치하는 경로는 웹 root 아래 /WEB-INF/classes/해당패키지명/ 아래에 위치하게 된다. 만일 해당 서블릿의 패키지 명이 com.joe.test라고 한다면 /WEB-INF/classes/com/joe/test/ 이 위치에 *.class 파일이 위치하게 될 것이다.


다음으로 할 것은 apache의 가상 호스트 설정에 대한 설정을 해 주어야 한다. 


# vi /etc/apache2/apache2.conf


아래 파일을 열어서 다음 내용을 추가해 준다.


    182 <Directory /home/joekog/www/ROOT/>

    183         Options FollowSymLinks

    184         AllowOverride None

    185         Require all granted 

    186 </Directory>


이제 톰캣에 대한 설정을 할 차례이다. 아래 파일을 열어서 


<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> 이 부분이 주석되어 있다면 주석을 해제하고 내용이 없다면 이 내용을 추가해준다.


# /etc/tomcat8/server.xml


이상을 작업을 하면 apache와 톰캣에서의 연동을 위한 설정은 끝이 났다. 그런데 여기서 우리는 joekog.iptime.org/joe.php라는 도메인으로 접속시 apahce를 통해 /home/joekog/www/ROOT/ 이 경로에 있는 joe.php를 실행할 것이고 동일하게  joekog.iptime.org/hi.jsp로 접속시에는 tomcat을 통해서 /home/joekog/www/ROOT/ 이 경로에 있는 hi.jsp를 실행해야 하므로 아파치 뿐만 아니라 톰캣에 대해서도 가상 호스트(Virtual Host)를 설정해 주어야 한다. 위의 server.xml을 열어서 아래 내용을 기존에 있던 <Host name... </Host> 아래 적당한 곳에 추가해 준다.


    161       <Host name="joekog.iptime.org"  appBase="/home/joekog/www"

    162             unpackWARs="true" autoDeploy="true">

    163 

    164         <!-- SingleSignOn valve, share authentication between web applications

    165              Documentation at: /docs/config/valve.html -->

    166         <!--

    167         <Valve className="org.apache.catalina.authenticator.SingleSignOn" />

    168         -->

    169 

    170         <!-- Access log processes all example.

    171              Documentation at: /docs/config/valve.html

    172              Note: The pattern used is equivalent to using pattern="common" -->

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

    174                prefix="joekog.iptime.org_access_log" suffix=".txt"

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

    176       </Host>


이제 아파치와 톰캣을 재시작한다.


# service apache2 restart

# service tomcat8 restart


그리고 /home/joekog/www/ROOT/ 이 경로에 index.html, hi.jsp, joe.php 파일을 적당한 내용으로 작성해서 웹 브라우저에서 접속해 본다.


http://joekog.iptime.org/hi.jsp

http://joekog.iptime.org/joe.php

http://joekog.iptime.org/index.html


이제 톰캣의 기본 포트인 8080 없이 웹 브라우저에서 접속해서 필요를 따라 혹은 apache 혹은 tomcat이 실행되어 위의 3종류의 파일이 정상적으로 실행되고 웹 브라우저에서 보이게 될 것이다.

Apache - Tomcat의 연동과 Apache Virtual Host, Tomcat Virtual Host 등이 같이 엮이어 돌아가야 되는 상황이라 사실상 처음 하는 사람에게는 많이 복잡한 내용이다.

이상으로 아파치 톰캣 연동을 마무리하게 되었다. 휴~;;;



+ Recent posts