톰캣이란?
Tomcat은 많은 Java 개발자들이 사용하고 있는 웹 어플리케이션 서버입니다.
Tomcat은 웹 어플리케이션이 동작하여 서버의 역할을 할 수 있도록 서블릿 컨테이너를 제공하며 서버 운영에 필요할 수 있는 여러 환경설정 기능을 지원합니다.
스프링 기반으로 생성한 어플리케이션은 기본적으로 별도의 톰캣 서버의 설치가 필요하며 서버의 실행을 위해서는 정해진 경로*에 운영할 웹 어플리케이션을 위치시킨 후 톰캣서버를 실행시켜야 합니다. 반면 스프링 부트는 기본적으로 톰캣서버를 내장하고 있으며 별다른 설정 없이 배포한 Jar 파일을 실행하여 웹서버를 구동할 수 있습니다.
스프링부트를 이용할 경우 내장톰켓을 통해 별다른 설정 없이 손쉽게 웹어플리케이션을 배포하고 서버를 운영할 수 있지만 아직 War 파일로 배포하고 외부 톰캣 환경을 사용하는 경우가 많기 때문에 톰캣의 환경 설정파일(server.xml), 특히 컨텍스트(Context) 설정,에 대해 알아보기 위해 본 포스트를 작성합니다.
Tomcat 프로그램 디렉토리 구조
톰캣을 사용하는데 필수적인 역할을 하는 폴더들은 다음과 같습니다.
- /bin - 톰캣의 시작, 정지 등의 기능을 다루는 파일들이 존재하며 파일의 형태는 운영체제에 따라 다름
(Unix 계열 - *.sh 파일, Windows - *.bat 파일) - /conf - 여러 설정파일들이 존재하며 server.xml 파일을 통해 톰캣 컨테이너의 주요 기능의 설정가능
- /logs - (default) 톰캣로그 생성 디렉토리
- /webapps - (default) 톰캣에서 구동하고자 하는 어플리케이션의 위치경로
어플리케이션 및 server.xml에서 설정을 통해 기본 디렉토리인 ${CATALINA_HOME}/logs, ${CATALINA_HOME}/webapps 외 다른 경로로 로그 디렉토리 및 앱베이스를 설정할 수 있습니다.
* CATALINA_HOME 이란?
'${CATALINA_HOME}' 은 톰캣의 '설치 디렉토리'가 위치한 경로를 의미한다. 톰캣 홈페이지에서 apache-tomcat-9.0.50 버전 파일을 받아 압축을 C:드라이브에 풀었다면 ${CATALINA_HOME} 은 'C:\apache-tomcat-9.0.50\' 와 같다.
server.xml
톰캣을 설치했을 때 설정되는 기본설정은 다음과 같습니다. (가독성을 위해 주석 제거)
<?xml version="1.0" encoding="UTF-8"?>
<Server shutdown="SHUTDOWN" port="8005">
<Listener className="org.apache.catalina.startup.VersionLoggerListener"/>
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on"/>
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/>
<GlobalNamingResources>
<Resource type="org.apache.catalina.UserDatabase" pathname="conf/tomcat-users.xml" name="UserDatabase" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" description="User database that can be updated and saved" auth="Container"/>
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="8080" redirectPort="8443" protocol="HTTP/1.1" connectionTimeout="20000"/>
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" unpackWARs="true" autoDeploy="true" appBase="webapps">
<Valve className="org.apache.catalina.valves.AccessLogValve" suffix=".txt" prefix="localhost_access_log" pattern="%h %l %u %t "%r" %s %b" directory="logs"/>
<Context source="org.eclipse.jst.jee.server:j-web-phase2" reloadable="true" path="/j-web-phase2" docBase="C:\apache-tomcat-9.0.50\webapps\j-web-phase2">
<Resource type="javax.sql.DataSource" name="jdbc/myoracle" factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory" auth="Container" username="margin" url="jdbc:oracle:thin:@localhost:1521:xe" password="jack" maxTotal="20" maxIdle="10" driverClassName="oracle.jdbc.OracleDriver"/>
</Context>
<Context source="org.eclipse.jst.jee.server:test" reloadable="true" path="/test" docBase="C:\apache-tomcat-9.0.50\webapps\test"/>
</Host>
</Engine>
</Service>
</Server>
주요 설정 정보 특징
- Server : 톰캣 인스턴스를 나타내며 내부에 다수의 서비스를 설정할 수 있습니다.
(*만약, 한 서버에서 여러 개의 톰캣 인스턴스를 띄워 서비스를 관리한다면 해당 태그의 port 를 다르게 설정) - Service : 톰캣의 독립적 서비스 단위입니다.
- Connector : HTTP 통신과 AJP 통신을 위한 정보를 설정할 수 있습니다.
- Host : 가상 호스트를 설정하는 기능을 합니다. appBase 속성의 기본값으로 'webapps' 가 되어 있는데 해당 값을 다른 경로로 설정하여 application의 배포 위치를 변경할 수 있습니다. 즉, 해당 속성값을 설정하여 컨텍스트를 관리할 디렉토리 위치를 변경 가능합니다. war 파일이 unpack 되면서 생성되는 war파일과 동일한 이름의 디렉토리를
'context directory' 라고 합니다.
* [참고] Ubuntu (bionic, focal, jammy)에서 package로 tomcat9(9.0.16-3, 9.0.31-1, 9.0.58-1)를 설치한 뒤 server.xml에서 appBase 경로값을 변경하면 unpackWARs 속성값이 적용되지 않아 war 파일의 압축이 해제되지 않습니다. 의존성이 걸려있는 다른 패키지들이 설치되면서 설정값에 수정이 있는 것으로 보이는데 톰캣 홈페이지에서 직접 받아 톰캣 서버를 설정하면 정상적으로 처리됩니다. - Context : Host 에 배포된 어플리케이션을 나타내며 웹 도메인 뒤에 붙는 패스(Path)를 설정할 수 있습니다.
일반적으로 unpack 처리된 WAR 파일의 이름을 context path 로 가지며 path 속성값을 "/" 로 주어
루트 컨텍스트로 설정할 수 있습니다.
ROOT context path 설정
만약 톰캣을 통해 다수의 어플리케이션 서버를 구성할 경우 해당 서버를 어떻게 구분할까요?
일반적으로 context path를 통해 서버를 구분하는 것이 아니라 NginX 와 같은 웹서버를 통해 reverse proxy 서버 환경을 구성하여 요청한 도메인 정보에 매핑되는 서버 정보(port번호로 구분 가능)를 사용하는 것으로 알고 있습니다.
도메인 뒤에 붙는 context path는 Context 태그의 path 속성값을 "/" (또는 "")로 설정하고 docBase를 원하는 어플리케이션의 context directory 명으로 설정하여 해당 컨텍스트 루트 컨텍스트로 변경한다면 도메인 주소 뒤에 컨텍스트 패스가 붙지 않습니다.
...
<!-- Context configuration sample -->
<Context path="/" docBase="sample" reloadable="true" />
...
https://www3.ntu.edu.sg/home/ehchua/programming/howto/Tomcat_More.html
Advanced Tutorial on Tomcat 7
This article is meant for advanced programmers who is interested to know more about Tomcat; or using Tomcat for production. For novices, read "How to Install and Get Started with Tomcat". The authoritative source of information on Tomcat is the Tomcat's do
www3.ntu.edu.sg
https://tomcat.apache.org/tomcat-9.0-doc/introduction.html
Apache Tomcat 9 (9.0.73) - Introduction
Before you start using CATALINA_BASE, first consider and create the directory tree used by CATALINA_BASE. Note that if you do not create all the recommended directories, Tomcat creates the directories automatically. If it fails to create the necessary dire
tomcat.apache.org
https://thxwelchs.github.io/EmbeddedTomcat%EA%B3%BCTomcat%EC%9D%98%EC%B0%A8%EC%9D%B4/
Embedded Tomcat과 Tomcat의 차이
이번 포스팅에서는 내장톰캣과 설치형으로 사용하는 외장톰캣이 무엇이 다른지, 그리고 내장톰캣으로는 해결 할 수 없는것이 있는지 간단하게 알아보았습니다. 포스팅 내용을 작성하기 전 이
thxwelchs.github.io
'Server' 카테고리의 다른 글
대규모 서비스와 서비스의 규모 확장 전략 (2) | 2025.01.31 |
---|