우와... 난 처음 글을 쓰는 거라고 생각했는데, 약 15년 전에 tomcat5 를 가지고 연동했던 글이 있네. 그 동안 아파치는 10년이 지나도록 apache3 도 내지 않고 있고...ㅋ
이렇게 사용하는 이유?는 성능을 위해서 일 수도 있겠고, 리소스 중복 줄이기나, 아파치의 특정 기능을 반드시 사용해야 하거나... 하겠지만, WAS 에서 인스턴스를 1개 정도만 사용한다면 글쎄... jmeter 등으로 테스트 해보고 결정하라. 인스턴스가 여러 개이고 동일한 정적 리소스를 사용한다면, 또 그 양이 방대하다면 리소스 중복을 줄일 수 있다는 이유로 apache 를 사용해 볼 만하다. 아니면 .htaccess? 아니면 php 랑 같이 쓴다던가. 아무튼... 이런저런 이유로 이 둘을 연동해야 한다면 해 봐야지.
테스트 환경 : CentOS 7 / Apache 2.4 / Tomcat 8.5 (instance1~3)
테스트 목표 : http://serverIP 80포트로 각 인스턴스에 AJP 통신 확인.(로드밸런싱 용도 아님)
1. Tomcat server.xml 설정
(Apache / Tomcat 이 설치되어 있다고 가정)
$ vi /app/tomcat/instance1/conf/server.xml
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector protocol="AJP/1.3"
address="::1"
port="8009"
secretRequired="false"
redirectPort="8443" />
server.xml 에 AJP 관련 요소를 수정해야 한다. AJP(Apache JServ Protocol)은 웹서버와 WAS 간에 통신이 가능한 프로토콜이다. 우선 주석을 해제하고 인스턴스 별로 ajp port 와 https redirectPort 를 지정한다. secretRequired="false" 를 지정하지 않으면 아래의 에러를 만나게 된다.
Caused by: java.lang.IllegalArgumentException: The AJP Connector is configured with secretRequired="true" but the secret attribute is either null or "". This combination is not valid.
2. Tomcat Connectors (mod_jk) 설치
의존 라이브러리 설치
# yum install gcc gcc-c++ httpd-devel
Download : https://tomcat.apache.org/download-connectors.cgi
$ cd /usr/local/src
$ wget https://mirror.navercorp.com/apache/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.48-src.tar.gz
$ tar zxvf tomcat-connectors-1.2.48-src.tar.gz
$ cd tomcat-connectors-1.2.48-src/native/
$ ./configure --with-apxs=/usr/bin/apxs
$ make
$ make install
서버의 apxs 경로 확인 후 올바르게 입력
3. mod_jk 설정
apache 버전마다 설정은 조금씩 다르니 httpd.conf 파일 참고.
$ vi /etc/httpd/conf.modules.d/00-jk.conf
LoadModule jk_module modules/mod_jk.so
$ vi /etc/httpd/conf.d/mod_jk.conf
<IfModule jk_module>
JkWorkersFile conf.d/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel debug
JkShmFile run/mod_jk.shm
JkMountFile conf.d/uriworkermap.properties
</IfModule>
4. workers.properties 추가
3개의 Tomcat 인스턴스가 있다고 가정하고 각 인스턴스의 이름과 포트 설정.
$ vi /etc/httpd/conf.d/workers.properties
worker.list=tomcat1, tomcat2, tomcat3
worker.tomcat1.type=ajp13
worker.tomcat1.port=8109
worker.tomcat1.host=localhost
worker.tomcat2.type=ajp13
worker.tomcat2.port=8209
worker.tomcat2.host=localhost
worker.tomcat3.type=ajp13
worker.tomcat3.port=8309
worker.tomcat3.host=localhost
5. uriworkermap.properties
uri 에 매칭되는 workers.properties 의 worker 인스턴스로 ajp 통신. 해당하지 않는 uri 는 apache 디렉토리에서 매칭.
/=tomcat1
/instance2/*=tomcat2
/instance3/*=tomcat3
6. 톰캣 웹사이트 고양이 복사
$ mkdir -p /app/tomcat/instance2/webapps/ROOT/instance2
$ mkdir -p /app/tomcat/instance3/webapps/ROOT/instance3
$ cp /app/tomcat/instance1/webapps/ROOT/*.* /app/tomcat/instance2/webapps/ROOT/instance2
$ cp /app/tomcat/instance1/webapps/ROOT/*.* /app/tomcat/instance2/webapps/ROOT/instance3
7. SELinux 에 AJP 포트 추가
SELinux 정책에 의해 AJP 연결이 추가로 필요할 경우, 해당 IP 를 추가한다.
(/etc/selinux/config 파일에 SELINUX 설정을 변경하는 것은 추천하지 않는다.)
# semanage port -a -t http_port_t -p tcp 8109
# semanage port -a -t http_port_t -p tcp 8209
# semanage port -a -t http_port_t -p tcp 8309
# semanage port -l | grep http_port_t
http_port_t tcp 8309, 8209, 8109, 80, 81, 443, 488, 8008, 8009, 8443, 9000
semanage 명령어가 없을 경우, policycoreutils-python 설치
# yum install policycoreutils-python
8. Web Server / WAS 재구동 후 연동 확인
http://serverIP
http://serverIP/instance2/
http://serverIP/instance3/
WRITTEN BY
- 손가락귀신
정신 못차리면, 벌 받는다.