하나의 물리 서버에서 여러 도메인(예: aaa.com, bbb.com)을 서비스하기 위해 Apache의
VirtualHost와 Tomcat의 멀티Service구성을 연동하는 방법을 정리합니다. 도메인별로 다른 AJP 포트를 할당하여 요청을 분리하는 것이 핵심입니다.
1. 아키텍처 및 원리 (Context)
설정의 목표는 요청 흐름을 다음과 같이 분리하는 것입니다.
- AAA.test.com (Apache:80) → Worker(aaa) → Tomcat AJP(8009) → Service A
- BBB.test.com (Apache:80) → Worker(bbb) → Tomcat AJP(8010) → Service B
- CCC.test.com (Apache:80) → Worker(ccc) → Tomcat AJP(8011) → Service C
2. Apache 설정 (httpd-vhosts.conf)
가장 먼저 Apache가 들어오는 도메인(ServerName)을 구분하여 적절한 mod_jk 워커에게 토스하도록 설정합니다.
설정 활성화 (httpd.conf)
# 주석 해제하여 vhosts 설정 파일 로드
Include conf/extra/httpd-vhosts.conf
가상 호스트 정의 (httpd-vhosts.conf)
각 도메인별로 VirtualHost 블록을 생성하고 JkMount를 통해 서로 다른 워커 이름을 지정합니다.
# 1. AAA 도메인 설정
<VirtualHost *:80>
ServerName AAA.test.com
DocumentRoot "/WAS/apps/test1"
ErrorLog "logs/aaa-error_log"
CustomLog "logs/aaa-access_log" common
# 워커 'aaa'에게 모든 요청 전달
JkMount /* aaa
</VirtualHost>
# 2. BBB 도메인 설정
<VirtualHost *:80>
ServerName BBB.test.com
DocumentRoot "/WAS/apps/test2"
ErrorLog "logs/bbb-error_log"
CustomLog "logs/bbb-access_log" common
# 워커 'bbb'에게 모든 요청 전달
JkMount /* bbb
</VirtualHost>
# 3. CCC 도메인 설정
<VirtualHost *:80>
ServerName CCC.test.com
DocumentRoot "/WAS/apps/test3"
ErrorLog "logs/ccc-error_log"
CustomLog "logs/ccc-access_log" common
# 워커 'ccc'에게 모든 요청 전달
JkMount /* ccc
</VirtualHost>
3. mod_jk 워커 설정 (workers.properties)
Apache에서 지정한 워커 이름(aaa, bbb, ccc)이 실제로 통신할 Tomcat의 AJP 포트를 정의합니다.
# 워커 리스트 정의
worker.list=aaa,bbb,ccc
# [aaa] 워커 정의 (기본 포트 8009)
worker.aaa.port=8009
worker.aaa.host=localhost
worker.aaa.type=ajp13
# [bbb] 워커 정의 (포트 8010)
worker.bbb.port=8010
worker.bbb.host=localhost
worker.bbb.type=ajp13
# [ccc] 워커 정의 (포트 8011)
worker.ccc.port=8011
worker.ccc.host=localhost
worker.ccc.type=ajp13
4. Tomcat 설정 (server.xml)
Tomcat 하나에서 여러 포트를 리슨하기 위해 <Service> 태그를 복제하여 구성합니다. 각 서비스마다 포트(HTTP, HTTPS, AJP)가 겹치지 않도록 주의해야 합니다.
서비스 A (AAA) 설정
<Service name="CatalinaA">
<!-- HTTP Port: 8080 -->
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<!-- AJP Port: 8009 (workers.properties의 aaa와 매핑) -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="CatalinaA" defaultHost="localhost">
<Host name="localhost" appBase="/WAS/apps/aaa" unpackWARs="true" autoDeploy="true">
<Context path="" docBase="." reloadable="true"/>
</Host>
</Engine>
</Service>
서비스 B (BBB) 설정
<Service name="CatalinaB">
<!-- HTTP Port: 8081 (충돌 방지) -->
<Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8444" />
<!-- AJP Port: 8010 (workers.properties의 bbb와 매핑) -->
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="CatalinaB" defaultHost="localhost">
<Host name="localhost" appBase="/WAS/apps/bbb" unpackWARs="true" autoDeploy="true">
<Context path="" docBase="." reloadable="true"/>
</Host>
</Engine>
</Service>
서비스 C (CCC) 설정
<Service name="CatalinaC">
<!-- HTTP Port: 8082 (충돌 방지) -->
<Connector port="8082" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8445" />
<!-- AJP Port: 8011 (workers.properties의 ccc와 매핑) -->
<Connector port="8011" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="CatalinaC" defaultHost="localhost">
<Host name="localhost" appBase="/WAS/apps/ccc" unpackWARs="true" autoDeploy="true">
<Context path="" docBase="." reloadable="true"/>
</Host>
</Engine>
</Service>
Tip (docBase 설정):
예:
appBase와 Context docBase 설정이 꼬일 경우 404 에러가 발생할 수 있습니다. 가장 확실한 방법은 docBase에 절대 경로를 명시하는 것입니다.예:
docBase="/WAS/apps/ccc"
5. 검증 및 테스트
- Tomcat 재기동:
server.xml수정 후 재기동.netstat -anotp | grep java # 8009, 8010, 8011 포트가 모두 LISTEN 상태인지 확인 - Apache 재기동: 설정 적용.
./apachectl restart - 브라우저 접속: 각 도메인으로 접속하여 서로 다른 페이지가 뜨는지 확인합니다.