#tomcat

[Tomcat] 주요 설정 파일(server.xml, web.xml) 완벽 분석 및 필수 튜닝 포인트

Apache Tomcat의 동작을 제어하는 핵심 설정 파일들은 모두 /conf 디렉토리에 위치합니다. 가장 중요한 server.xml(포트, 커넥터)과 web.xml(세션, MIME)의 역할과 자주 사용하는 설정 변경 가이드를 정리합니다.

1. 설정 파일 개요 (Configuration Overview)

Tomcat 설치 경로 내 conf 디렉토리에는 다음과 같은 주요 XML 파일들이 존재합니다.

파일명 주요 역할 및 설명
server.xml Tomcat의 메인 설정 파일입니다.
- HTTP/AJP 포트 설정
- 가상 호스트(Host) 및 Context 설정
- 쓰레드 풀(Thread Pool) 관리
web.xml 모든 웹 애플리케이션의 기본 속성을 정의합니다.
- 세션 타임아웃(Session Timeout) 설정
- MIME 타입 정의, 기본 서블릿 매핑
context.xml 웹 애플리케이션의 Context 설정을 담당합니다.
- JNDI 리소스(DB Connection Pool) 설정 시 주로 사용
tomcat-users.xml Tomcat Manager/Admin 페이지 접근 계정을 관리합니다.

2. server.xml 주요 설정 가이드

엔지니어가 가장 빈번하게 수정하는 파일입니다. 포트 충돌 해결이나 인코딩 처리를 위해 필수적으로 확인해야 합니다.

1) HTTP 포트 변경 및 인코딩 설정

기본 8080 포트를 80으로 변경하거나, 한글 깨짐 방지를 위해 URIEncoding을 설정합니다.

<!-- 기본 설정 -->
<Connector port="8080" protocol="HTTP/1.1" 
           connectionTimeout="20000" 
           redirectPort="8443" />

<!-- 튜닝 설정 예시 -->
<Connector port="80" protocol="HTTP/1.1" 
           connectionTimeout="20000" 
           redirectPort="8443"
           URIEncoding="UTF-8" />
Tip: GET 방식으로 넘어오는 파라미터의 한글이 깨진다면 URIEncoding="UTF-8" 속성이 누락되었을 가능성이 큽니다.

2) AJP 포트 설정 (웹 서버 연동 시)

Apache HTTP Server와 연동할 때 사용하는 AJP 프로토콜 포트입니다. 사용하지 않는다면 주석 처리하여 보안을 강화하는 것이 좋습니다.

<!-- 기본값 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

3. web.xml 주요 설정 가이드

모든 애플리케이션에 적용되는 전역(Global) 설정을 담당합니다.

1) 세션 타임아웃 (Session Timeout)

사용자 세션 만료 시간을 설정합니다. (단위: 분)

<session-config>
    <session-timeout>30</session-timeout>
</session-config>

2) 디렉토리 리스팅 비활성화 (보안)

특정 디렉토리 접근 시 파일 목록이 노출되는 것을 방지하기 위해 listings 값을 false로 설정해야 합니다.

<servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>0</param-value>
    </init-param>
    <init-param>
        <param-name>listings</param-name>
        <param-value>false</param-value> <!-- true면 파일 목록 노출됨 -->
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

4. tomcat-users.xml (Manager App)

http://localhost:8080/manager 페이지에 접속하여 GUI로 애플리케이션을 배포하거나 중지하려면 계정 설정이 필요합니다.

<tomcat-users>
  <!-- 역할 정의 -->
  <role rolename="manager-gui"/>
  <role rolename="admin-gui"/>
  
  <!-- 사용자 정의 -->
  <user username="admin" password="password" roles="manager-gui,admin-gui"/>
</tomcat-users>
주의: Manager App은 강력한 권한을 가지므로, 운영 환경에서는 외부 IP 접근을 차단하거나 해당 기능을 비활성화하는 것을 권장합니다.

Next Step:
설정 파일 수정 후에는 반드시 Tomcat을 재기동해야 적용됩니다. 다음 단계에서는 실제 운영 환경에서 성능을 최적화하기 위한 JVM 메모리 설정(Heap Size)과 GC 튜닝 방법에 대해 알아보겠습니다.

Open Stream →
#tomcat

[Tomcat] Windows 환경 Apache Tomcat 9 설치 및 디렉토리 구조 완벽 가이드

Windows 10 환경에서 Java 기반 웹 애플리케이션 서버인 Apache Tomcat 9을 설치하는 과정을 정리합니다. JDK 설치 확인부터 다운로드, 압축 해제, 그리고 주요 디렉토리(bin, conf, logs)의 역할과 구동 테스트까지 다룹니다.

0. 사전 준비 (Prerequisites)

Tomcat은 Java로 구동되므로 JDK(Java Development Kit)가 필수입니다. 설치 전 반드시 Java 환경 변수가 설정되어 있는지 확인해야 합니다.

Java 설치 확인

:: CMD 창에서 확인
java -version
javac -version
Check Point: 버전 정보가 출력되지 않는다면 JDK를 먼저 설치하고, 시스템 환경 변수(JAVA_HOME, PATH)를 설정해야 합니다. Tomcat은 실행 시 JAVA_HOME을 참조합니다.

1. 다운로드 및 설치 (Download & Install)

설치형(Installer)보다는 압축형(Zip)을 사용하는 것이 디렉토리 관리가 용이하고, 여러 버전을 동시에 관리하기 좋습니다.

다운로드

  • 공식 사이트: http://tomcat.apache.org/
  • 버전 선택: Tomcat 9 (Latest Stable) > Binary Distributions > Core: zip (64-bit/32-bit Windows)

설치 (압축 해제)

다운로드한 Zip 파일을 원하는 경로에 압축 해제하는 것만으로 설치는 끝납니다.

  • 설치 경로 예시: E:\APP\WAS\TOMCAT9

2. 주요 디렉토리 구조 (Directory Structure)

압축을 해제하면 다음과 같은 폴더 구조를 볼 수 있습니다. 각 폴더의 역할을 이해하는 것이 WAS 운영의 첫걸음입니다.

디렉토리 역할 및 주요 파일
/bin 서버 실행 및 종료 스크립트가 위치합니다.
- startup.bat: 서버 시작 (Windows)
- shutdown.bat: 서버 중지 (Windows)
- catalina.bat: 실행 환경 변수 및 옵션 설정
/conf 서버 전체 설정 파일이 위치합니다.
- server.xml: 포트(8080, 8009), 엔진 설정
- web.xml: 세션 타임아웃, MIME 타입 등 공통 설정
/lib Tomcat 구동에 필요한 라이브러리(Jar) 저장소 (JDBC 드라이버 등 포함)
/logs 서버 로그가 저장됩니다.
- catalina.yyyy-mm-dd.log: 엔진 로그
- localhost_access_log: 접속 로그
/webapps 웹 애플리케이션(WAR 파일)을 배포하는 기본 경로입니다.

3. 구동 및 검증 (Start & Verify)

설치가 제대로 되었는지 서버를 켜서 확인합니다.

서버 구동

:: bin 디렉토리로 이동
cd E:\APP\WAS\TOMCAT9\bin

:: 실행 스크립트 동작
startup.bat

새로운 CMD 창이 뜨면서 로그가 올라가고, 마지막에 Server startup in [xxx] ms 메시지가 보이면 구동 성공입니다.

접속 테스트

브라우저를 열고 http://localhost:8080 에 접속합니다. 고양이 그림이 있는 Tomcat 기본 페이지가 뜬다면 정상적으로 설치된 것입니다.


Next Step:
기본 설치가 완료되었습니다. 다음 포스팅에서는 server.xml을 수정하여 HTTP 포트를 변경하거나, 인코딩 설정을 추가하는 Tomcat 기본 설정 튜닝에 대해 알아보겠습니다.

Open Stream →
#apache

[Apache/Tomcat] 다중 도메인 구성을 위한 VirtualHost 및 AJP 포트 매핑 가이드

하나의 물리 서버에서 여러 도메인(예: 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 설정):
appBaseContext docBase 설정이 꼬일 경우 404 에러가 발생할 수 있습니다. 가장 확실한 방법은 docBase에 절대 경로를 명시하는 것입니다.
예: docBase="/WAS/apps/ccc"

5. 검증 및 테스트

  1. Tomcat 재기동: server.xml 수정 후 재기동.
    netstat -anotp | grep java 
    # 8009, 8010, 8011 포트가 모두 LISTEN 상태인지 확인
  2. Apache 재기동: 설정 적용.
    ./apachectl restart
  3. 브라우저 접속: 각 도메인으로 접속하여 서로 다른 페이지가 뜨는지 확인합니다.
Apache Tomcat VirtualHost mapping test result

[그림] 도메인별 연동 테스트 결과 화면

Open Stream →
#apache

[Apache/Tomcat] 웹 서버 연동 가이드: mod_jk (AJP) 설정 완벽 정리

Apache HTTP Server와 Tomcat을 연동(Interlink)하여 정적 컨텐츠 처리 성능을 높이고 부하 분산(Load Balancing) 환경을 구성합니다. 가장 널리 사용되는 mod_jk 모듈의 설치(컴파일)부터 workers.properties 설정까지의 전체 과정을 다룹니다.

0. 기본 개념 (Concepts)

  • mod_jk: Apache가 Tomcat과 통신하기 위해 사용하는 플러그인 모듈입니다.
  • AJP (Apache JServ Protocol): 웹 서버와 WAS 간의 효율적인 통신을 위해 최적화된 바이너리 프로토콜입니다. (Tomcat 기본 AJP 포트: 8009)

1. mod_jk 설치 (Compile)

mod_jk는 Apache 배포판에 기본 포함되어 있지 않으므로, 소스를 다운로드하여 컴파일해야 합니다. 이 과정에서 Apache의 확장 도구인 apxs가 필요합니다.

다운로드 및 압축 해제

최신 버전은 Tomcat Connectors 다운로드 페이지에서 확인 가능합니다.

# 1. 소스 다운로드 (버전은 시점에 따라 다를 수 있음)
wget http://apache.mirror.cdnetworks.com/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.41-src.tar.gz

# 2. 압축 해제
tar -zxvf tomcat-connectors-1.2.41-src.tar.gz

Configure 및 컴파일

native 디렉토리로 이동하여 컴파일을 수행합니다. 주의: --with-apxs 옵션에는 현재 설치된 Apache의 apxs 바이너리 절대 경로를 정확히 입력해야 합니다.

cd tomcat-connectors-1.2.41-src/native

# Apache 설치 경로에 맞춰 apxs 경로 지정 (/WAS/apache/bin/apxs)
./configure --with-apxs=/WAS/apache/bin/apxs

# 컴파일 및 설치
make && make install

설치 확인 (Verification)

설치가 완료되면 Apache의 modules 디렉토리에 mod_jk.so 파일이 생성되었는지 확인합니다.

ls -l /WAS/apache/modules/mod_jk.so

2. 워커 설정 (workers.properties)

Apache에게 "어떤 Tomcat 인스턴스와 통신할지" 알려주는 설정 파일입니다. 일반적으로 conf 디렉토리에 생성합니다.

파일 생성

vi /WAS/apache/conf/workers.properties

설정 내용 작성

# Tomcat 및 Java 경로 (환경에 맞게 수정)
workers.tomcat_home="/WAS/tomcat8"
workers.java_home="/usr/bin/java"
ps=/

# 워커 목록 정의 (콤마로 구분하여 다수 정의 가능)
worker.list=test1

# [test1] 워커 상세 설정
worker.test1.port=8009
worker.test1.host=localhost
worker.test1.type=ajp13
# worker.test1.lbfactor=1 (로드밸런싱 시 사용)
Note: worker.test1.port는 Tomcat의 server.xml<Connector protocol="AJP/1.3" ... /> 에 설정된 포트와 일치해야 합니다. (기본값: 8009)

3. Apache 설정 (httpd.conf)

마지막으로 Apache가 mod_jk 모듈을 로드하고, 특정 요청을 Tomcat(워커)으로 보내도록 설정합니다.

파일 수정

vi /WAS/apache/conf/httpd.conf

추가 내용

# 1. mod_jk 모듈 로드
LoadModule jk_module modules/mod_jk.so

<IfModule jk_module>
    # 2. 워커 설정 파일 위치 지정
    JkWorkersFile "conf/workers.properties"

    # 3. 로그 설정 (트러블슈팅을 위해 필수)
    JkLogFile "logs/mod_jk.log"
    JkLogLevel info
    JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
    JkRequestLogFormat "%w %V %T"
    
    # 4. URL 매핑 (JkMount)
    # /* : 모든 요청을 test1 워커(Tomcat)로 전달
    # 특정 확장자만 보내려면: JkMount *.jsp test1
    JkMount /* test1
</IfModule>

4. 기동 및 연동 테스트

설정이 완료되면 Apache와 Tomcat을 재기동합니다. 순서는 Tomcat 구동 -> Apache 구동 순서를 권장합니다.

설정 검증 (Syntax Check)

# Apache 설정 문법 검사
/WAS/apache/bin/apachectl -t
# "Syntax OK" 출력 확인

서비스 재기동

# Tomcat 재기동
/WAS/tomcat8/bin/shutdown.sh
/WAS/tomcat8/bin/startup.sh

# Apache 재기동
/WAS/apache/bin/apachectl restart

최종 확인

브라우저에서 Apache 포트(보통 80)로 접속했을 때, Tomcat의 페이지가 보인다면 연동에 성공한 것입니다.

Apache Tomcat 연동 성공 화면


Next Step:
연동에 성공했다면 정적 파일(이미지, CSS, JS)은 Apache가 처리하고, 동적 파일(JSP)만 Tomcat이 처리하도록 JkMountJkUnMount 설정을 튜닝하여 성능을 최적화해 보세요.

Open Stream →
#tomcat

[Tomcat] Linux 환경 Apache Tomcat 8.x 설치 및 구성 가이드 (Java, Firewall 설정 포함)

Apache Tomcat은 전 세계적으로 가장 많이 사용되는 경량 웹 애플리케이션 서버(WAS)입니다. Java 기반의 서블릿 컨테이너이므로 JDK 설치가 선행되어야 합니다. 본 포스팅에서는 Linux(CentOS) 환경에서 Java 설치부터 Tomcat 구동, 그리고 방화벽 설정까지의 전체 과정을 다룹니다.

[Image of Apache Tomcat architecture]

1. 사전 준비: Java (JDK) 설치 확인

Tomcat은 Java로 작성된 애플리케이션이므로 서버에 JDK(Java Development Kit)가 설치되어 있어야 구동됩니다. 단순 JRE보다는 개발 및 디버깅 도구가 포함된 JDK 설치를 권장합니다.

설치 여부 확인

# Java 버전 확인
java -version

# 설치 경로 확인
which java

명령어 실행 시 버전 정보가 출력되지 않는다면 JDK를 설치해야 합니다.

JDK 설치 (yum 사용 시)

Oracle JDK는 라이선스 이슈가 있으므로, 오픈소스인 OpenJDK 설치를 권장합니다.

# OpenJDK 1.8 설치 예시
yum install -y java-1.8.0-openjdk-devel

# 설치 후 환경변수 확인 (필수)
# Tomcat은 JAVA_HOME 변수를 참조하므로 설정되어 있는지 확인합니다.
echo $JAVA_HOME
Note: JAVA_HOME 환경 변수가 설정되어 있지 않다면 /etc/profile 등에 경로를 등록해야 Tomcat이 정상적으로 실행됩니다.

2. Tomcat 설치 (Download & Install)

패키지 매니저(yum)로 설치할 수도 있지만, 실무에서는 버전 관리와 디렉토리 구조 커스터마이징을 위해 Binary Core(tar.gz)를 직접 다운로드하여 설치하는 방식을 선호합니다.

다운로드 및 압축 해제

최신 버전은 Apache Tomcat 공식 사이트에서 확인 가능합니다.

# 1. 설치 파일 다운로드 (wget)
# (링크는 버전에 따라 달라질 수 있으니 공식 사이트 참조)
wget http://archive.apache.org/dist/tomcat/tomcat-8/v8.0.27/bin/apache-tomcat-8.0.27.tar.gz

# 2. 압축 해제
tar -zxvf apache-tomcat-8.0.27.tar.gz

# 3. 디렉토리 이동 및 정리 (관리 편의성)
# /WAS 디렉토리 하위로 이동하여 관리하는 것을 가정합니다.
mv apache-tomcat-8.0.27 /WAS/tomcat8

3. Tomcat 구동 및 로그 확인

Tomcat의 실행 스크립트는 bin 디렉토리에 위치합니다.

서비스 기동

cd /WAS/tomcat8/bin

# 실행 스크립트
./startup.sh

구동 로그 확인 (중요)

startup.sh를 실행했다고 해서 무조건 성공한 것은 아닙니다. 반드시 로그 파일(catalina.out)을 열어 에러 없이 "Server startup in [xxxx] ms" 메시지가 뜨는지 확인해야 합니다.

# 실시간 로그 확인
tail -f /WAS/tomcat8/logs/catalina.out

4. 방화벽 설정 및 접속 테스트

Tomcat이 정상 구동되었더라도 외부에서 접속이 안 된다면 방화벽(Firewall) 문제입니다. Tomcat의 기본 포트는 8080입니다.

포트 리슨 확인

# 8080 포트가 LISTEN 상태인지 확인
netstat -anotp | grep 8080

방화벽 오픈 (CentOS 7 이상)

# 8080 포트 영구 허용
firewall-cmd --permanent --zone=public --add-port=8080/tcp

# 방화벽 설정 재로드
firewall-cmd --reload

최종 접속 확인

브라우저 주소창에 http://[서버IP]:8080 을 입력합니다.

  • 성공: Apache Tomcat 고양이 로고가 그려진 기본 페이지가 출력됩니다.
  • 실패: "사이트에 연결할 수 없음"이 뜬다면 방화벽 설정이나 클라우드 보안 그룹(Security Group) 설정을 다시 확인하세요.

Next Step:
설치가 완료되었다면, 운영 환경에 맞춰 /WAS/tomcat8/conf/server.xml 파일에서 포트(Port)를 80으로 변경하거나, UTF-8 인코딩 설정을 추가하는 튜닝 작업을 진행해 보십시오.

Open Stream →