본문으로 건너뛰기

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으로 전달합니다.

설치환경

항목버전/경로
OSCentOS 5.x (64bit)
Apache2.2.34
PHP5.2.17
MySQL5.1.59
APM 설치 경로/home/APM
JDK7u15
JDK 설치 경로/home/APM/java
Tomcat7.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 다운로드:

다운로드 파일:

  • 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 이름 목록
typeworker 타입 (ajp13, ajp14, lb 등)
hostTomcat 서버 호스트명 또는 IP
portAJP 커넥터 포트 (기본 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>

설정 설명:

옵션설명
JkWorkersFileworkers.properties 파일 경로
JkLogFilemod_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 이상 사용을 권장합니다.