톰캣(Apache Tomcat)은 설정 파일을 어떻게 관리하느냐에 따라 시스템 업데이트 생산성과 인프라 안정성이 완전히 달라집니다.
catalina.sh 원본을 수정하지 않고 setenv.sh를 별도로 운영하는 것은 업계 표준(Best Practice)입니다.
본 문서에서는 중요 설정 파일 일람, setenv 활용법 및 옵션 분리 이유, 그리고 최신 SSL 설정 방법까지 세분화하여 정리합니다.
톰캣의 conf/ 디렉터리에는 server.xml 외에도 각자의 명확한 역할을 가진 핵심 설정 파일들이 있습니다.
| 파일명 | 핵심 역할 | 중요 관리 포인트 (보안 및 운영) |
|---|---|---|
| 톰캣 서버 주 설정 파일 | • 서버의 포트, 커넥터, 엔진, 호스트 등 핵심 인프라 구조 정의 | |
| 전역 웹 애플리케이션 설정 | • 모든 웹 앱에 공통 적용되는 기본 서블릿, MIME 타입, 세션 정의 | |
| 웹 애플리케이션 컨텍스트 설정 | • 모든 웹 에셋이 공유하는 컨텍스트 환경 및 외부 리소스 정의 | |
| 톰캣 자체 로그 제어 | • 카탈리나, 로컬호스트 등 톰캣 엔진 내부 로그의 출력 방식 정의 | |
| 관리자 콘솔 권한 제어 | • 톰캣 매니저 GUI 접근 계정 및 역할(Role) 정의 |
** 실무 설계 패턴 (Spring 기반 처리 권장)**
전역web.xml과context.xml은 톰캣 컨테이너 전역 설정을 규정하지만, 현대의 Spring 및 Spring Boot 기반 프로젝트에서는 환경 독립성과 인프라 이식성을 극대화하기 위해 톰캣의 전역 설정 파일들을 거의 수정하지 않고 유지합니다.
즉,web.xml과context.xml의 주요 설정들은 주로 프로젝트 내부 Spring(또는 Spring Boot) 설정에서 처리하도록 세팅합니다. 구체적으로는 프로젝트 내부의WEB-INF/web.xml이나 스프링의Java Config(Configuration)클래스, 그리고 스프링 부트의application.yml설정을 통해 애플리케이션 내부 레벨에서 로컬 커넥션 풀(DataSource)과 자원 필터들을 선언하고 직접 제어하는 것이 표준 아키텍처 모델입니다.
톰캣의 구동 스크립트인 catalina.sh는 실행 시 시스템 내부에 setenv.sh 파일이 존재하는지 자동으로 체크하고, 있다면 이를 먼저 읽어 들여 환경 변수로 적용하도록 설계되어 있습니다.
# catalina.sh 내부의 실제 동작 로직 예시
if [ -r "$CATALINA_BASE/bin/setenv.sh" ]; then
. "$CATALINA_BASE/bin/setenv.sh"
fi이 방식을 권장하는 결정적인 이유는 유지보수와 버전 마이그레이션의 안정성 때문입니다. 톰캣 버전을 패치하거나 보안 업데이트를 위해 바이너리를 통째로 교체할 때, catalina.sh 내부에 커스텀 설정을 적어두었다면 덮어쓰기 과정에서 세팅이 증발하거나 업데이트가 꼬이게 됩니다. 반면 setenv.sh로 설정을 격리해 두면 톰캣 엔진 버전이 바뀌어도 이 파일 하나만 쏙 복사해 주면 되므로 인프라 관리가 극도로 안전해집니다.
tomcat/bin/setenv.sh)#!/bin/sh
# 1. 톰캣 구동 시에만 적용할 JVM 힙 메모리 및 가비지 컬렉터(G1GC) 옵션 지정
CATALINA_OPTS="-Xms2g -Xmx2g -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
# 2. 타임존 및 인코딩 공통 설정
CATALINA_OPTS="${CATALINA_OPTS} -Dfile.encoding=UTF-8 -Duser.timezone=Asia/Seoul"
# 3. 운영 환경을 위한 헤드리스 모드 (GUI 그래픽 미사용 설정)
CATALINA_OPTS="${CATALINA_OPTS} -Djava.awt.headless=true"
export CATALINA_OPTS톰캣(Tomcat 9.x / 10.x 이상)에서는 성능이 느린 전통적인 Java JSSE 방식 대신, 리눅스 자체 OpenSSL 엔진을 활용하여 압도적인 핸드셰이크 성능을 내는 HTTP/2 및 JSSE OpenSSL 인터페이스 설정을 표준으로 권장합니다.
인증서 발급 기관에서 전달받은 키 파일들을 톰캣 서버 내부의 특정 안전한 경로(예: conf/ssl/)에 업로드합니다.
server.crt (공개키 및 인증서 체인)server.key (개인키 / 비밀번호가 제거된 복호화 상태 권장)conf/server.xml)과거의 복잡한 SSL 설정 태그와 달리, 최신 버전 표준은 Certificate 하위 태그를 이용해 가독성 높게 명시합니다. 포트 8443 또는 443 커넥터를 찾아 아래 구조로 적용합니다.
<Connector port="443"
protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150"
SSLEnabled="true"
scheme="https"
secure="true">
<SSLHostConfig protocols="TLSv1.2+TLSv1.3"
ciphers="ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384">
<Certificate certificateFile="conf/ssl/server.crt"
certificateKeyFile="conf/ssl/server.key"
type="RSA" />
</SSLHostConfig>
</Connector>protocols="TLSv1.2+TLSv1.3": 보안 취약점이 발견되어 무력화된 구형 프로토콜(TLSv1.0, TLSv1.1)을 명시적으로 거부하고, 최신 보안 규격만 허용하도록 명시합니다.ciphers="...": 암호화 강도가 약한 취약한 알고리즘을 배제하고, 순방향 비밀성(Forward Secrecy)을 보장하는 고강도 GCM 계열의 암호화 스위트(Cipher Suite)만 매핑해 두는 것이 금융권 및 엔터프라이즈 보안 감사 통과의 필수 조건입니다.