[Tomcat] 아파치-톰캣 연동

참고 문서

테스트 환경

  • apache 2.4.20
  • tomcat 8.x

전제 조건

  • 아파치와 톰캣은 설치되어 있다 가정.
  • 두 개의 호스트를 각각의 WAS로 구동(하나의 아파치에 톰캣 둘)

TODO mod_jk.so 설치방법 추가

TODO VirtualHost 설정방법 추가

Apache Tomcat Connectors

우선 JK 모듈이 필요한데 JK 모듈은 The Apache Tomcat Connectors를 지칭하는 말로 아파치-톰캣 연동에 필요한 모듈이며 AJP로 통신한다.

mod_jk.so를 아파치설치경로/modules 아래에 위치시킨다. mod_jk.so는 OS에 따라 적합한 파일이 다르다. 리눅스 환경이라면 컴파일을 직접 해야 할 수도 있다. 만약 아파치 구동 중 'invalid ELF header' 에러가 발생하면 mod_jk.so가 뭔가 잘못된것이다. (컴파일 버전이 다르다던지)

JK 모듈 설치를 완료했으면 /httpd/conf/httpd.conf에 다음을 추가한다:

httpd.conf

Listen 80

Include conf.modules.d/*.conf

# 아래를 추가
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel info
JkMount /bo/* worker1
JkMount /* worker2

JkMount는 요청을 처리할 WAS를 의미하는데 위의 경우 요청된 주소의 PATH가 /bo/로 시작하면 worker1에, 그 외 모든 주소는 worker2에 포워딩 된다. JkMount 설정이 여러 개 있을때는 상단에 있는 것이 우선순위가 높다.

현재까진 JkMount로 명시한 worker1과 worker2를 찾을 수 없다. 따라서 /httpd/conf/workers.properties를 다음처럼 작성한다:

workers.properties

# HTTPD Web Server and Apache Tomcat(ajp) Connector
# the loadbalancer configuration of the Server
#
# Include workers.properties by conf/extra/httpd-modjk.conf
#
# Define loadbalancer 2 worker node using ajp13
# admin Cluster Group 1 #############################################
#
# configuration template
worker.template.type=ajp13
#worker.template.lbfactor=1
#worker.template.socket_timeout=30
#worker.template.socket_keepalive=true
#worker.template.recovery_options=7
#worker.template.ping_mode=A
#worker.template.ping_timeout=10000
#worker.template.connection_pool_size=25
#worker.template.connection_pool_minsize=25
#worker.template.connection_pool_timeout=60

worker.list=worker1, worker2

worker.worker1.reference=worker.template
worker.worker1.port=8009
worker.worker1.host=localhost

worker.worker2.reference=worker.template
worker.worker2.port=8010
worker.worker2.host=localhost

#worker.wlb.type=lb
#worker.wlb.retries=2
#worker.wlb.method=Session
#worker.wlb.sticky_session=True
#worker.wlb.balance_workers=worker1, worker2

각 톰캣의 톰캣설치경로/conf/server.xml의 설정을 다음처럼 수정한다:

server.xml

bo(worker1)

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>
<!-- 생략 -->
<Context docBase="back-web" path="/bo" reloadable="false"/>

fo(worker2)

<Connector port="8010" protocol="AJP/1.3" redirectPort="8443"/>
<!-- 생략 -->
<Context docBase="front-web" path="/" reloadable="false"/>

여기서 docBase는 톰캣의 webapps 아래에 위치한 폴더 혹은 WAR파일을 말한다.

서버 기동

아파치

httpd -k start

이 때 필요한 경우 서비스(리눅스는 데몬) 이름을 지정할 수 있다:

httpd -k install -n second-apache
httpd -k start -n second-apache

이름 지정은 여러 인스턴스를 실행해야 할 때 사용함.

톰캣

startup.bat  # 혹은 startup.sh

에러 없이 성공하면 아래 주소로 테스트:

  • http://localhost/bo/
  • http://localhost

VirtualHost

하나의 아파치에서 도메인에 따라 서비스를 분리할 때 사용하는 모듈. 일단 아래처럼만 해도 돌아감. 자세한건 나중에 정리

LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel info

<virtualhost *:80>
    ServerName bo.test.com
    DocumentRoot /home/user1/was/bo/webapps/back-web/
    JkMount /* worker1
</virtualhost>

<virtualhost *:80>
    ServerName fo.test.com
    DocumentRoot /home/user1/was/fo/webapps/front-web/
    JkMount /* worker2
</virtualhost>

hosts 설정하고 아래 주소로 테스트:

  • http://bo.test.com
  • http://fo.test.com
Configuring Apache to serve static web application files

If the Tomcat Host appBase (webapps) directory is accessible by the Apache web server, Apache can be configured to serve web application context directory static files instead of passing the request to Tomcat.


Caution: For security reasons it is strongly recommended that JkMount is used to pass all requests to Tomcat by default and JkUnMount is used to explicitly exclude static content to be served by httpd. It should also be noted that content served by httpd will bypass any security constraints defined in the application's web.xml.

Use Apache's Alias directive to map a single web application context directory into Apache's document space for a VirtualHost:

# Static files in the examples webapp are served by apache
Alias /examples /vat/tomcat3/webapps/examples

# All requests go to worker1 by default
JkMount /* worker1

# Serve html, jpg and gif using httpd
JkUnMount /*.html worker1
JkUnMount /*.jpg  worker1
JkUnMount /*.gif  worker1