아파치와 톰캣

일반적으로 아파치는 정적 파일( img, css, js )등을 응답 및 보안 역할을 할 목적으로 앞단에 배치하고, 톰캣에 실제 애플리케이션이 존재하여 아파치와 다른 port를 열어서 아파치와 연결합니다.

( 아파치와 톰캣을 예로 든, 웹 서버와 WAS의 차이에 대해서는 여기를 참고해주세요 )


이번 글에서는 톰캣 위에서 돌아가는 애플리케이션을 실행하기 위해, 아파치를 앞단에 두고 8080포트로 톰캣과 연결하는 구조로 아파치와 톰캣을 연동하려 합니다.

그러기 위해서는 서버에 Apache와 Tomcat이 설치되어 있어야 합니다.

( Apaceh2.0.64 설치 - 링크    /    Tomcat8.0.52 설치 - 링크 )




1. 의존성 설치

# yum install -y perl




2. mod_jk 모듈 설치



아파치와 톰캣을 연동하기 위해서는 mod-jk 모듈이 필요합니다.

mod_jk 모듈은 AJP 프로토콜( Apache Jserv Protocol)을 사용하여 아파치와 톰캣을 연동하는 플러그인입니다.

AJP 프로토콜은 웹 서버 뒤에 있는 애플리케이션 서버로부터 웹 서버로 들어오는 요청을 위임할 수 있는 바이너리 프로토콜이며, 주로 로드밸런싱에 사용됩니다.


mod_jk 모듈은 여기에서 다운받을 수 있습니다.
mod_jk.tar.gz 파일을 다운 받고 압축을 해제해서, 빌드를 하여 설치를 합니다.

# wget http://apache.tt.co.kr/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.43-src.tar.gz # tar xvfz tomcat-connectors-1.2.43-src.tar.gz # cd tomcat-connectors-1.2.43-src/native # ./configure --with-apxs=/usr/local/victolee/apache2.0.64/bin/apxs

# make

# make install


# ls -l /usr/local/victolee/apache2.0.64/modules


** 오류 해결


위와 같이 need to check for Perl first, ... You must specify a valid --with-apxs path 에러가 발생하면, perl을 찾을 수 없다는 뜻입니다.

이를 해결하기 위해서는 /usr/local/victolee/apache2.4.33/bin/apxs 파일을 열어서 맨 첫 줄을 아래와 같이 수정 합니다.

# vi /usr/local/victolee/apache2.4.33/bin/apxs

#!/replace/with/path/to/perl/interpreter -w     => #! /usr/bin/perl -w



설치가 잘 되었다면 modules 디렉터리에 mod_jk.so 파일이 생성될 것입니다.





2. tomcat에서 8009 포트 확인

아파치에서 AJP 프로토콜로 톰캣에 접근하는 포트는 8009이므로, 톰캣의 server.xml 파일에서 이를 확인합니다.

# vi /usr/local/victolee/tomcat8.0.52/conf/server.xml

( AJP를 검색하여 포트가 8009인지 확인합니다. )

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





3. 아파치 worker  설정

worker란 간단하게, 톰캣의 포트와 연결하는 역할을 한다고 생각하면 됩니다.

톰캣에는 여러 애플리케이션이 존재할 수 있고, 이를 가상 호스트로 관리할 수가 있는데 그 때 worker를 사용합니다.


worker의 설정은 아파치의 conf 디렉터리 안에 workers.properties 파일을 생성하고 아래와 같이 작성합니다.

# vi /usr/local/victolee/apache2.0.64/conf/workers.properties

worker.list=worker1 worker.worker1.type=ajp13 # AJP1.3 프로토콜을 사용 worker.worker1.host=localhost # 톰캣은 local에서 돌고 있습니다. worker.worker1.port=8009         # 연결할 톰캣의 포트 번호





4. 아파치와 톰캣 연동

아파치와 톰캣 연동을 위한 준비 작업을 마쳤으므로 이제 본격적으로 아파치와 톰캣을 연동해보겠습니다.

아파치 환경 설정 파일인 httpd.conf 파일에서 아래의 내용을 추가합니다.

# vi /usr/local/victolee/apache2.0.64/conf/httpd.conf

( LoadMoudle를 검색하여 맨 마지막에 모듈을 추가 ( line : 268 ) ) LoadModule jk_module modules/mod_jk.so ( 파일 맨 아래에 추가 ( shift + g ) ) # tomcat connection <IfModule mod_jk.c> JkWorkersFile /usr/local/victolee/apache2.0.64/conf/workers.properties JkLogFile /usr/local/victolee/apache2.0.64/logs/mod_jk.log JkLogLevel info JkLogStampFormat "[%a %b %d %H:%M:%S %Y] JkShmFile /usr/local/victolee/apache2.0.64/logs/mod_jk.shm JkMount /*.jsp worker1 </IfModule>

톰캣과 연결하기 위한 설정의 내용의 의미는 다음과 같습니다.

<IfModule mod_jk.c >  : 아파치에 mod_jk 모듈이 올라와 있으면 아래 내용을 실행하라는 의미

JkLogFile          : 로그 파일

JkLogLevel          : 로그 남길 레벨

JkLogStampFormat   : 로그를 남기는 포맷

JkShmFile          : 공유 파일

JkMount          : /*.jsp 파일은 worker1에게 넘기겠다.





5. 테스트

아파치 설정을 수정했으니 아파치를 재시작합니다.

# /usr/local/victolee/apache2.0.64/bin/apachectl stop

# /usr/local/victolee/apache2.0.64/bin/apachectl start


이제 브라우저에서 IP주소:8080( 저 같은 경우는 http://192.168.245.132:8080 )으로 접속해보시면 톰캣 페이지가 출력이 될 것입니다.

이 요청은 톰캣에 직접 요청을 한 것입니다.


이번에는 index.jsp 파일을 요청하기 위해 80포트로 접속해보겠습니다. ( 저 같은 경우는 http://192.168.245.132/index.jsp )

그러면 보시는 바와 같이 톰캣 페이지가 응답이 되지만, CSS, image 등이 제외된 상태로 HTML 문서만 응답이 됩니다.


그 이유는 아파치 환경 설정에서 tomcat connection 에서 설정한 JkMount 옵션 때문입니다.

.jsp 파일만 worker가 처리하도록 보냈기 때문에, 정적 파일들은 아파치에서 응답해야 합니다.

하지만 아파치에는 톰캣 페이지에서 제공해야 하는 정적 파일들이 없기 때문에 톰캣에서 받아온 HTML 문서만 응답할 수 밖에 없습니다.


이로 미루어 보아, worker를 통해 아파치가 톰캣으로부터 jsp파일만 가져온 것을 확인할 수 있습니다.

즉 아파치와 톰캣이 연동된 것입니다.




간단한 애플리케이션이 있다면 worker를 수정해서 80포트로 접근했을 때 애플리케이션을 응답할 수 있도록 설정할 수 있습니다.

Tomcat Manager에서 웹 애플리케이션을 deploy 했을 때, 그 이름을 example이라고 하겠습니다.

( Tomcat Manager로 deploy 하는 방법은 여기를 참고해주세요 )

그러면 JkMount를 다음과 같이 수정해서 웹 애플리케이션이 아파치와 연동되서 실행될 수 있습니다.

# vi /usr/local/victolee/apache2.0.64/conf/httpd.conf

( Tomcat connection 부분의 JkMount를 아래와 같이 수정합니다. )

JkMount /example/* worker1


다시 아파치를 재시작 하고,

# /usr/local/victolee/apache2.0.64/bin/apachectl stop

# /usr/local/victolee/apache2.0.64/bin/apachectl start

브라우저에서 IP주소/프로젝트이름 ( 저 같은 경우는, http://192.168.245.132/example/~~ )에 접속해봅니다.




이상으로 아파치와 톰캣을 연동을 해보았습니다.