APM과 Tomcat을 연동하는 방법은 무엇인가요?
💡 요약 정리
- Apache와 Tomcat을 mod_jk로 연동하여 JSP를 처리합니다.
- JDK 설치 후 JAVA_HOME 환경변수를 설정합니다.
- Tomcat 설치 후 CATALINA_HOME 환경변수를 설정합니다.
- mod_jk 모듈을 컴파일하여 Apache에 추가합니다.
- workers.properties에서 Tomcat worker를 정의합니다.
- httpd.conf에서 JkMount로 JSP 요청을 Tomcat으로 전달합니다.
설치환경
| 항목 | 버전/경로 |
|---|---|
| OS | CentOS 5.x (64bit) |
| Apache | 2.2.34 |
| PHP | 5.2.17 |
| MySQL | 5.1.59 |
| APM 설치 경로 | /home/APM |
| JDK | 7u15 |
| JDK 설치 경로 | /home/APM/java |
| Tomcat | 7.0.37 |
| Tomcat 설치 경로 | /home/APM/tomcat |
전제 조건:
- APM(Apache, PHP, MySQL)이 이미 설치되어 있어야 합니다.
개요
APM과 Tomcat 연동 구조
[Client]
↓
[Apache Web Server] (Port 80)
↓ (mod_jk - AJP Protocol)
[Tomcat Server] (Port 8009 AJP)
↓
[Java Application (JSP/Servlet)]
↓
[MySQL Database]
역할 분 담
- Apache: 정적 파일(HTML, CSS, JS, 이미지) 처리 및 PHP 실행
- Tomcat: 동적 Java 컨텐츠(JSP, Servlet) 처리
- mod_jk: Apache와 Tomcat 간 통신 모듈 (AJP 프로토콜)
장점
- Apache의 높은 성능과 Tomcat의 Java 지원을 동시에 활용
- 정적/동적 컨텐츠를 효율적으로 분리 처리
- 로드 밸런싱 및 세션 클러스터링 가능
1. JDK 설치
1.1 JDK 다운로드
Oracle JDK 다운로드:
다운로드 파일:
jdk-7u15-linux-x64.tar.gz
1.2 JDK 압축 해제 및 설치
[root@cafe24 src]# tar zxvf jdk-7u15-linux-x64.tar.gz
[root@cafe24 src]# mv jdk1.7.0_15 /home/APM/java
1.3 환경변수 설정
/etc/profile 편집:
vi /etc/profile
파일 하단에 추가:
# Java Environment
JAVA_HOME=/home/APM/java
PATH="$JAVA_HOME/bin:$PATH"
export JAVA_HOME
환경변수 적용:
source /etc/profile
1.4 JDK 설치 확인
# Java 버전 확인
java -version
# 출력 예
java version "1.7.0_15"
Java(TM) SE Runtime Environment (build 1.7.0_15-b03)
Java HotSpot(TM) 64-Bit Server VM (build 23.7-b01, mixed mode)
# JAVA_HOME 확인
echo $JAVA_HOME
/home/APM/java
# javac 컴파일러 확인
javac -version
javac 1.7.0_15
2. Tomcat 설치
2.1 Tomcat 다운로드
Apache Tomcat 다운로드:
- URL: http://tomcat.apache.org
- Binary Distributions 선택
다운로드 파일:
apache-tomcat-7.0.37.tar.gz(Core Binary)
2.2 Tomcat 압축 해제 및 설치
[root@cafe24 src]# tar zxvf apache-tomcat-7.0.37.tar.gz
[root@cafe24 src]# mv apache-tomcat-7.0.37 /home/APM/tomcat
2.3 Tomcat 환경변수 설정
/etc/profile 편집:
vi /etc/profile
JAVA_HOME 아래에 추가:
# Java Environment
JAVA_HOME=/home/APM/java
PATH="$JAVA_HOME/bin:$PATH"
export JAVA_HOME
# Tomcat Environment
CATALINA_HOME=/home/APM/tomcat
PATH=$CATALINA_HOME/bin:$PATH
export CATALINA_HOME
환경변수 적용:
source /etc/profile
2.4 Tomcat 실행 테스트
Tomcat 시작:
[root@cafe24 src]# catalina.sh start
Using CATALINA_BASE: /home/APM/tomcat
Using CATALINA_HOME: /home/APM/tomcat
Using CATALINA_TMPDIR: /home/APM/tomcat/temp
Using JRE_HOME: /home/APM/java
Using CLASSPATH: /home/APM/tomcat/bin/bootstrap.jar:/home/APM/tomcat/bin/tomcat-juli.jar
프로세스 확인:
[root@cafe24 src]# ps -ef | grep tomcat
root 18066 1 26 13:05 pts/0 00:00:03 /home/APM/java/bin/java
-Djava.util.logging.config.file=/home/APM/tomcat/conf/logging.properties
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.endorsed.dirs=/home/APM/tomcat/endorsed
-classpath /home/APM/tomcat/bin/bootstrap.jar:/home/APM/tomcat/bin/tomcat-juli.jar
-Dcatalina.base=/home/APM/tomcat
-Dcatalina.home=/home/APM/tomcat
-Djava.io.tmpdir=/home/APM/tomcat/temp
org.apache.catalina.startup.Bootstrap start
웹 브라우저 접속 테스트:
http://서버IP:8080
Tomcat 기본 페이지가 표시되면 정상 설치된 것입니다.
Tomcat 중지:
[root@cafe24 src]# catalina.sh stop
Using CATALINA_BASE: /home/APM/tomcat
Using CATALINA_HOME: /home/APM/tomcat
Using CATALINA_TMPDIR: /home/APM/tomcat/temp
Using JRE_HOME: /home/APM/java
Using CLASSPATH: /home/APM/tomcat/bin/bootstrap.jar:/home/APM/tomcat/bin/tomcat-juli.jar
3. MySQL-Tomcat 연동
3.1 MySQL Connector/J 다운로드
다운로드 URL:
다운로드 파일:
mysql-connector-java-5.1.23.tar.gz
3.2 Connector 설치
[root@cafe24 src]# tar zxvf mysql-connector-java-5.1.23.tar.gz
[root@cafe24 src]# cd mysql-connector-java-5.1.23
[root@cafe24 mysql-connector-java-5.1.23]# cp -a mysql-connector-java-5.1.23-bin.jar /home/APM/tomcat/lib/
확인:
ls -l /home/APM/tomcat/lib/mysql-connector-java-5.1.23-bin.jar
4. Apache-Tomcat 연동 (mod_jk)
4.1 Tomcat Connector 다운로드
다운로드 URL:
다운로드 파일:
tomcat-connectors-1.2.31-src.tar.gz
4.2 mod_jk 컴파일
[root@cafe24 src]# tar zxvf tomcat-connectors-1.2.31-src.tar.gz
[root@cafe24 src]# cd tomcat-connectors-1.2.31-src/native
configure 실행:
[root@cafe24 native]# ./configure --with-apxs=/home/APM/apache/bin/apxs
checking for target platform... unix
no apache given
no netscape given
configure: creating ./config.status
config.status: creating Makefile
config.status: creating apache-1.3/Makefile
config.status: creating apache-1.3/Makefile.apxs
config.status: creating apache-2.0/Makefile
config.status: creating apache-2.0/Makefile.apxs
config.status: creating common/Makefile
config.status: creating common/list.mk
config.status: creating common/jk_types.h
config.status: creating jni/Makefile
config.status: creating common/config.h
config.status: executing depfiles commands
make 실행:
[root@cafe24 native]# make
# 컴파일 성공 확인
[root@cafe24 native]# echo $?
0
4.3 mod_jk.so 복사
[root@cafe24 native]# cd apache-2.0/
[root@cafe24 apache-2.0]# ls -l mod_jk.so
-rwxr-xr-x 1 root root 1071864 Feb 22 15:36 mod_jk.so
[root@cafe24 apache-2.0]# cp -a mod_jk.so /home/APM/apache/modules/
5. workers.properties 설정
5.1 workers.properties 파일 생성
vi /home/APM/apache/conf/workers.properties
5.2 설정 내용
# Worker 목록 정의
worker.list=worker1
# worker1 설정
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009
worker.worker1.lbfactor=1
설정 설명:
| 항목 | 설명 |
|---|---|
| worker.list | 사용할 worker 이름 목록 |
| type | worker 타입 (ajp13, ajp14, lb 등) |
| host | Tomcat 서버 호스트명 또는 IP |
| port | AJP 커넥터 포트 (기본 8009) |
| lbfactor | 로드 밸런싱 가중치 (1~100) |
5.3 로드 밸런싱 설정 (선택사항)
여러 Tomcat 인스턴스 사용 시:
# Worker 목록
worker.list=loadbalancer
# Worker1 설정
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009
worker.worker1.lbfactor=1
# Worker2 설정
worker.worker2.type=ajp13
worker.worker2.host=localhost
worker.worker2.port=8010
worker.worker2.lbfactor=1
# 로드 밸런서 설정
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=worker1,worker2
worker.loadbalancer.sticky_session=1
6. httpd.conf 설정
6.1 mod_jk 모듈 로드
/home/APM/apache/conf/httpd.conf 편집:
vi /home/APM/apache/conf/httpd.conf
LoadModule 섹션에 추가:
# Tomcat Connector Module
LoadModule jk_module modules/mod_jk.so
6.2 workers.properties 경로 지정
httpd.conf 하단에 추가:
# JK Module Configuration
<IfModule mod_jk.c>
JkWorkersFile /home/APM/apache/conf/workers.properties
JkLogFile /home/APM/apache/logs/mod_jk.log
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat "%w %V %T"
</IfModule>
설정 설명:
| 옵션 | 설명 |
|---|---|
| JkWorkersFile | workers.properties 파일 경로 |
| JkLogFile | mod_jk 로그 파일 경로 |
| JkLogLevel | 로그 레벨 (debug, info, warn, error) |
| JkLogStampFormat | 로그 타임스탬프 형식 |
| JkOptions | 추가 옵션 설정 |
| JkRequestLogFormat | 요청 로그 형식 |
6.3 JkMount 설정
JSP 및 Servlet 요청을 Tomcat으로 전달:
# JSP와 Servlet 요청을 worker1로 전달
JkMount /*.jsp worker1
JkMount /*.do worker1
JkMount /servlet/* worker1
# 특정 경로 전체를 Tomcat으로 전달
JkMount /app/* worker1
6.4 Directory Index 설정
index.jsp 추가:
<IfModule dir_module>
DirectoryIndex index.html index.htm index.php index.jsp
</IfModule>
6.5 전체 설정 예제
LoadModule jk_module modules/mod_jk.so
<IfModule mod_jk.c>
JkWorkersFile /home/APM/apache/conf/workers.properties
JkLogFile /home/APM/apache/logs/mod_jk.log
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat "%w %V %T"
# JSP/Servlet 요청 매핑
JkMount /*.jsp worker1
JkMount /*.do worker1
JkMount /servlet/* worker1
</IfModule>
<IfModule dir_module>
DirectoryIndex index.html index.htm index.php index.jsp
</IfModule>
7. Tomcat server.xml 설정
7.1 AJP 커넥터 활성화
/home/APM/tomcat/conf/server.xml 편집:
vi /home/APM/tomcat/conf/server.xml
AJP 커넥터 확인 (기본적으로 활성화되어 있음):
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
7.2 추가 설정 (선택사항)
성능 튜닝:
<Connector port="8009"
protocol="AJP/1.3"
redirectPort="8443"
maxThreads="200"
minSpareThreads="25"
maxSpareThreads="75"
enableLookups="false"
acceptCount="100"
connectionTimeout="20000"
disableUploadTimeout="true" />
8. 서비스 재시작
8.1 Apache 재시작
# Apache 정지
/home/APM/apache/bin/apachectl stop
# Apache 시작
/home/APM/apache/bin/apachectl start
# 또는 restart
/home/APM/apache/bin/apachectl restart
8.2 Tomcat 재시작
# Tomcat 정지
catalina.sh stop
# Tomcat 시작
catalina.sh start
# 또는 한 번에
catalina.sh stop && catalina.sh start
9. 연동 테스 트
9.1 테스트 JSP 파일 생성
/home/APM/apache/htdocs/test.jsp:
<%@ page contentType="text/html; charset=UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>Tomcat Test Page</title>
</head>
<body>
<h1>Apache + Tomcat Integration Test</h1>
<p>Server Time: <%= new java.util.Date() %></p>
<p>Session ID: <%= session.getId() %></p>
<p>Server Info: <%= application.getServerInfo() %></p>
<h2>System Properties</h2>
<ul>
<li>Java Version: <%= System.getProperty("java.version") %></li>
<li>OS Name: <%= System.getProperty("os.name") %></li>
<li>User Dir: <%= System.getProperty("user.dir") %></li>
</ul>
</body>
</html>
9.2 웹 브라우저 접속
http://서버IP/test.jsp
정상 작동 확인:
- 현재 서버 시간 표시
- 세션 ID 표시
- Java 버전 표시
- Tomcat 버전 정보 표시
9.3 로그 확인
mod_jk 로그:
tail -f /home/APM/apache/logs/mod_jk.log
Tomcat 로그:
tail -f /home/APM/tomcat/logs/catalina.out
10. MySQL 연동 테스트
10.1 테스트 JSP 파일
/home/APM/apache/htdocs/db_test.jsp:
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ page import="java.sql.*" %>
<!DOCTYPE html>
<html>
<head>
<title>MySQL Connection Test</title>
</head>
<body>
<h1>MySQL Connection Test</h1>
<%
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/mysql";
String user = "root";
String password = "your_password";
conn = DriverManager.getConnection(url, user, password);
out.println("<p>MySQL Connection: <strong style='color:green;'>SUCCESS</strong></p>");
stmt = conn.createStatement();
rs = stmt.executeQuery("SELECT VERSION() as version");
if (rs.next()) {
out.println("<p>MySQL Version: <strong>" + rs.getString("version") + "</strong></p>");
}
} catch (Exception e) {
out.println("<p>MySQL Connection: <strong style='color:red;'>FAILED</strong></p>");
out.println("<p>Error: " + e.getMessage() + "</p>");
} finally {
if (rs != null) try { rs.close(); } catch(Exception e) {}
if (stmt != null) try { stmt.close(); } catch(Exception e) {}
if (conn != null) try { conn.close(); } catch(Exception e) {}
}
%>
</body>
</html>
11. 자동 시작 스크립트
11.1 Tomcat 자동 시작 스크립트
/etc/init.d/tomcat 생성:
vi /etc/init.d/tomcat
스크립트 내용:
#!/bin/bash
#
# tomcat Startup script for Apache Tomcat
#
# chkconfig: 2345 85 15
# description: Apache Tomcat
export JAVA_HOME=/home/APM/java
export CATALINA_HOME=/home/APM/tomcat
case "$1" in
start)
echo "Starting Tomcat..."
$CATALINA_HOME/bin/startup.sh
;;
stop)
echo "Stopping Tomcat..."
$CATALINA_HOME/bin/shutdown.sh
;;
restart)
echo "Restarting Tomcat..."
$CATALINA_HOME/bin/shutdown.sh
sleep 3
$CATALINA_HOME/bin/startup.sh
;;
status)
ps -ef | grep tomcat | grep -v grep
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 1
;;
esac
exit 0
권한 설정 및 등록:
chmod +x /etc/init.d/tomcat
chkconfig --add tomcat
chkconfig tomcat on
사용법:
service tomcat start
service tomcat stop
service tomcat restart
service tomcat status
12. 문제 해결
mod_jk.so 로드 실패
오류:
Cannot load /home/APM/apache/modules/mod_jk.so into server
해결:
# mod_jk.so 파일 존재 확인
ls -l /home/APM/apache/modules/mod_jk.so
# 재컴파일
cd /path/to/tomcat-connectors-1.2.31-src/native
make clean
./configure --with-apxs=/home/APM/apache/bin/apxs
make
cp apache-2.0/mod_jk.so /home/APM/apache/modules/
JSP 페이지가 다운로드됨
원인:
- JkMount 설정 누락
- Tomcat이 실행되지 않음
해결:
# Tomcat 실행 확인
ps -ef | grep tomcat
# JkMount 설정 확인
grep "JkMount" /home/APM/apache/conf/httpd.conf
# Apache 재시작
/home/APM/apache/bin/apachectl restart
"Cannot find class" 오류
원인:
- MySQL Connector JAR 파일 누락
해결:
# Connector JAR 파일 확인
ls -l /home/APM/tomcat/lib/mysql-connector-java*.jar
# 누락 시 재설치
cp mysql-connector-java-5.1.23-bin.jar /home/APM/tomcat/lib/
# Tomcat 재시작
catalina.sh stop && catalina.sh start
AJP 연결 실패
오류:
ajp13 connecting to tomcat failed
해결:
# Tomcat AJP 포트 확인
netstat -an | grep 8009
# server.xml에서 AJP 커넥터 확인
grep -A 5 "AJP/1.3" /home/APM/tomcat/conf/server.xml
# workers.properties 포트 확인
grep "port" /home/APM/apache/conf/workers.properties
13. 성능 최적화
13.1 Tomcat JVM 옵션
/home/APM/tomcat/bin/setenv.sh 생성:
#!/bin/sh
JAVA_OPTS="-Djava.awt.headless=true"
JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8"
JAVA_OPTS="$JAVA_OPTS -server"
JAVA_OPTS="$JAVA_OPTS -Xms512m"
JAVA_OPTS="$JAVA_OPTS -Xmx1024m"
JAVA_OPTS="$JAVA_OPTS -XX:NewSize=256m"
JAVA_OPTS="$JAVA_OPTS -XX:MaxNewSize=256m"
JAVA_OPTS="$JAVA_OPTS -XX:PermSize=256m"
JAVA_OPTS="$JAVA_OPTS -XX:MaxPermSize=256m"
JAVA_OPTS="$JAVA_OPTS -XX:+DisableExplicitGC"
export JAVA_OPTS
권한 설정:
chmod +x /home/APM/tomcat/bin/setenv.sh
13.2 mod_jk 설정 최적화
workers.properties:
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009
worker.worker1.lbfactor=1
worker.worker1.connection_pool_size=200
worker.worker1.connection_pool_minsize=25
worker.worker1.connection_pool_timeout=600
worker.worker1.socket_timeout=10
worker.worker1.socket_keepalive=1
worker.worker1.recycle_timeout=300
참고사항
- Tomcat은 80 포트를 직접 사용하지 않고 Apache를 통해 요청을 받습니다.
- AJP 프로토콜(port 8009)이 Apache와 Tomcat 간 통신에 사용됩니다.
- 정적 파일(HTML, CSS, JS, 이미지)은 Apache가 직접 처리하여 성능이 우수합니다.
- 동적 Java 컨텐츠(JSP, Servlet)만 Tomcat으로 전달됩니다.
- MySQL Connector JAR는 반드시 Tomcat의 lib 디렉토리에 있어야 합니다.
- JAVA_HOME 환경변수가 올바르게 설정되지 않으면 Tomcat이 실행되지 않습니다.
- 방화벽에서 8009 포트를 열 필요는 없습니다 (localhost 통신).
- 프로덕션 환경에서는 Tomcat Manager 접근 제한을 설정하세요.
- 최신 환경에서는 Tomcat 9 이상, OpenJDK 11 이상 사용을 권장합니다.