Tomcat 설치와 초기 환경 구성
Apache Tomcat은 Java 서블릿과 JSP를 실행하는 대표적인 WAS(Web Application Server)입니다. 이 챕터에서는 JDK 환경 구성부터 Tomcat 버전별 차이, 설치 후 디렉터리 구조까지 실무에서 필요한 모든 내용을 다룹니다.
JDK 환경 구성
Tomcat은 Java 런타임이 필수입니다. 버전에 따라 요구하는 Java 최소 버전이 다릅니다.
| Tomcat 버전 | Java 최소 버전 | 서블릿 스펙 | JSP 스펙 | 권장 여부 |
|---|---|---|---|---|
| Tomcat 9 | Java 8+ | 4.0 | 2.3 | 레거시 시스템 |
| Tomcat 10 | Java 11+ | 5.0 | 3.0 | Jakarta EE 마이그레이션 |
| Tomcat 10.1 | Java 11+ | 6.0 | 3.1 | ** 권장 (안정)** |
| Tomcat 11 | Java 17+ | 6.1 | 4.0 | 최신 기능 |
중요: Tomcat 10부터
javax.*패키지가jakarta.*로 변경되었습니다. Tomcat 9 → 10 마이그레이션 시 코드 수정이 필요합니다.
Ubuntu — OpenJDK 설치
# OpenJDK 17 LTS 설치 (Tomcat 10.1+ 권장)
sudo apt update
sudo apt install -y openjdk-17-jdk
# 버전 확인
java -version
# openjdk version "17.0.x" ...
# JAVA_HOME 설정 (영구 적용)
echo 'export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64' | sudo tee -a /etc/environment
echo 'export PATH=$PATH:$JAVA_HOME/bin' | sudo tee -a /etc/environment
source /etc/environment
echo $JAVA_HOME
# /usr/lib/jvm/java-17-openjdk-amd64
CentOS/RHEL — OpenJDK 설치
# OpenJDK 17 설치
sudo dnf install -y java-17-openjdk-devel
# JAVA_HOME 확인
alternatives --list | grep java
# /usr/lib/jvm/java-17-openjdk-17.x.x/bin/java
# /etc/profile.d/java.sh 생성
cat << 'EOF' | sudo tee /etc/profile.d/java.sh
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
export PATH=$PATH:$JAVA_HOME/bin
EOF
source /etc/profile.d/java.sh
Ubuntu/Debian에서 Tomcat 설치
방법 1: APT 패키지 관리자 (빠른 설치)
sudo apt update
sudo apt install -y tomcat10
# 서비스 상태 확인
sudo systemctl status tomcat10
sudo systemctl enable tomcat10
sudo systemctl start tomcat10
# 기본 포트 8080에서 동작 확인
curl -I http://localhost:8080
# HTTP/1.1 200
방법 2: 공식 배포판 직접 설치 (권장 — 버전 제어 가능)
# 설치 디렉터리 준비
sudo mkdir -p /opt/tomcat
# 전용 사용자 생성 (보안)
sudo useradd -r -m -U -d /opt/tomcat -s /bin/false tomcat
# 최신 Tomcat 10.1 다운로드
TOMCAT_VERSION=10.1.20
cd /tmp
wget https://dlcdn.apache.org/tomcat/tomcat-10/v${TOMCAT_VERSION}/bin/apache-tomcat-${TOMCAT_VERSION}.tar.gz
# 압축 해제
sudo tar -xzf apache-tomcat-${TOMCAT_VERSION}.tar.gz -C /opt/tomcat/
sudo ln -s /opt/tomcat/apache-tomcat-${TOMCAT_VERSION} /opt/tomcat/latest
# 소유권 변경
sudo chown -R tomcat: /opt/tomcat/latest
sudo chmod +x /opt/tomcat/latest/bin/*.sh
# Systemd 서비스 등록
sudo tee /etc/systemd/system/tomcat.service << 'EOF'
[Unit]
Description=Apache Tomcat Web Application Container
After=network.target
[Service]
Type=forking
User=tomcat
Group=tomcat
Environment="JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64"
Environment="CATALINA_HOME=/opt/tomcat/latest"
Environment="CATALINA_BASE=/opt/tomcat/latest"
Environment="CATALINA_PID=/opt/tomcat/latest/temp/tomcat.pid"
Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"
ExecStart=/opt/tomcat/latest/bin/startup.sh
ExecStop=/opt/tomcat/latest/bin/shutdown.sh
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable tomcat
sudo systemctl start tomcat
sudo systemctl status tomcat
CentOS/RHEL에서 Tomcat 설치
# 설치 디렉터리 준비
sudo mkdir -p /opt/tomcat
# 전용 사용자 생성
sudo useradd -r -m -U -d /opt/tomcat -s /bin/false tomcat
# Tomcat 다운로드 및 설치
TOMCAT_VERSION=10.1.20
cd /tmp
wget https://dlcdn.apache.org/tomcat/tomcat-10/v${TOMCAT_VERSION}/bin/apache-tomcat-${TOMCAT_VERSION}.tar.gz
sudo tar -xzf apache-tomcat-${TOMCAT_VERSION}.tar.gz -C /opt/tomcat/
sudo ln -s /opt/tomcat/apache-tomcat-${TOMCAT_VERSION} /opt/tomcat/latest
sudo chown -R tomcat: /opt/tomcat/latest
# SELinux 정책 (CentOS 전용)
sudo chcon -R --type=bin_t /opt/tomcat/latest/bin/
sudo setsebool -P httpd_can_network_connect 1
# Systemd 서비스 등록 (Ubuntu와 동일)
# JAVA_HOME 경로만 CentOS 맞게 조정
sudo tee /etc/systemd/system/tomcat.service << 'EOF'
[Unit]
Description=Apache Tomcat Web Application Container
After=network.target
[Service]
Type=forking
User=tomcat
Group=tomcat
Environment="JAVA_HOME=/usr/lib/jvm/java-17-openjdk"
Environment="CATALINA_HOME=/opt/tomcat/latest"
Environment="CATALINA_BASE=/opt/tomcat/latest"
Environment="CATALINA_PID=/opt/tomcat/latest/temp/tomcat.pid"
Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"
ExecStart=/opt/tomcat/latest/bin/startup.sh
ExecStop=/opt/tomcat/latest/bin/shutdown.sh
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable tomcat
sudo systemctl start tomcat
Docker로 Tomcat 실행
개발 환경이나 컨테이너 기반 운영에서 빠르게 시작하는 방법입니다.
# Tomcat 10.1 + JDK 17 공식 이미지
docker run -d \
--name tomcat \
-p 8080:8080 \
tomcat:10.1-jdk17
# 기본 관리 페이지 활성화 (개발용)
docker exec -it tomcat bash -c \
"cp -r /usr/local/tomcat/webapps.dist/* /usr/local/tomcat/webapps/"
# http://localhost:8080 접속 확인
Docker Compose 예시
# docker-compose.yml
version: '3.8'
services:
tomcat:
image: tomcat:10.1-jdk17
container_name: tomcat-app
ports:
- "8080:8080"
volumes:
- ./webapps:/usr/local/tomcat/webapps
- ./conf/server.xml:/usr/local/tomcat/conf/server.xml:ro
- ./logs:/usr/local/tomcat/logs
environment:
- CATALINA_OPTS=-Xms512m -Xmx1024m
restart: unless-stopped
Tomcat 디렉터리 구조
설치 후 디렉터리 구조를 이해하면 설정 파일 위치를 빠르게 파악할 수 있습니다.
$CATALINA_HOME/
├── bin/ ← 실행 스크립트
│ ├── startup.sh # Tomcat 시작
│ ├── shutdown.sh # Tomcat 종료
│ ├── catalina.sh # 핵심 실행 스크립트 (startup.sh가 호출)
│ └── setenv.sh # JVM 옵션 설정 (없으면 직접 생성)
│
├── conf/ ← 설정 파일
│ ├── server.xml # 핵심 설정 (커넥터, 호스트, 컨텍스트)
│ ├── web.xml # 글로벌 서블릿 설정
│ ├── context.xml # 글로벌 컨텍스트 설정
│ ├── tomcat-users.xml # 관리자 계정 설정
│ └── logging.properties # 로그 설정
│
├── webapps/ ← 배포 디렉터리
│ ├── ROOT/ # http://host:8080/ 기본 앱
│ ├── manager/ # Tomcat 관리자 웹 앱
│ ├── host-manager/ # 가상 호스트 관리 웹 앱
│ └── myapp.war # WAR 파일 → 자동 압축 해제
│
├── logs/ ← 로그 파일
│ ├── catalina.out # 표준 출력 (메인 로그)
│ ├── catalina.YYYY-MM-DD.log # 일별 로그
│ ├── localhost.YYYY-MM-DD.log # 가상 호스트 로그
│ └── access_log.YYYY-MM-DD.txt # 접근 로그
│
├── lib/ ← 공유 라이브러리 (모든 앱 공통)
│ └── servlet-api.jar, jsp-api.jar, ...
│
├── temp/ ← 임시 파일 (JVM 임시 디렉터리)
└── work/ ← JSP 컴파일 캐시
└── Catalina/
└── localhost/
└── ROOT/ # JSP → Java → .class
setenv.sh — JVM 옵션 설정
Tomcat 시작 전 JVM 옵션을 주입하는 권장 방법입니다.
# $CATALINA_HOME/bin/setenv.sh 생성
cat << 'EOF' | sudo tee /opt/tomcat/latest/bin/setenv.sh
#!/bin/bash
# JVM 힙 메모리 설정
export CATALINA_OPTS="$CATALINA_OPTS -Xms512m -Xmx2g"
# GC 설정 (Java 17 기본 G1GC)
export CATALINA_OPTS="$CATALINA_OPTS -XX:+UseG1GC"
export CATALINA_OPTS="$CATALINA_OPTS -XX:MaxGCPauseMillis=200"
# GC 로그 (성능 분석용)
export CATALINA_OPTS="$CATALINA_OPTS -Xlog:gc*:file=/opt/tomcat/latest/logs/gc.log:time,uptime:filecount=5,filesize=20m"
# 서버 모드 활성화
export CATALINA_OPTS="$CATALINA_OPTS -server"
# 타임존 설정
export CATALINA_OPTS="$CATALINA_OPTS -Duser.timezone=Asia/Seoul"
# 인코딩 설정
export JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8"
EOF
sudo chmod +x /opt/tomcat/latest/bin/setenv.sh
sudo chown tomcat: /opt/tomcat/latest/bin/setenv.sh
서비스 관리 명령어
# 시작 / 중지 / 재시작 / 상태
sudo systemctl start tomcat
sudo systemctl stop tomcat
sudo systemctl restart tomcat
sudo systemctl status tomcat
# 로그 실시간 확인
sudo tail -f /opt/tomcat/latest/logs/catalina.out
# 설정 검증 (포트 충돌, 문법 오류 확인)
sudo -u tomcat /opt/tomcat/latest/bin/catalina.sh configtest
# 포트 사용 확인
sudo ss -tlnp | grep 8080
방화벽 설정
# Ubuntu/Debian (ufw)
sudo ufw allow 8080/tcp
sudo ufw reload
# CentOS/RHEL (firewalld)
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload
설치 확인
# Tomcat 버전 확인
/opt/tomcat/latest/bin/version.sh
# 출력 예시
# Server version: Apache Tomcat/10.1.20
# Server built: ...
# Server number: 10.1.20.0
# JVM Version: 17.0.x
# JVM Vendor: Eclipse Adoptium
# curl로 HTTP 응답 확인
curl -s -o /dev/null -w "%{http_code}" http://localhost:8080
# 200
Summary
| 항목 | 내용 |
|---|---|
| Tomcat 버전 | 10.1.x 권장 (Java 11+), 11.x (Java 17+) |
| Java 요구사항 | Tomcat 9: Java 8+, Tomcat 10+: Java 11+ |
| JVM 옵션 위치 | $CATALINA_HOME/bin/setenv.sh (권장) |
| 핵심 설정 파일 | conf/server.xml, conf/web.xml, conf/context.xml |
| 배포 디렉터리 | webapps/ (WAR 자동 압축 해제) |
| 서비스 관리 | systemctl start/stop/restart tomcat |