RPM 설치는 관리가 쉽지만 버전을 배포판 저장소가 정합니다. tar.gz 설치는 버전을 직접 고르고 여러 버전을 나란히 둘 수 있어 실무에서 더 흔합니다.
| 방식 | 장점 | 단점 |
|---|---|---|
| dnf(RPM) | 설치·패치 자동화, 의존성 관리 | 버전 선택 제한 |
| tar.gz | 버전 자유, 다중 인스턴스 용이 | 업데이트를 직접 관리 |
이 레슨은 tar.gz 방식을 다룹니다. $BASE 아래 버전별 폴더를 두고 심볼릭 링크로 현재 버전을 가리키는 구조입니다.
폐쇄망에서는 tar.gz 를 인터넷 PC 에서 받아 sha256 값을 함께 적어 반입합니다. 서버에서 받은 파일의 sha256 을 다시 계산해 게시된 값과 같은지 비교합니다.
값이 다르면 전송 중 파일이 깨졌거나 다른 파일이 섞인 것이므로 설치를 진행하면 안 됩니다. sha256sum -c 로 한 번에 비교하거나, 두 값을 직접 비교하는 방식을 씁니다.
모든 경로를 변수 하나(BASE)에서 파생시키면 서버마다 설치 위치가 달라져도 스크립트는 그대로 씁니다. 이 레슨은 BASE="${BASE:-/app}" 를 기준으로 아래 구조를 만듭니다.
| 경로 | 용도 |
|---|---|
$BASE/jdk |
JDK 심볼릭 링크 |
$BASE/tomcat/apache-tomcat-X.Y.Z |
버전별 설치 폴더 |
$BASE/tomcat/current |
현재 버전 심볼릭 링크 |
$BASE/tomcat-inst/<이름> |
인스턴스 폴더(03 레슨) |
$BASE/logs |
통합 로그 위치 |
JDK 는 이 레슨보다 먼저 설치돼 있다고 가정합니다. $BASE/jdk 심볼릭 링크로 실제 JDK 경로를 가리켜 두면, JDK 버전을 올릴 때 링크만 바꾸면 됩니다.
setenv.sh 의 JAVA_HOME 이 이 링크를 가리키므로 Tomcat 설정 파일은 JDK 버전 문자열을 몰라도 됩니다. 버전이 올라가도 설정을 고칠 필요가 없습니다.
Tomcat 프로세스를 root 로 띄우면 웹 애플리케이션 취약점이 서버 전체 권한으로 이어집니다. 로그인이 불가능한 시스템 계정(tomcat)으로 실행해 피해 범위를 좁힙니다.
useradd --system --no-create-home --shell /sbin/nologin tomcat 이 표준 패턴입니다. 홈 디렉터리와 로그인 셸이 없어 사람이 이 계정으로 직접 접속할 수 없습니다.
버전 폴더(apache-tomcat-10.1.30)에 직접 풀고, current 심볼릭 링크가 그 폴더를 가리키게 합니다. systemd 유닛과 배포 스크립트는 전부 current 를 통해서만 경로를 참조합니다.
새 버전을 올릴 때는 새 폴더에 풀고 링크만 바꾸면 됩니다. 이전 버전 폴더가 그대로 남아 있어 문제가 생기면 링크를 되돌리는 것만으로 롤백됩니다.
conf 는 설정 실수·변조를 막기 위해 쓰기 권한을 빼고, logs·temp·work 는 실행 중 계속 쓰기 때문에 tomcat 계정에 쓰기 권한을 남깁니다.
| 폴더 | 권한 | 이유 |
|---|---|---|
conf |
쓰기 제거 | 설정 변조 방지 |
logs |
쓰기 허용 | 로그 기록 |
temp·work |
쓰기 허용 | 세션·JSP 컴파일 산출물 |
webapps |
배포 계정만 쓰기 | 04 레슨에서 다룸 |
소유자 변경(chown)과 권한 변경(chmod)은 실제 서버의 tomcat 계정과 권한 모델이 있어야 뜻이 있어, 이 레슨의 스크립트에서는 명령만 보여줍니다.
bin/setenv.sh 는 Tomcat 이 시작할 때 자동으로 읽는 파일로, catalina.sh 를 고치지 않고 환경변수를 얹을 수 있습니다. 이 레슨에서는 JAVA_HOME 과 CATALINA_PID 만 넣어 최소로 둡니다.
GC·힙 크기 같은 JVM 옵션은 03 레슨(인스턴스와 JVM 옵션)에서 다룹니다. 여기서는 설치 직후 기동에 필요한 최소값만 잡습니다.
Type=forking 은 startup.sh 가 실제 자바 프로세스를 자식으로 띄우고 자신은 바로 끝나는 구조에 맞는 타입입니다. systemd 는 PIDFile 에 적힌 pid 로 실제 프로세스를 추적합니다.
| 키 | 의미 |
|---|---|
Type=forking |
시작 스크립트가 먼저 끝나고 자식이 남는 방식 |
PIDFile |
추적할 pid 파일 경로 |
ExecStart·ExecStop |
current 를 통한 시작·정지 스크립트 |
Restart=on-failure |
비정상 종료 시 자동 재시작 |
리눅스 운영 05 는 catalina.sh run 을 쓰는 Type=simple 유닛을 다뤘습니다. 이 레슨은 startup.sh·shutdown.sh 와 PIDFile 을 쓰는 전통적인 Type=forking 유닛을 다룹니다. 두 방식을 한 서버에 섞으면 안 됩니다.
RHEL 은 기본 방화벽(firewalld)이 켜져 있어 포트를 열지 않으면 서비스가 떠 있어도 밖에서 접속할 수 없습니다. --permanent 로 설정을 저장하고 --reload 로 적용합니다.
--permanent 없이 열면 재부팅 시 규칙이 사라집니다. 두 명령을 항상 짝으로 씁니다.
systemctl enable --now tomcat 은 부팅 시 자동 시작 등록과 즉시 시작을 한 번에 합니다. curl 로 응답 코드를 확인해 실제로 요청을 받는지까지 봅니다.
포트만 열려 있고 애플리케이션이 죽어 있는 경우도 있어, 프로세스 상태(systemctl status)와 curl 응답을 함께 확인하는 습관이 필요합니다.
새 버전을 별도 폴더에 설치하고 current 링크만 바꾸는 방식은, 기존 버전이 그대로 남아 있어 되돌리기가 링크 전환 한 번으로 끝납니다. 파일을 덮어쓰는 방식보다 항상 안전합니다.
업그레이드 순서는 새 버전 설치 → 설정 파일 이관 → current 전환 → systemctl restart 입니다. 문제가 생기면 링크를 이전 버전으로 되돌리고 다시 재시작합니다.