공공부하자개발 · 영어 학습 노트
리눅스
웹 서버Tomcat · Nginx 설치와 설정0/8 완료
  • 01Tomcat 설치
  • 02Tomcat server.xml 설정
  • 03Tomcat 인스턴스와 JVM 옵션
  • 04Tomcat 보안과 운영 점검
  • 05nginx 설치
  • 06nginx 리버스 프록시
  • 07nginx HTTPS
  • 08nginx 로드밸런싱과 운영
사이트 소개개인정보처리방침연락처
© 2026 공부하자
홈 › 웹 서버 › 01 / 8

Tomcat 설치

섹션 7진행 0 / 8
1왜 배우는가2핵심 원리3코드 예제4응용 변형 예제5자주 하는 실수 (Tip)6연습 문제7정리‹ 이전다음 ›

2. 핵심 원리

2.1 설치 방식 두 가지

RPM 설치는 관리가 쉽지만 버전을 배포판 저장소가 정합니다. tar.gz 설치는 버전을 직접 고르고 여러 버전을 나란히 둘 수 있어 실무에서 더 흔합니다.

방식 장점 단점
dnf(RPM) 설치·패치 자동화, 의존성 관리 버전 선택 제한
tar.gz 버전 자유, 다중 인스턴스 용이 업데이트를 직접 관리

이 레슨은 tar.gz 방식을 다룹니다. $BASE 아래 버전별 폴더를 두고 심볼릭 링크로 현재 버전을 가리키는 구조입니다.

2.2 반입 파일과 sha256 확인

폐쇄망에서는 tar.gz 를 인터넷 PC 에서 받아 sha256 값을 함께 적어 반입합니다. 서버에서 받은 파일의 sha256 을 다시 계산해 게시된 값과 같은지 비교합니다.

값이 다르면 전송 중 파일이 깨졌거나 다른 파일이 섞인 것이므로 설치를 진행하면 안 됩니다. sha256sum -c 로 한 번에 비교하거나, 두 값을 직접 비교하는 방식을 씁니다.

2.3 디렉터리 구조와 $BASE 설계

모든 경로를 변수 하나(BASE)에서 파생시키면 서버마다 설치 위치가 달라져도 스크립트는 그대로 씁니다. 이 레슨은 BASE="${BASE:-/app}" 를 기준으로 아래 구조를 만듭니다.

경로 용도
$BASE/jdk JDK 심볼릭 링크
$BASE/tomcat/apache-tomcat-X.Y.Z 버전별 설치 폴더
$BASE/tomcat/current 현재 버전 심볼릭 링크
$BASE/tomcat-inst/<이름> 인스턴스 폴더(03 레슨)
$BASE/logs 통합 로그 위치

2.4 JDK 연결과 JAVA_HOME

JDK 는 이 레슨보다 먼저 설치돼 있다고 가정합니다. $BASE/jdk 심볼릭 링크로 실제 JDK 경로를 가리켜 두면, JDK 버전을 올릴 때 링크만 바꾸면 됩니다.

setenv.sh 의 JAVA_HOME 이 이 링크를 가리키므로 Tomcat 설정 파일은 JDK 버전 문자열을 몰라도 됩니다. 버전이 올라가도 설정을 고칠 필요가 없습니다.

2.5 전용 계정과 로그인 차단

Tomcat 프로세스를 root 로 띄우면 웹 애플리케이션 취약점이 서버 전체 권한으로 이어집니다. 로그인이 불가능한 시스템 계정(tomcat)으로 실행해 피해 범위를 좁힙니다.

useradd --system --no-create-home --shell /sbin/nologin tomcat 이 표준 패턴입니다. 홈 디렉터리와 로그인 셸이 없어 사람이 이 계정으로 직접 접속할 수 없습니다.

2.6 tar.gz 풀기와 current 심볼릭 링크

버전 폴더(apache-tomcat-10.1.30)에 직접 풀고, current 심볼릭 링크가 그 폴더를 가리키게 합니다. systemd 유닛과 배포 스크립트는 전부 current 를 통해서만 경로를 참조합니다.

새 버전을 올릴 때는 새 폴더에 풀고 링크만 바꾸면 됩니다. 이전 버전 폴더가 그대로 남아 있어 문제가 생기면 링크를 되돌리는 것만으로 롤백됩니다.

2.7 폴더 소유권과 쓰기 권한 분리

conf 는 설정 실수·변조를 막기 위해 쓰기 권한을 빼고, logs·temp·work 는 실행 중 계속 쓰기 때문에 tomcat 계정에 쓰기 권한을 남깁니다.

폴더 권한 이유
conf 쓰기 제거 설정 변조 방지
logs 쓰기 허용 로그 기록
temp·work 쓰기 허용 세션·JSP 컴파일 산출물
webapps 배포 계정만 쓰기 04 레슨에서 다룸

소유자 변경(chown)과 권한 변경(chmod)은 실제 서버의 tomcat 계정과 권한 모델이 있어야 뜻이 있어, 이 레슨의 스크립트에서는 명령만 보여줍니다.

2.8 setenv.sh 최소 구성

bin/setenv.sh 는 Tomcat 이 시작할 때 자동으로 읽는 파일로, catalina.sh 를 고치지 않고 환경변수를 얹을 수 있습니다. 이 레슨에서는 JAVA_HOME 과 CATALINA_PID 만 넣어 최소로 둡니다.

GC·힙 크기 같은 JVM 옵션은 03 레슨(인스턴스와 JVM 옵션)에서 다룹니다. 여기서는 설치 직후 기동에 필요한 최소값만 잡습니다.

2.9 systemd 유닛 구조

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 유닛을 다룹니다. 두 방식을 한 서버에 섞으면 안 됩니다.

2.10 firewall-cmd 포트 개방

RHEL 은 기본 방화벽(firewalld)이 켜져 있어 포트를 열지 않으면 서비스가 떠 있어도 밖에서 접속할 수 없습니다. --permanent 로 설정을 저장하고 --reload 로 적용합니다.

--permanent 없이 열면 재부팅 시 규칙이 사라집니다. 두 명령을 항상 짝으로 씁니다.

2.11 기동 확인

systemctl enable --now tomcat 은 부팅 시 자동 시작 등록과 즉시 시작을 한 번에 합니다. curl 로 응답 코드를 확인해 실제로 요청을 받는지까지 봅니다.

포트만 열려 있고 애플리케이션이 죽어 있는 경우도 있어, 프로세스 상태(systemctl status)와 curl 응답을 함께 확인하는 습관이 필요합니다.

2.12 버전 업그레이드와 롤백

새 버전을 별도 폴더에 설치하고 current 링크만 바꾸는 방식은, 기존 버전이 그대로 남아 있어 되돌리기가 링크 전환 한 번으로 끝납니다. 파일을 덮어쓰는 방식보다 항상 안전합니다.

업그레이드 순서는 새 버전 설치 → 설정 파일 이관 → current 전환 → systemctl restart 입니다. 문제가 생기면 링크를 이전 버전으로 되돌리고 다시 재시작합니다.

핵심 원리
  • 2.1 설치 방식 두 가지
  • 2.2 반입 파일과 sha256 확인
  • 2.3 디렉터리 구조와 $BASE 설계
  • 2.4 JDK 연결과 JAVA_HOME
  • 2.5 전용 계정과 로그인 차단
  • 2.6 tar.gz 풀기와 current 심볼릭 링크
  • 2.7 폴더 소유권과 쓰기 권한 분리
  • 2.8 setenv.sh 최소 구성
  • 2.9 systemd 유닛 구조
  • 2.10 firewall-cmd 포트 개방
  • 2.11 기동 확인
  • 2.12 버전 업그레이드와 롤백
이전 섹션1 왜 배우는가2 / 7다음 섹션3 코드 예제