Starting Tomcat and Learning Its Structure
한국어 원문으로 표시합니다.
목표
systemd 없이 Tomcat 을 기동·정지하고, 디렉터리 구조와 리슨 포트를 파악하고,
setenv.sh 로 JVM 옵션을 주입해 실제로 적용됐는지 프로세스에서 확인할 수 있게 됩니다.
왜 중요한가
SI 현장의 서버는 벤더가 준 tar.gz 를 풀어 쓰는 경우가 흔하고, 컨테이너 환경에는
systemd 가 없습니다. 그래서 catalina.sh 를 직접 다루는 능력이 기본기가 됩니다.
또 하나 — "프로세스는 떠 있는데 포트가 안 열린 상태"가 실제로 존재합니다.
포트 충돌이나 커넥터 초기화 실패 때 그렇습니다. 기동 확인을 프로세스가 아니라
로그와 포트로 하는 습관은 이 실습에서 몸에 붙습니다.
단계
/root/tc디렉터리를 만들고,java -version의 출력을/root/tc/java.txt에 저장합니다. (표준에러까지 포함해야 합니다.)/root/tc/layout.csv를 만듭니다. 첫 줄은dir,purpose.bin,conf,lib,logs,webapps,work,temp일곱 행이 있어야 하고purpose는 각각 8자 이상이어야 합니다./opt/tomcat/bin/catalina.sh start로 Tomcat 을 기동합니다.http://127.0.0.1:8080/이 HTTP 200 을 반환해야 합니다./opt/tomcat/logs/catalina.out에서 기동 소요 시간(밀리초)을 찾아 숫자만/root/tc/startup.txt에 저장합니다.- 현재 LISTEN 중인 포트 중 Tomcat 이 연 포트를 한 줄에 하나씩 오름차순으로
/root/tc/ports.txt에 저장합니다. /opt/tomcat/webapps/hello/index.html을 만들고 본문에LabHub문자열을 넣습니다.http://127.0.0.1:8080/hello/가 200 이고 본문에LabHub가 있어야 합니다.- Tomcat 을 정지했다가 다시 기동합니다.
(
catalina.sh stop 30 -force후catalina.sh start) 재기동 후에도http://127.0.0.1:8080/hello/가 200 이어야 합니다. /opt/tomcat/bin/setenv.sh를 만들고 아래 옵션을CATALINA_OPTS로 정의한 뒤 재기동합니다.-Xms256m -Xmx256m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/root/tc/dump/root/tc/dump디렉터리도 미리 만들어 두세요. 실행 중인 자바 프로세스의 인자에 이 옵션들이 실제로 보여야 통과합니다.
참고
java -version 2> /root/tc/java.txt— 버전 정보는 표준에러로 나갑니다.ss -ltn으로 LISTEN 포트를 봅니다.grep,awk -F:로 포트만 뽑으세요.- 실행 중 JVM 인자 확인:
ps -ef | grep java또는tr '\0' ' ' < /proc/<PID>/cmdline - 흔한 실수 1: 기동 직후 바로
curl해서 실패하는 것. 몇 초 기다리거나 재시도하세요. - 흔한 실수 2:
setenv.sh를 만들고 재기동하지 않아 옵션이 적용 안 되는 것. - 흔한 실수 3:
setenv.sh에CATALINA_OPTS=대신JAVA_OPTS=를 쓰는 것. 둘 다 동작하지만stop시에도 적용되는JAVA_OPTS와 달리CATALINA_OPTS는 기동에만 적용됩니다. 힙 옵션은CATALINA_OPTS가 맞습니다.
JDK 버전 확인
/root/tc 디렉터리를 만들고, java -version 의 출력을 /root/tc/java.txt 에 저장합니다.
(표준에러까지 포함해야 합니다.)
java -version 은 출력이 표준에러로 나갑니다. 파일로 저장하려면 리다이렉션에 주의하세요.
디렉터리 역할 정리
/root/tc/layout.csv 를 만듭니다. 첫 줄은 dir,purpose.
bin, conf, lib, logs, webapps, work, temp 일곱 행이 있어야 하고
purpose 는 각각 8자 이상이어야 합니다.
각 디렉터리가 무엇을 담는지 한 줄로 적습니다. work 와 temp 의 차이, lib 와 webapps/*/WEB-INF/lib 의 차이를 구분해 보세요.
Tomcat 기동
/opt/tomcat/bin/catalina.sh start 로 Tomcat 을 기동합니다.
http://127.0.0.1:8080/ 이 HTTP 200 을 반환해야 합니다.
systemctl 은 이 환경에 없습니다. bin 아래의 기동 스크립트를 직접 실행하세요. 기동은 비동기라 바로 curl 하면 실패할 수 있습니다.
기동 소요 시간 확인
/opt/tomcat/logs/catalina.out 에서 기동 소요 시간(밀리초)을 찾아
숫자만 /root/tc/startup.txt 에 저장합니다.
catalina.out 에 'Server startup in [N] milliseconds' 형태의 줄이 남습니다. 숫자만 뽑아야 하니 grep 뒤에 sed 나 awk 를 붙이세요.
리슨 포트 확인
현재 LISTEN 중인 포트 중 Tomcat 이 연 포트를 한 줄에 하나씩 오름차순으로
/root/tc/ports.txt 에 저장합니다.
ss -ltn 으로 현재 LISTEN 상태인 포트를 봅니다. 서비스 포트 말고 하나가 더 열려 있을 텐데, 그것이 무엇인지가 이 단계의 핵심입니다.
정적 컨텍스트 배포
/opt/tomcat/webapps/hello/index.html 을 만들고 본문에 LabHub 문자열을 넣습니다.
http://127.0.0.1:8080/hello/ 가 200 이고 본문에 LabHub 가 있어야 합니다.
webapps 아래에 디렉터리를 만들면 그 이름이 컨텍스트 경로가 됩니다. WAR 없이도 배포가 됩니다.
정지 후 재기동
Tomcat 을 정지했다가 다시 기동합니다.
(catalina.sh stop 30 -force 후 catalina.sh start)
재기동 후에도 http://127.0.0.1:8080/hello/ 가 200 이어야 합니다.
정지 스크립트에 대기 시간과 -force 를 주는 습관을 들이세요. 재기동이 실제로 일어났는지는 catalina.out 의 기동 로그 개수로 확인할 수 있습니다.
setenv.sh 로 JVM 옵션 주입
/opt/tomcat/bin/setenv.sh 를 만들고 아래 옵션을 CATALINA_OPTS 로 정의한 뒤
재기동합니다.
-Xms256m -Xmx256m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/root/tc/dump
/root/tc/dump 디렉터리도 미리 만들어 두세요.
실행 중인 자바 프로세스의 인자에 이 옵션들이 실제로 보여야 통과합니다.
catalina.sh 를 직접 고치면 톰캣 업그레이드 때 사라집니다. bin/setenv.sh 를 만들어 CATALINA_OPTS 를 정의하고, 반영되려면 재기동이 필요합니다. 실제 반영 여부는 프로세스의 실행 인자로 확인하세요.