홈 › 리눅스 운영 › 04 / 13

자바 애플리케이션 배포

섹션 7진행 0 / 13

4. 응용 변형 예제

4.1 폐쇄망 반입과 체크섬

인터넷이 없는 서버에는 jar 를 USB 나 반입 서버로 옮깁니다. 옮기기 전후 체크섬을 비교해 손상을 확인합니다.

bash
sha256sum app.jar > app.jar.sha256          # 반출 측
sha256sum -c app.jar.sha256                 # 반입 측: app.jar: OK
scp app.jar app.jar.sha256 deploy@server:/tmp/

체크섬 파일을 jar 와 함께 옮기고, 배포 스크립트 첫 단계에서 -c 검사를 넣으면 잘린 파일로 배포하는 사고를 막습니다.

4.2 시작 확인 — 헬스 체크 대기

start 뒤 1초 생존 확인만으로는 부족합니다. Spring 이 뜨는 데 20~40초 걸리므로 헬스 URL 이 200 을 줄 때까지 기다립니다.

bash
for _ in $(seq 1 60); do
  curl -sf localhost:8080/actuator/health >/dev/null && { echo "healthy"; exit 0; }
  sleep 1
done
echo "60초 안에 안 뜸"; tail -n 20 logs/stdout.log; exit 1

curl -sf 는 실패 시 종료 코드만 돌려주고 출력은 없습니다. 06 네트워크 레슨에서 curl 옵션을 더 다룹니다.

4.3 두 인스턴스 무중단 교체

같은 서버에 8080·8081 두 인스턴스를 두고 앞단 nginx 가 분배하면, 하나씩 내려 교체하는 동안 서비스가 끊기지 않습니다.

bash
for port in 8081 8080; do
  APP_NAME=myapp-$port bash app.sh stop
  APP_NAME=myapp-$port JAVA_OPTS="$JAVA_OPTS --server.port=$port" bash app.sh start
  until curl -sf localhost:$port/actuator/health >/dev/null; do sleep 1; done
done

APP_NAME 을 바꾸면 pid 파일이 달라져 인스턴스가 구분됩니다. 실제로는 nginx 에서 해당 포트를 먼저 빼는 단계가 앞에 붙습니다.

4.4 JAR 안 정보 확인

서버에 있는 jar 가 어떤 버전인지 확인하는 방법입니다. 빌드 시 MANIFEST.MF 나 build-info.properties 에 버전이 들어갑니다.

bash
unzip -p current/app.jar META-INF/MANIFEST.MF | grep -i 'implementation-version'
unzip -p current/app.jar BOOT-INF/classes/META-INF/build-info.properties
unzip -l current/app.jar | grep -c '\.class
  

   # 클래스 수

unzip -p 는 파일을 풀지 않고 내용만 출력합니다. jar tf 도 목록을 보여 주지만 unzip 이 대부분 서버에 기본으로 있습니다.

4.5 JDK 여러 버전 관리

서버에 JDK 8 과 21 이 함께 있으면 앱마다 JAVA_HOME 을 다르게 줍니다. conf/env 에 적으면 스크립트가 그 JDK 를 씁니다.

bash
# /opt/myapp/conf/env
JAVA_HOME=/usr/lib/jvm/java-21-openjdk
JAVA_OPTS="-Xms1g -Xmx1g -Dspring.profiles.active=prod"

RHEL 에서 alternatives --config java 로 시스템 기본을 바꿀 수 있지만, 앱별 JAVA_HOME 이 다른 앱에 영향을 주지 않아 안전합니다.