삽질 피하기

[삽질 피하기] Spring Boot 서버 배포

ozofweird 2021. 3. 31. 15:32

1. Spring Boot 서버 배포

1) Amazon Linux 2 AMI 서버 설정

- Java 설치

sudo yum install -y java-1.8.0-openjdk-devel.x86_64
java -version

- NginX 설치

sudo amazon-linux-extras list | grep nginx
sudo amazon-linux-extras install -y nginx1

- Git 설치

sudo yum install -y git
git version
git clone [Git 저장소]

2) 배포 스크립트 (deploy.sh)

배포 스크립트에서 REPOSITORY와 PROJECT_NAME만 적절히 프로젝트에 맞게 설정해주면 된다.

#!/bin/bash

REPOSITORY=/home/ec2-user/
PROJECT_NAME=demo

cd $REPOSITORY/$PROJECT_NAME/

echo "> Git Pull"

git pull

echo "> 프로젝트 Build 시작"

./gradlew build

echo "> 레포지토리로 이동"

cd $REPOSITORY

echo "> Build 파일 복사"

cp $REPOSITORY/$PROJECT_NAME/build/libs/*.jar $REPOSITORY/

echo "> 현재 구동중인 애플리케이션 pid 확인"

CURRENT_PID=$(pgrep -f ${PROJECT_NAME}*.jar)

echo "현재 구동 중인 애플리케이션 pid: $CURRENT_PID"

if [ -z "$CURRENT_PID" ]; then
   echo "> 현재 구동 중인 애플리케이션이 없으므로 종료하지 않습니다."
else
   echo "> kill -15 $CURRENT_PID"
   kill -15 $CURRENT_PID
   sleep 5
fi

echo "> 새 애플리케이션 배포"

JAR_NAME=$(ls -tr $REPOSITORY/ | grep *.jar | tail -n 1)

echo "> JAR Name: $JAR_NAME"

nohup java -jar $REPOSITORY/$JAR_NAME 2>&1 &

이 후 배포 스크립트를 실행하기 위한 권한을 부여해주고, 실행해주면 된다.

sudo chmod +x deploy.sh
sudo ./deploy.sh

3) 서버 설정

직접 서버에 배포하는 경우, 배포 스크립트를 작성하면 수월하게 작업을 진행할 수 있다. 하지만 스크립트를 이용하여 배포를 수행하는 과정에서 다음과 같은 에러가 발생할 수 있다.

  • "There is insufficient memory for the Java Runtime Enviroment to continue"

 

이 문제는 jar를 구동할 때 메모리 부족으로 발생하는 에러이다. 이를 해결하기 위해서는 다양한 해결 방법이 존재한다.

  • 시스템의 메모리 로드 줄이기
  • 물리적 메모리 또는 Swap 공간 늘리기
  • Swap 백킹 저장소가 가득 차 있는지 확인
  • 64 비트 OS에서 64 비트 Java 사용
  • Java 힙 크기 줄이기 (-Xmx / -Xms)
  • Java 스레드 수 줄이기
  • Java 스레드 스택 크기 줄이기 (-Xss)
  • -XX:ReservedCodeCacheSize=를 사용하여 더 큰 코드 캐시 설정

 

이 중에서도 Swap 공간을 생성하여 해결하는 방법은 다음과 같다.

 

- Swap 이란?

파티션 하나에 전체 운영 체제를 두고 사용하는 윈도우와는 다르게 대부분의 리눅스 배포판은 Swap 파티션 설정을 권장한다. Swap은 쉽게 말하면 컴퓨터 메모리(RAM)이 흘러 넘칠 때의 댐 역할을 수행한다. 메모리가 완전히 가득 차면 추가적으로 실행되는 프로그램은 메모리가 아닌 Swap 파티션에서 실행된다. 즉, 메모리가 공간이 가득 차서 프로그램 실행이 가능하도록 예비 공간의 역할을 수행한다.

 

Swap 파티션을 사용하게 되면 그에 따른 장점과 단점이 생긴다.

  • 메모리가 완전히 다 찼을 때 보조 공간 제공
  • 빠른 속도의 메모리에서 더 많은 공간을 사용할 수 있도록 드물게 필요한 항목을 옮길수 있게 함
  • 최대 절전 기능을 사용할 수 있게 해줌
  • 동적으로 크기를 조정할 수 없어 하드디스크의 공간을 차지함
  • 하드디스크의 소모율을 높일 수 있음
  • 반드시 성능을 향상시켜주는 것은 아님

- 메모리 확인

free -h

- Swap 파일 생성 (2G)

sudo dd if=/dev/zero of=/swapfile bs=1024 count=2048000

※ JVM 기본 설정 최소 heap 사이즈인 1GB를 사용하며, 생성하는데 1분에서 2분 정도의 시간이 소요된다.

- Swap 파일 권한 설정

sudo chmod 600 /swapfile

- Swap 영역 설정

sudo mkswap /swapfile

- Swap 공간에 Swap 파일 추가

sudo swapon /swapfile
sudo swapon -s

- Swap 파일 활성화 설정

sudo vi /etc/fstab
#
UUID=90e29211-2de8-4967-b0fb-16f51a6e464c     /           xfs    defaults,noatime  1   1
/swapfile swap swap defaults 0 0

생성한 Swap 공간을 삭제하는 방법은 다음과 같다.

sudo swapoff /swapfile
sudo vi /etc/fstab (추가한 항목 삭제)
sudo rm /swapfile

4) nohup.out

nohup이란 리눅스에서 쉘스크립트파일을 데몬형태로 실행시키는 프로그램이다. 즉, 터미널 세션이 끊겨도 실행을 멈추지 않고 동작하도록 한다. 배포 스크립트를 통해 생성된 nohup.out 파일을 통해, 서버 동작을 확인할 수 있다.

728x90