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 ServerApache Tomcat
주 역할HTTP 요청 수신, 정적 파일, TLS, Reverse ProxyJava 웹 애플리케이션 실행
대표 설정httpd.conf, VirtualHost, ProxyPassserver.xml, context.xml, web.xml
대표 포트80, 4438080, 8009, 8005
로그access/error logcatalina log, application log, access log

운영에서는 Apache HTTP Server나 Nginx가 앞단에 있고, Tomcat은 내부 포트에서만 열려 있는 구성이 흔하다.

Tomcat 구조

구성요소역할
ServerTomcat 전체 인스턴스
ServiceConnector와 Engine을 묶는 단위
ConnectorHTTP, AJP 같은 요청 수신 지점
Engine요청 처리 파이프라인
Host가상 호스트
Context웹 애플리케이션 단위

server.xml을 읽을 때는 Connector -> Engine -> Host -> Context 순서로 요청이 어디로 흘러가는지 상상하면서 보면 좋다.

CATALINA_HOME과 CATALINA_BASE

항목의미
CATALINA_HOMETomcat 바이너리와 기본 라이브러리 위치
CATALINA_BASE인스턴스별 설정, 로그, webapps 위치

단일 서버에 Tomcat 인스턴스 하나만 있으면 둘이 같은 경로일 수 있다. 여러 인스턴스를 운영한다면 CATALINA_HOME은 공유하고, CATALINA_BASE를 인스턴스마다 분리하는 구성이 깔끔하다.

주요 파일

파일역할
conf/server.xmlConnector, Engine, Host 설정
conf/context.xmlContext 공통 설정
conf/web.xml웹 애플리케이션 기본 설정
webapps/WAR 또는 압축 해제된 애플리케이션 배포 위치
logs/catalina.out표준 출력 로그
logs/localhost_access_log.*.txtTomcat 접근 로그
bin/setenv.shJVM 옵션과 환경변수 설정

운영에서 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_jkmod_proxy_ajp와 연동할 때 사용한다. 외부에 직접 노출하지 않고, 가능하면 loopback이나 내부망 주소로 제한한다.

Context와 배포

Context는 실제 웹 애플리케이션 단위다.

배포 형태설명
webapps/app.warWAR 파일 배포
webapps/app/WAR가 풀린 디렉터리 배포
conf/Catalina/localhost/app.xmlContext 파일로 배포 경로 지정

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은 직접 외부 요청을 받는가, 앞단 Web Server 뒤에 있는가?
  • 요청은 HTTP Connector로 들어오는가, AJP Connector로 들어오는가?
  • URL 경로는 어떤 Context에 매핑되는가?
  • JVM 옵션과 로그 경로는 어디에서 설정되는가?