Apache Tomcat 웹 애플리케이션 서버(WAS)의 기본 설정 방법을 이야기 하고자 한다

 

Tomcat은 Java 서블릿을 실행하고 JSP(JavaServer Pages)를 렌더링하기 위한 오픈 소스 웹 서버 및 서블릿 컨테이너다

Tomcat이 이미 서버에 설치되어 있다는 가정하에 필요한 환경 설정을 단계별로 설명하겠다.

 

◎ 환경 변수 및 실행 경로 설정

■ ~/.bash_profile 설정

사용자가 로그인할 때 자동으로 로드되는 셸 초기화 파일로 Tomcat운영에 필요한 환경변수와 별칭(Alias)를 설정한다

# bashrc환경을 현재 환경에 load함(쉘 일관성)
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs
TEST_HOME=/data/test_ma

LANG=ko_KR.utf8
JAVA_HOME=$TEST_HOME/jdk1.8.0_202
TOMCAT_HOME=$TEST_HOME/apache-tomcat-9.0.73
PATH=$JAVA_HOME/bin:$PATH:$HOME/bin

export PATH JAVA_HOME LANG TEST_HOME TOMCAT_HOME

alias tombin='cd $TOMCAT_HOME/bin'
alias tomlog='tail -500f $TOMCAT_HOME/logs/catalina.out'
alias tomrestart='$TOMCAT_HOME/bin/restart.sh'

source ~/.bash_profile로 변경된 환경설정을 즉시 적용해주자.

TEST_HOME: 애플리케이션 기본 디렉토리 경로
LANG: 시스템 언어 설정 (한국어 UTF-8)
JAVA_HOME: JDK 설치 경로
TOMCAT_HOME: Tomcat 설치 경로
PATH: 실행 파일 검색 경로 (Java 실행 파일 포함)

tombin: Tomcat의 bin 디렉토리로 빠르게 이동
tomlog: Tomcat의 로그 파일을 실시간으로 확인 (마지막 500줄부터)
tomrestart: Tomcat 재시작 스크립트 실행

◎ Tomcat 서버 구성 설명

■ server.xml 설정

<Connector port="8001" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="9001" URIEncoding="utf-8" />
<!-- A "Connector" using the shared thread pool-->

<Context sessionCookieName="MARIA_JSESSIONID" 
 docBase="/data/test_ma/application" path="" />
Connector 설정:
port="8001": 웹 서버가 HTTP 요청을 수신할 포트 번호
protocol="HTTP/1.1": 사용할 HTTP 프로토콜 버전
connectionTimeout="20000": 연결 타임아웃(밀리초 단위, 20초)
redirectPort="9001": SSL 연결 시 리다이렉션할 포트
URIEncoding="utf-8": URL 인코딩에 사용할 문자셋 (한글 지원을 위해 중요)

Context 설정:
sessionCookieName="MARIA_JSESSIONID": 세션 쿠키 이름을 지정 (다중 애플리케이션 환경에서 세션 구분에 유용)
docBase="/data/test_ma/application": 웹 애플리케이션 위치 (소스 코드가 배포될 디렉토리)
path="": 컨텍스트 경로 (빈 값은 루트 컨텍스트임을 의미, URL에서 http://server:8001/ 로 직접 접근)

웹 애플리케이션 소스 코드를 Tomcat 설치 디렉토리와 분리하여 관리할 수 있게 해준다.

Tomcat 업그레이드 시 애플리케이션 코드를 보존하고, 소스 코드 관리를 더 효율적으로 할 수 있게 해준다.

 

■ Appbase와 Docbase 차이점(Tomcat 디렉토리 구조의 이해)

appbase docbase
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
    <!-- Context 요소들은 여기에 위치 -->
</Host>
<Context path="/myapp" docBase="/data/test_ma/application" />
기본값: webapps (Tomcat 설치 디렉토리 내의 webapps 폴더) Tomcat의 <Context> 요소에서 정의
특정 웹 애플리케이션의 루트 디렉토리를 지정
=웹 애플리케이션의 실제 위치를 가리키는 경로
상위 개념으로, 여러 웹 애플리케이션을 포함하는 컨테이너 디렉토리 하위 개념으로, 특정 웹 애플리케이션의 위치를 가리킴
- 업그레이드 용이성: Tomcat을 업그레이드할 때 애플리케이션 코드를 보존
코드 관리 단순화: 애플리케이션 소스 코드와 서버 설정을 분리하여 관리
백업 효율성: 애플리케이션 코드만 별도로 백업
개발 워크플로우 개선: 개발 환경에서 코드를 변경하고 서버를 다시 시작하지 않고도 변경 사항을 즉시 확인

appbase와 docbase를 잘 사용한다면 부분적인 MSA를 사용할 수 있다.

<Host name="localhost" appBase="webapps">
    <!-- 사용자 서비스 -->
    <Context path="/users" docBase="/data/services/user-service" />
    
    <!-- 상품 서비스 -->
    <Context path="/products" docBase="/data/services/product-service" />
    
    <!-- 주문 서비스 -->
    <Context path="/orders" docBase="/data/services/order-service" />
</Host>

■ JVM 및 성능 설정 을 위한 catalina.sh 설정

Tomcat의 시작, 정지 및 JVM 설정을 관리하는 스크립트

메모리 할당, 가비지 컬렉션, 인코딩 등 Java 런타임 옵션을 설정한다.

CATALINA_OPTS="-server -Djava.awt.headless=true -Xms1024m -Xmx2048m -Dfile.encoding=\"utf-8\""
SCOUTER_AGENT_USER="test_ma"
CATALINA_OPTS: Tomcat 실행 시 적용되는 Java 옵션
-server: 서버 모드로 JVM 실행 (최적의 성능을 위한 설정)
-Djava.awt.headless=true: 헤드리스 모드로 Java AWT 실행 (GUI 없는 서버 환경에 적합)
-Xms1024m: 초기 힙 메모리 크기 (1GB) / -Xmx2048m: 최대 힙 메모리 크기 (2GB)
-Dfile.encoding="utf-8": 파일 읽기/쓰기에 사용할 문자 인코딩 (UTF-8)

 

■ 데이터베이스 연결 설정

WEB-INF 디렉토리 내에 속성파일인 resource_db_properties에서 정의함

##############################################################
# MARIA DB
##############################################################
DB.DRIVER=org.mariadb.jdbc.Driver
DB.URL=jdbc:mariadb://1.1.1.1:3306/test_ma
DB.USERNAME=test_ma
DB.PASSWORD=test#123
DB.V_QUERY=SELECT now()
데이터베이스 드라이버: org.mariadb.jdbc.Driver
MariaDB 데이터베이스에 연결하기 위한 JDBC 드라이버 클래스
이 드라이버는 WEB-INF/lib 디렉토리에 JAR 파일로 포함되어야 함.

데이터베이스 연결 URL: jdbc:mariadb://1.1.1.1:3306/test_ma
1.1.1.1: 데이터베이스 서버 IP 주소
3306: MariaDB 기본 포트
test_ma: 사용할 데이터베이스 이름

인증정보: 
DB.USERNAME=test_ma: 데이터베이스 접속 사용자 이름
DB.PASSWORD=test#123: 데이터베이스 접속 비밀번호

검증 쿼리:
데이터베이스 연결 상태 확인에 사용되는 간단한 쿼리
커넥션 풀에서 연결을 가져올 때 유효성 검사에 활용

 

+ Recent posts