Apache Tomcat 기초
Apache Tomcat의 구성요소, Connector, Context, 배포 구조, 로그와 JVM 옵션 확인 방법을 정리한다.
Tomcat이 요청을 받는 구간
Web Server / Reverse Proxy
-> Apache Tomcat
-> Java Web Application
Tomcat은 Java 웹 애플리케이션을 실행하는 WAS다. 앞단 Web Server가 요청을 넘기면 Tomcat의 Connector가 요청을 받고, 내부 Engine과 Host, Context를 거쳐 애플리케이션으로 전달한다.
핵심 역할
Apache Tomcat은 Servlet/JSP 기반 Java 웹 애플리케이션을 실행하는 Servlet Container다.
Apache HTTP Server와 다른 점
| 구분 | Apache HTTP Server | Apache Tomcat |
|---|---|---|
| 주 역할 | HTTP 요청 수신, 정적 파일, TLS, Reverse Proxy | Java 웹 애플리케이션 실행 |
| 대표 설정 | httpd.conf, VirtualHost, ProxyPass | server.xml, context.xml, web.xml |
| 대표 포트 | 80, 443 | 8080, 8009, 8005 |
| 로그 | access/error log | catalina log, application log, access log |
운영에서는 Apache HTTP Server나 Nginx가 앞단에 있고, Tomcat은 내부 포트에서만 열려 있는 구성이 흔하다.
Tomcat 구조
| 구성요소 | 역할 |
|---|---|
Server | Tomcat 전체 인스턴스 |
Service | Connector와 Engine을 묶는 단위 |
Connector | HTTP, AJP 같은 요청 수신 지점 |
Engine | 요청 처리 파이프라인 |
Host | 가상 호스트 |
Context | 웹 애플리케이션 단위 |
server.xml을 읽을 때는 Connector -> Engine -> Host -> Context 순서로 요청이 어디로 흘러가는지
상상하면서 보면 좋다.
CATALINA_HOME과 CATALINA_BASE
| 항목 | 의미 |
|---|---|
CATALINA_HOME | Tomcat 바이너리와 기본 라이브러리 위치 |
CATALINA_BASE | 인스턴스별 설정, 로그, webapps 위치 |
단일 서버에 Tomcat 인스턴스 하나만 있으면 둘이 같은 경로일 수 있다. 여러 인스턴스를 운영한다면
CATALINA_HOME은 공유하고, CATALINA_BASE를 인스턴스마다 분리하는 구성이 깔끔하다.
주요 파일
| 파일 | 역할 |
|---|---|
conf/server.xml | Connector, Engine, Host 설정 |
conf/context.xml | Context 공통 설정 |
conf/web.xml | 웹 애플리케이션 기본 설정 |
webapps/ | WAR 또는 압축 해제된 애플리케이션 배포 위치 |
logs/catalina.out | 표준 출력 로그 |
logs/localhost_access_log.*.txt | Tomcat 접근 로그 |
bin/setenv.sh | JVM 옵션과 환경변수 설정 |
운영에서 JVM 옵션을 확인할 때는 setenv.sh, systemd unit, 배포 스크립트가 어디서 값을 주입하는지
함께 확인한다.
Connector 예시
<Connector port="8080"
protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
HTTP Connector는 앞단 Web Server가 http://127.0.0.1:8080으로 넘길 때 주로 사용한다.
<Connector protocol="AJP/1.3"
address="127.0.0.1"
port="8009"
secretRequired="true"
secret="change-this-secret" />
AJP Connector는 mod_jk나 mod_proxy_ajp와 연동할 때 사용한다. 외부에 직접 노출하지 않고,
가능하면 loopback이나 내부망 주소로 제한한다.
Context와 배포
Context는 실제 웹 애플리케이션 단위다.
| 배포 형태 | 설명 |
|---|---|
webapps/app.war | WAR 파일 배포 |
webapps/app/ | WAR가 풀린 디렉터리 배포 |
conf/Catalina/localhost/app.xml | Context 파일로 배포 경로 지정 |
URL 경로 /app이 어떤 Context로 매핑되는지 확인해야 404 원인을 좁힐 수 있다. Web Server에서
/app을 Tomcat으로 넘기더라도 Tomcat에 해당 Context가 없으면 애플리케이션은 응답하지 못한다.
점검 명령
ps -ef | grep tomcat
systemctl status tomcat
ss -lntp | grep ':8080\|:8009'
curl -I http://127.0.0.1:8080/
tail -f $CATALINA_BASE/logs/catalina.out
jcmd <PID> VM.flags
서비스가 죽었는지, 포트가 열렸는지, Tomcat 자체 HTTP 응답이 있는지, 애플리케이션 예외가 있는지를 순서대로 본다.
관련 문서
관련 블로그 기록
- Tomcat Catalina.out 파일 용량 증가 문제 해결 — Tomcat 로그 파일 운영 사례
- WAS가 죽기 전에 로그 남기기 — JVM 장애 근거를 남기도록 구성한 사례
공식 문서
닫기 전 질문
- Tomcat은 직접 외부 요청을 받는가, 앞단 Web Server 뒤에 있는가?
- 요청은 HTTP Connector로 들어오는가, AJP Connector로 들어오는가?
- URL 경로는 어떤 Context에 매핑되는가?
- JVM 옵션과 로그 경로는 어디에서 설정되는가?