회사 서버를 관리하다 보면 Tomcat 성능이 왜 이래? 싶은 순간들이 꼭 한 번씩 찾아옵니다. 특히 실무에서 트래픽이 몰릴 때마다 서버가 버벅거린다면, Tomcat 설정을 의심해볼 필요가 있죠. 저도 초창기엔 기본값 그대로 쓰다가 서버가 죽는 바람에 고객 클레임을 한가득 받은 적이 있었어요. 그때부터 설정값 하나하나가 얼마나 중요한지 뼈저리게 느꼈답니다. 오늘은 Tomcat WAS에서 꼭 짚고 넘어가야 할 중요한 설정값들을 깔끔하게 정리해볼게요. 실전에서 바로 써먹을 수 있는 팁들도 함께 소개할 테니 끝까지 읽어주세요!
1. Connector 설정 (포트, maxThreads, connectionTimeout)
Tomcat의 server.xml
파일에 있는 Connector 설정은 클라이언트 요청을 받는 입구 역할을 하죠. 여기서 port
, maxThreads
, connectionTimeout
같은 값이 성능과 직결되기 때문에 매우 중요합니다. 특히 maxThreads는 동시에 처리 가능한 요청 수를 의미하므로, 트래픽이 많은 사이트에서는 반드시 조정해야 합니다. 너무 낮으면 대기 요청이 많아지고, 너무 높으면 CPU 리소스를 과도하게 소모할 수 있어요.
설정값 | 기능 | 추천 설정 |
---|---|---|
port | Tomcat이 요청을 받는 포트 | 기본 8080 유지 또는 보안상 다른 포트 |
maxThreads | 동시 요청 처리 최대 스레드 수 | 200~500 (서버 사양에 따라 조정) |
connectionTimeout | 연결 대기 시간(밀리초) | 20000 (기본값) 또는 10000 |
2. JVM 메모리 옵션 설정 (heap size, GC 정책)
Tomcat은 Java 기반으로 작동하기 때문에 JVM 설정도 매우 중요합니다. 특히 -Xms
, -Xmx
같은 Heap Size 설정은 성능에 큰 영향을 미치며, GC(Garbage Collection) 정책 설정은 메모리 회수 시점과 방식을 조절합니다. 서버의 메모리 사양과 애플리케이션 규모를 고려해 적절한 값을 설정해야 합니다.
최근에는 G1 GC가 널리 사용되며, -XX:+UseG1GC
옵션을 추가해 성능을 개선할 수 있습니다. 아래는 추천 설정 예시입니다:
JAVA_OPTS="-Xms1024m -Xmx2048m -XX:+UseG1GC"
3. Context 설정과 보안 옵션
Tomcat의 context.xml
파일에서는 애플리케이션 단위의 설정이 이루어집니다. 보안상 중요한 설정들이 포함되며, 잘못 설정하면 외부 침입의 위험이 생길 수 있어요. 예를 들어 <Context>
태그 내에 reloadable="true"
로 설정하면 개발 중에는 편하지만 운영환경에서는 성능 저하와 리소스 누수의 원인이 될 수 있습니다.
- 보안상
allowLinking="false"
유지 권장 - JNDI 데이터소스 설정 시 비밀번호 암호화 고려
- Web 접근 제어를 위한
<SecurityConstraint>
설정 병행
4. 스레드 풀 및 커넥션 풀 튜닝
고성능 웹 애플리케이션을 운영하려면 스레드 풀과 커넥션 풀의 최적화가 핵심입니다. Tomcat은 내부적으로 스레드 풀을 통해 요청을 처리하고, DB와의 통신은 커넥션 풀을 통해 이루어지죠. 이 값을 제대로 설정하지 않으면 서비스 지연 또는 DB 연결 에러가 빈번하게 발생합니다.
설정 항목 | 설명 | 권장 값 |
---|---|---|
maxThreads | 최대 요청 처리 스레드 수 | 200~1000 |
minSpareThreads | 대기 스레드 최소 수 | 25~50 |
maxConnections | 동시 접속 가능한 클라이언트 수 | 500~2000 |
5. 로그 설정과 분석 전략
운영 환경에서 로그는 문제 해결의 핵심 수단입니다. logging.properties
또는 log4j
를 활용해 로그 레벨과 파일 분리를 적절히 설정해야 하죠. 특히 액세스 로그, 애플리케이션 로그, GC 로그는 분리 저장하고 회전 정책까지 함께 적용해야 서버 디스크 사용량도 효율적으로 관리할 수 있습니다.
- 로그 레벨 설정: INFO, DEBUG, ERROR 필요에 따라 설정
- 로깅 백엔드: 기본 JUL보다 logback 또는 log4j2 추천
- 로그 파일 압축 및 주기적 삭제 설정 권장
6. 설정 시 자주 놓치는 체크리스트
Tomcat을 설정할 때 자주 간과하는 포인트들이 있습니다. 아래 리스트는 실무에서 자주 마주치는 실수와 놓치기 쉬운 항목을 정리한 것이니, 설정 시 한 번쯤 점검해보세요.
- Access log가 너무 많아 디스크 폭주
- 기본 포트(8080)를 외부에 그대로 노출
- context.xml에 불필요한 reloadable="true" 설정 유지
- JVM heap size 설정을 하지 않고 기본값 사용
- SSL 설정 누락으로 보안 미흡
- maxThreads 설정 없이 기본값으로 운영
자주 묻는 질문 (FAQ)
Tomcat의 maxThreads를 1000 이상으로 설정해도 괜찮을까요?
서버의 CPU 코어 수와 메모리 여유를 고려해야 합니다. 무조건 높인다고 좋은 건 아니며, 오히려 과도한 스레드는 컨텍스트 스위칭 부담을 초래할 수 있어요.
GC 정책 중 G1GC 외에 어떤 옵션이 있나요?
CMS나 ZGC도 있지만, G1GC는 안정성과 성능에서 균형이 좋아 운영 환경에서 많이 사용됩니다. Java 11 이상에서는 G1GC가 기본으로 설정돼 있어요.
JNDI 데이터소스는 어디에서 설정하나요?
context.xml
또는 server.xml
에서 설정할 수 있으며, 보통은 META-INF/context.xml
내부에 설정합니다. 비밀번호는 평문 저장보다 암호화가 권장돼요.
Tomcat 설정 변경 후 서버 재시작은 필수인가요?
대부분의 설정 변경은 Tomcat 재시작이 필요합니다. 단, 일부 context 설정은 hot deploy가 가능하지만, 안정성을 위해 재시작을 권장합니다.
Access 로그를 저장하지 않으면 어떤 문제가 생기나요?
장애 분석이나 사용 패턴 확인이 어려워집니다. 로그는 가능한 저장하되, 회전(log rotation)과 보관 기간을 정해 관리하는 게 좋아요.
Tomcat에서 SSL 설정은 어떻게 하나요?
server.xml 파일 내 Connector 설정에 SSLEnabled="true"
를 추가하고, 키스토어 경로와 패스워드를 지정해줘야 합니다. Let's Encrypt를 통한 무료 인증서 사용도 가능합니다.
Tomcat 설정은 복잡하고 때론 어렵게 느껴질 수 있지만, 차근차근 핵심 포인트를 짚어가면 분명히 성능과 안정성 두 마리 토끼를 모두 잡을 수 있습니다. 오늘 공유한 설정 팁들이 여러분의 운영 환경에서 유용하게 활용되길 바라며, 혹시 더 궁금한 부분이 있다면 언제든 댓글로 소통해요. 실무에서의 작은 디테일이 큰 변화를 만든다는 거, 꼭 기억해 주세요!
댓글